From 7ed4d2a409cb24e7beef850c6b90e47f0f6b71d2 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Sat, 9 Apr 2016 12:48:08 +0200 Subject: add support for nds32 architecture Verified on a FPGA board sponsored by Andes Technology. Signed-off-by: Waldemar Brodkorb --- toolchain/binutils/Makefile | 2 +- toolchain/binutils/patches/2.24/binutils.nds32 | 409259 ++++++++++++++++++++++ 2 files changed, 409260 insertions(+), 1 deletion(-) create mode 100644 toolchain/binutils/patches/2.24/binutils.nds32 (limited to 'toolchain/binutils') diff --git a/toolchain/binutils/Makefile b/toolchain/binutils/Makefile index 581dffe68..1000a1c03 100644 --- a/toolchain/binutils/Makefile +++ b/toolchain/binutils/Makefile @@ -66,7 +66,7 @@ $(WRKBUILD)/.compiled: $(WRKBUILD)/.configured $(WRKBUILD)/.installed: $(WRKBUILD)/.compiled $(MAKE) -C $(WRKBUILD) install -ifeq ($(ADK_TARGET_ARCH_H8300),y) +ifeq ($(ADK_TARGET_ARCH_H8300)$(ADK_TARGET_ARCH_NDS32),y) $(INSTALL_DIR) $(STAGING_TARGET_DIR)/usr/lib/ldscripts $(CP) $(WRKBUILD)/ld/ldscripts/* $(STAGING_TARGET_DIR)/usr/lib/ldscripts/ endif diff --git a/toolchain/binutils/patches/2.24/binutils.nds32 b/toolchain/binutils/patches/2.24/binutils.nds32 new file mode 100644 index 000000000..4610dc0d8 --- /dev/null +++ b/toolchain/binutils/patches/2.24/binutils.nds32 @@ -0,0 +1,409259 @@ +diff -Nur binutils-2.24.orig/.cvsignore binutils-2.24/.cvsignore +--- binutils-2.24.orig/.cvsignore 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-2.24/.cvsignore 2016-04-10 20:30:47.000000000 +0200 +@@ -0,0 +1,33 @@ ++*-all ++*-co ++*-dirs ++*-done ++*-install-info ++*-src ++*-stamp-* ++*-tagged ++blockit ++cfg-paper.info ++config.status ++configure.aux ++configure.cp ++configure.cps ++configure.dvi ++configure.fn ++configure.fns ++configure.ky ++configure.kys ++configure.log ++configure.pg ++configure.pgs ++configure.toc ++configure.tp ++configure.tps ++configure.vr ++configure.vrs ++dir.info ++Makefile ++lost+found ++update.out ++update.sourceware ++autom4te.cache +diff -Nur binutils-2.24.orig/COPYING.LIBGLOSS binutils-2.24/COPYING.LIBGLOSS +--- binutils-2.24.orig/COPYING.LIBGLOSS 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-2.24/COPYING.LIBGLOSS 2016-04-10 20:30:47.000000000 +0200 +@@ -0,0 +1,354 @@ ++The libgloss subdirectory is a collection of software from several sources. ++ ++Each file may have its own copyright/license that is embedded in the source ++file. Unless otherwise noted in the body of the source file(s), the following copyright ++notices will apply to the contents of the libgloss subdirectory: ++ ++(1) Red Hat Incorporated ++ ++Copyright (c) 1994-2009 Red Hat, Inc. All rights reserved. ++ ++This copyrighted material is made available to anyone wishing to use, modify, ++copy, or redistribute it subject to the terms and conditions of the BSD ++License. This program is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY expressed or implied, including the implied warranties ++of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. A copy of this license ++is available at http://www.opensource.org/licenses. Any Red Hat trademarks that ++are incorporated in the source code or documentation are not subject to the BSD ++License and may only be used or replicated with the express permission of ++Red Hat, Inc. ++ ++(2) University of California, Berkeley ++ ++Copyright (c) 1981-2000 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: ++ ++ * Redistributions of source code must retain the above copyright notice, ++ this list of conditions and the following disclaimer. ++ * 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. ++ * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. ++ ++(3) DJ Delorie ++ ++Copyright (C) 1993 DJ Delorie ++All rights reserved. ++ ++Redistribution, modification, and use in source and binary forms is permitted ++provided that the above copyright notice and following paragraph are ++duplicated in all such forms. ++ ++This file is distributed WITHOUT ANY WARRANTY; without even the implied ++warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ++ ++(4) (formerly GPL for fr30) ++ ++The GPL is no longer applicable to the fr30 platform. The piece of ++code (syscalls.c) referencing the GPL has been officially relicensed. ++ ++(5) Advanced Micro Devices ++ ++Copyright 1989, 1990 Advanced Micro Devices, Inc. ++ ++This software is the property of Advanced Micro Devices, Inc (AMD) which ++specifically grants the user the right to modify, use and distribute this ++software provided this notice is not removed or altered. All other rights ++are reserved by AMD. ++ ++AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS ++SOFTWARE. IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL ++DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR ++USE OF THIS SOFTWARE. ++ ++So that all may benefit from your experience, please report any problems ++or suggestions about this software to the 29K Technical Support Center at ++800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131 in the UK, or ++0031-11-1129 in Japan, toll free. The direct dial number is 512-462-4118. ++ ++Advanced Micro Devices, Inc. ++29K Support Products ++Mail Stop 573 ++5900 E. Ben White Blvd. ++Austin, TX 78741 ++800-292-9263 ++ ++(6) - Analog Devices, Inc. (bfin-* targets) ++ ++Copyright (C) 2006, 2008, 2009, 2011, 2012 Analog Devices, Inc. ++ ++The authors hereby grant permission to use, copy, modify, distribute, ++and license this software and its documentation for any purpose, provided ++that existing copyright notices are retained in all copies and that this ++notice is included verbatim in any distributions. No written agreement, ++license, or royalty fee is required for any of the authorized uses. ++Modifications to this software may be copyrighted by their authors ++and need not follow the licensing terms described here, provided that ++the new terms are clearly indicated on the first page of each file where ++they apply. ++ ++(7) University of Utah and the Computer Systems Laboratory (CSL) ++ [applies only to hppa*-*-pro* targets] ++Copyright (c) 1990,1994 The University of Utah and ++the Computer Systems Laboratory (CSL). All rights reserved. ++ ++Permission to use, copy, modify and distribute this software is hereby ++granted provided that (1) source code retains these copyright, permission, ++and disclaimer notices, and (2) redistributions including binaries ++reproduce the notices in supporting documentation, and (3) all advertising ++materials mentioning features or use of this software display the following ++acknowledgement: ``This product includes software developed by the ++Computer Systems Laboratory at the University of Utah.'' ++ ++THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS ++IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF ++ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ++ ++CSL requests users of this software to return to csl-dist@cs.utah.edu any ++improvements that they make and grant CSL redistribution rights. ++ ++(8) Sun Microsystems ++ ++Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. ++ ++Developed at SunPro, a Sun Microsystems, Inc. business. ++Permission to use, copy, modify, and distribute this ++software is freely granted, provided that this notice is preserved. ++ ++(9) Hewlett Packard ++ ++(c) Copyright 1986 HEWLETT-PACKARD COMPANY ++ ++To anyone who acknowledges that this file is provided "AS IS" ++without any express or implied warranty: ++ ++permission to use, copy, modify, and distribute this file ++for any purpose is hereby granted without fee, provided that ++the above copyright notice and this notice appears in all ++copies, and that the name of Hewlett-Packard Company not be ++used in advertising or publicity pertaining to distribution ++of the software without specific, written prior permission. ++Hewlett-Packard Company makes no representations about the ++suitability of this software for any purpose. ++ ++(10) Hans-Peter Nilsson ++ ++Copyright (C) 2001 Hans-Peter Nilsson ++ ++Permission to use, copy, modify, and distribute this software is ++freely granted, provided that the above copyright notice, this notice ++and the following disclaimer are preserved with no changes. ++ ++THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++PURPOSE. ++ ++(11) IBM Corp. spu processor (only spu-* targets) ++ ++(C) Copyright IBM Corp. 2005, 2006 ++ ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ ++ * Redistributions of source code must retain the above copyright notice, ++this list of conditions and the following disclaimer. ++ * 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. ++ * Neither the name of IBM 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. ++ ++(12) Jon Beniston (only lm32-* targets) ++ ++ Contributed by Jon Beniston ++ ++ 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. ++ ++ THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. ++ ++(13) - Xilinx, Inc. (microblaze-* and powerpc-* targets) ++ ++Copyright (c) 2004, 2009 Xilinx, Inc. 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 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. Neither the name of Xilinx 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 COPYRIGHT HOLDER 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 COPYRIGHT ++HOLDER 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. ++ ++ ++(14) - National Semiconductor Corporation ++ ++Copyright (c) 2004 National Semiconductor Corporation ++ ++The authors hereby grant permission to use, copy, modify, distribute, ++and license this software and its documentation for any purpose, provided ++that existing copyright notices are retained in all copies and that this ++notice is included verbatim in any distributions. No written agreement, ++license, or royalty fee is required for any of the authorized uses. ++Modifications to this software may be copyrighted by their authors ++and need not follow the licensing terms described here, provided that ++the new terms are clearly indicated on the first page of each file where ++they apply. ++ ++ ++(15) - CodeSourcery, Inc. (tic6x-* targets) ++ ++Copyright (c) 2010 CodeSourcery, Inc. ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ * Redistributions of source code must retain the above copyright ++ notice, this list of conditions and the following disclaimer. ++ * 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. ++ * Neither the name of CodeSourcery 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 CODESOURCERY, INC. ``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 CODESOURCERY 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. ++ ++ ++(16) - GPL with exception (sparc-*leon*, crx-*, cr16-* targets only) ++ ++ Copyright (C) 1992 Free Software Foundation, Inc. ++ Written By David Vinayak Henkel-Wallace, June 1992 ++ ++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, or (at your option) any ++later version. ++ ++In addition to the permissions in the GNU General Public License, the ++Free Software Foundation gives you unlimited permission to link the ++compiled version of this file with other programs, and to distribute ++those programs without any restriction coming from the use of this ++file. (The General Public License restrictions do apply in other ++respects; for example, they cover modification of the file, and ++distribution when not linked into another program.) ++ ++This file is distributed in the hope that it will be useful, but ++WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; 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 GCC 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. ++ ++ ++(17) - Adapteva, Inc. (epiphany-* targets) ++ ++Copyright (c) 2011, Adapteva, Inc. ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ * Redistributions of source code must retain the above copyright notice, this ++ list of conditions and the following disclaimer. ++ * 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. ++ * Neither the name of Adapteva 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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. ++ +diff -Nur binutils-2.24.orig/COPYING.NEWLIB binutils-2.24/COPYING.NEWLIB +--- binutils-2.24.orig/COPYING.NEWLIB 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-2.24/COPYING.NEWLIB 2016-04-10 20:30:47.000000000 +0200 +@@ -0,0 +1,927 @@ ++The newlib subdirectory is a collection of software from several sources. ++ ++Each file may have its own copyright/license that is embedded in the source ++file. Unless otherwise noted in the body of the source file(s), the following copyright ++notices will apply to the contents of the newlib subdirectory: ++ ++(1) Red Hat Incorporated ++ ++Copyright (c) 1994-2009 Red Hat, Inc. All rights reserved. ++ ++This copyrighted material is made available to anyone wishing to use, ++modify, copy, or redistribute it subject to the terms and conditions ++of the BSD License. This program is distributed in the hope that ++it will be useful, but WITHOUT ANY WARRANTY expressed or implied, ++including the implied warranties of MERCHANTABILITY or FITNESS FOR ++A PARTICULAR PURPOSE. A copy of this license is available at ++http://www.opensource.org/licenses. Any Red Hat trademarks that are ++incorporated in the source code or documentation are not subject to ++the BSD License and may only be used or replicated with the express ++permission of Red Hat, Inc. ++ ++(2) University of California, Berkeley ++ ++Copyright (c) 1981-2000 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: ++ ++ * Redistributions of source code must retain the above copyright notice, ++ this list of conditions and the following disclaimer. ++ * 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. ++ * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. ++ ++(3) David M. Gay (AT&T 1991, Lucent 1998) ++ ++The author of this software is David M. Gay. ++ ++Copyright (c) 1991 by AT&T. ++ ++Permission to use, copy, modify, and distribute this software for any ++purpose without fee is hereby granted, provided that this entire notice ++is included in all copies of any software which is or includes a copy ++or modification of this software and in all copies of the supporting ++documentation for such software. ++ ++THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED ++WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY ++REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY ++OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. ++ ++------------------------------------------------------------------- ++ ++The author of this software is David M. Gay. ++ ++Copyright (C) 1998-2001 by Lucent Technologies ++All Rights Reserved ++ ++Permission to use, copy, modify, and distribute this software and ++its documentation for any purpose and without fee is hereby ++granted, provided that the above copyright notice appear in all ++copies and that both that the copyright notice and this ++permission notice and warranty disclaimer appear in supporting ++documentation, and that the name of Lucent or any of its entities ++not be used in advertising or publicity pertaining to ++distribution of the software without specific, written prior ++permission. ++ ++LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, ++INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. ++IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY ++SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER ++IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ++ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF ++THIS SOFTWARE. ++ ++ ++(4) Advanced Micro Devices ++ ++Copyright 1989, 1990 Advanced Micro Devices, Inc. ++ ++This software is the property of Advanced Micro Devices, Inc (AMD) which ++specifically grants the user the right to modify, use and distribute this ++software provided this notice is not removed or altered. All other rights ++are reserved by AMD. ++ ++AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS ++SOFTWARE. IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL ++DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR ++USE OF THIS SOFTWARE. ++ ++So that all may benefit from your experience, please report any problems ++or suggestions about this software to the 29K Technical Support Center at ++800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131 in the UK, or ++0031-11-1129 in Japan, toll free. The direct dial number is 512-462-4118. ++ ++Advanced Micro Devices, Inc. ++29K Support Products ++Mail Stop 573 ++5900 E. Ben White Blvd. ++Austin, TX 78741 ++800-292-9263 ++ ++(5) ++ ++(6) ++ ++(7) Sun Microsystems ++ ++Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. ++ ++Developed at SunPro, a Sun Microsystems, Inc. business. ++Permission to use, copy, modify, and distribute this ++software is freely granted, provided that this notice is preserved. ++ ++(8) Hewlett Packard ++ ++(c) Copyright 1986 HEWLETT-PACKARD COMPANY ++ ++To anyone who acknowledges that this file is provided "AS IS" ++without any express or implied warranty: ++ permission to use, copy, modify, and distribute this file ++for any purpose is hereby granted without fee, provided that ++the above copyright notice and this notice appears in all ++copies, and that the name of Hewlett-Packard Company not be ++used in advertising or publicity pertaining to distribution ++of the software without specific, written prior permission. ++Hewlett-Packard Company makes no representations about the ++suitability of this software for any purpose. ++ ++(9) Hans-Peter Nilsson ++ ++Copyright (C) 2001 Hans-Peter Nilsson ++ ++Permission to use, copy, modify, and distribute this software is ++freely granted, provided that the above copyright notice, this notice ++and the following disclaimer are preserved with no changes. ++ ++THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++PURPOSE. ++ ++(10) Stephane Carrez (m68hc11-elf/m68hc12-elf targets only) ++ ++Copyright (C) 1999, 2000, 2001, 2002 Stephane Carrez (stcarrez@nerim.fr) ++ ++The authors hereby grant permission to use, copy, modify, distribute, ++and license this software and its documentation for any purpose, provided ++that existing copyright notices are retained in all copies and that this ++notice is included verbatim in any distributions. No written agreement, ++license, or royalty fee is required for any of the authorized uses. ++Modifications to this software may be copyrighted by their authors ++and need not follow the licensing terms described here, provided that ++the new terms are clearly indicated on the first page of each file where ++they apply. ++ ++(11) Christopher G. Demetriou ++ ++Copyright (c) 2001 Christopher G. Demetriou ++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. The name of the author may not be used to endorse or promote products ++ derived from this software without specific prior written permission. ++ ++THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ ++(12) SuperH, Inc. ++ ++Copyright 2002 SuperH, Inc. All rights reserved ++ ++This software is the property of SuperH, Inc (SuperH) which specifically ++grants the user the right to modify, use and distribute this software ++provided this notice is not removed or altered. All other rights are ++reserved by SuperH. ++ ++SUPERH MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO ++THIS SOFTWARE. IN NO EVENT SHALL SUPERH BE LIABLE FOR INDIRECT, SPECIAL, ++INCIDENTAL OR CONSEQUENTIAL DAMAGES IN CONNECTION WITH OR ARISING FROM ++THE FURNISHING, PERFORMANCE, OR USE OF THIS SOFTWARE. ++ ++So that all may benefit from your experience, please report any problems ++or suggestions about this software to the SuperH Support Center via ++e-mail at softwaresupport@superh.com . ++ ++SuperH, Inc. ++405 River Oaks Parkway ++San Jose ++CA 95134 ++USA ++ ++(13) Royal Institute of Technology ++ ++Copyright (c) 1999 Kungliga Tekniska Högskolan ++(Royal Institute of Technology, Stockholm, Sweden). ++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. Neither the name of KTH 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 KTH AND ITS 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 KTH OR ITS 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. ++ ++(14) Alexey Zelkin ++ ++Copyright (c) 2000, 2001 Alexey Zelkin ++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. ++ ++THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. ++ ++(15) Andrey A. Chernov ++ ++Copyright (C) 1997 by Andrey A. Chernov, Moscow, Russia. ++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. ++ ++THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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. ++ ++(16) FreeBSD ++ ++Copyright (c) 1997-2002 FreeBSD Project. ++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. ++ ++THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. ++ ++(17) S. L. Moshier ++ ++Author: S. L. Moshier. ++ ++Copyright (c) 1984,2000 S.L. Moshier ++ ++Permission to use, copy, modify, and distribute this software for any ++purpose without fee is hereby granted, provided that this entire notice ++is included in all copies of any software which is or includes a copy ++or modification of this software and in all copies of the supporting ++documentation for such software. ++ ++THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED ++WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION ++OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS ++SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. ++ ++(18) Citrus Project ++ ++Copyright (c)1999 Citrus Project, ++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. ++ ++THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. ++ ++(19) Todd C. Miller ++ ++Copyright (c) 1998 Todd C. Miller ++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. The name of the author 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 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 AUTHOR 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. ++ ++(20) DJ Delorie (i386) ++Copyright (C) 1991 DJ Delorie ++All rights reserved. ++ ++Redistribution, modification, and use in source and binary forms is permitted ++provided that the above copyright notice and following paragraph are ++duplicated in all such forms. ++ ++This file is distributed WITHOUT ANY WARRANTY; without even the implied ++warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ++ ++(21) Free Software Foundation LGPL License (*-linux* targets only) ++ ++ Copyright (C) 1990-1999, 2000, 2001 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Mark Kettenis , 1997. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++(22) Xavier Leroy LGPL License (i[3456]86-*-linux* targets only) ++ ++Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) ++ ++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 ++of the License, or (at your option) any later version. ++ ++This program is distributed in the hope that 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. ++ ++(23) Intel (i960) ++ ++Copyright (c) 1993 Intel Corporation ++ ++Intel hereby grants you permission to copy, modify, and distribute this ++software and its documentation. Intel grants this permission provided ++that the above copyright notice appears in all copies and that both the ++copyright notice and this permission notice appear in supporting ++documentation. In addition, Intel grants this permission provided that ++you prominently mark as "not part of the original" any modifications ++made to this software or documentation, and that the name of Intel ++Corporation not be used in advertising or publicity pertaining to ++distribution of the software or the documentation without specific, ++written prior permission. ++ ++Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR ++IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY ++OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or ++representations regarding the use of, or the results of the use of, ++the software and documentation in terms of correctness, accuracy, ++reliability, currentness, or otherwise; and you rely on the software, ++documentation and results solely at your own risk. ++ ++IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, ++LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES ++OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM ++PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. ++ ++(24) Hewlett-Packard (hppa targets only) ++ ++(c) Copyright 1986 HEWLETT-PACKARD COMPANY ++ ++To anyone who acknowledges that this file is provided "AS IS" ++without any express or implied warranty: ++ permission to use, copy, modify, and distribute this file ++for any purpose is hereby granted without fee, provided that ++the above copyright notice and this notice appears in all ++copies, and that the name of Hewlett-Packard Company not be ++used in advertising or publicity pertaining to distribution ++of the software without specific, written prior permission. ++Hewlett-Packard Company makes no representations about the ++suitability of this software for any purpose. ++ ++(25) Henry Spencer (only *-linux targets) ++ ++Copyright 1992, 1993, 1994 Henry Spencer. All rights reserved. ++This software is not subject to any license of the American Telephone ++and Telegraph Company or of the Regents of the University of California. ++ ++Permission is granted to anyone to use this software for any purpose on ++any computer system, and to alter it and redistribute it, subject ++to the following restrictions: ++ ++1. The author is not responsible for the consequences of use of this ++ software, no matter how awful, even if they arise from flaws in it. ++ ++2. The origin of this software must not be misrepresented, either by ++ explicit claim or by omission. Since few users ever read sources, ++ credits must appear in the documentation. ++ ++3. Altered versions must be plainly marked as such, and must not be ++ misrepresented as being the original software. Since few users ++ ever read sources, credits must appear in the documentation. ++ ++4. This notice may not be removed or altered. ++ ++(26) Mike Barcroft ++ ++Copyright (c) 2001 Mike Barcroft ++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. ++ ++THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. ++ ++(27) Konstantin Chuguev (--enable-newlib-iconv) ++ ++Copyright (c) 1999, 2000 ++ Konstantin Chuguev. 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. ++ ++THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. ++ ++ iconv (Charset Conversion Library) v2.0 ++ ++(28) Artem Bityuckiy (--enable-newlib-iconv) ++ ++Copyright (c) 2003, Artem B. Bityuckiy, SoftMine Corporation. ++Rights transferred to Franklin Electronic Publishers. ++ ++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. ++ ++THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. ++ ++(29) IBM, Sony, Toshiba (only spu-* targets) ++ ++ (C) Copyright 2001,2006, ++ International Business Machines Corporation, ++ Sony Computer Entertainment, Incorporated, ++ Toshiba Corporation, ++ ++ All rights reserved. ++ ++ Redistribution and use in source and binary forms, with or without ++ modification, are permitted provided that the following conditions are met: ++ ++ * Redistributions of source code must retain the above copyright notice, ++ this list of conditions and the following disclaimer. ++ * 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. ++ * Neither the names of the copyright holders nor the names of their ++ contributors may be used to endorse or promote products derived from this ++ software without specific prior written permission. ++ ++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. ++ ++(30) - Alex Tatmanjants (targets using libc/posix) ++ ++ Copyright (c) 1995 Alex Tatmanjants ++ at Electronni Visti IA, Kiev, Ukraine. ++ 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. ++ ++ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ ++(31) - M. Warner Losh (targets using libc/posix) ++ ++ Copyright (c) 1998, M. Warner Losh ++ 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. ++ ++ THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. ++ ++(32) - Andrey A. Chernov (targets using libc/posix) ++ ++ Copyright (C) 1996 by Andrey A. Chernov, Moscow, Russia. ++ 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. ++ ++ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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. ++ ++(33) - Daniel Eischen (targets using libc/posix) ++ ++ Copyright (c) 2001 Daniel Eischen . ++ 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. ++ ++ THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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. ++ ++ ++(34) - Jon Beniston (only lm32-* targets) ++ ++ Contributed by Jon Beniston ++ ++ 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. ++ ++ THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. ++ ++ ++(35) - ARM Ltd (arm and thumb variant targets only) ++ ++ Copyright (c) 2009 ARM Ltd ++ 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. The name of the company may not be used to endorse or promote ++ products derived from this software without specific prior written ++ permission. ++ ++ THIS SOFTWARE IS PROVIDED BY ARM LTD ``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 ARM LTD 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. ++ ++(36) - Xilinx, Inc. (microblaze-* and powerpc-* targets) ++ ++Copyright (c) 2004, 2009 Xilinx, Inc. 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 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. Neither the name of Xilinx 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 COPYRIGHT HOLDER 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 COPYRIGHT ++HOLDER 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. ++ ++ ++(37) Texas Instruments Incorporated (tic6x-* targets) ++ ++Copyright (c) 1996-2010 Texas Instruments Incorporated ++http://www.ti.com/ ++ ++ Redistribution and use in source and binary forms, with or without ++ modification, are permitted provided that the following conditions ++ are met: ++ ++ Redistributions of source code must retain the above copyright ++ notice, this list of conditions and the following disclaimer. ++ ++ 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. ++ ++ Neither the name of Texas Instruments Incorporated 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 COPYRIGHT HOLDERS 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 COPYRIGHT ++ OWNER 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. ++ ++(38) National Semiconductor (cr16-* and crx-* targets) ++ ++Copyright (c) 2004 National Semiconductor Corporation ++ ++The authors hereby grant permission to use, copy, modify, distribute, ++and license this software and its documentation for any purpose, provided ++that existing copyright notices are retained in all copies and that this ++notice is included verbatim in any distributions. No written agreement, ++license, or royalty fee is required for any of the authorized uses. ++Modifications to this software may be copyrighted by their authors ++and need not follow the licensing terms described here, provided that ++the new terms are clearly indicated on the first page of each file where ++they apply. ++ ++(39) - Adapteva, Inc. (epiphany-* targets) ++ ++Copyright (c) 2011, Adapteva, Inc. ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ * Redistributions of source code must retain the above copyright notice, this ++ list of conditions and the following disclaimer. ++ * 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. ++ * Neither the name of Adapteva 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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. ++ ++(40) - Altera Corportion (nios2-* targets) ++ ++Copyright (c) 2003 Altera Corporation ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions ++are met: ++ ++ o Redistributions of source code must retain the above copyright ++ notice, this list of conditions and the following disclaimer. ++ o 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. ++ o Neither the name of Altera Corporation 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 ALTERA CORPORATION, THE COPYRIGHT HOLDER, ++AND ITS 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 COPYRIGHT HOLDER 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. ++ +diff -Nur binutils-2.24.orig/bfd/Makefile.am binutils-2.24/bfd/Makefile.am +--- binutils-2.24.orig/bfd/Makefile.am 2013-12-02 10:30:28.000000000 +0100 ++++ binutils-2.24/bfd/Makefile.am 2016-04-10 20:30:46.000000000 +0200 +@@ -136,6 +136,7 @@ + cpu-moxie.lo \ + cpu-msp430.lo \ + cpu-mt.lo \ ++ cpu-nds32.lo \ + cpu-nios2.lo \ + cpu-ns32k.lo \ + cpu-openrisc.lo \ +@@ -220,6 +221,7 @@ + cpu-moxie.c \ + cpu-msp430.c \ + cpu-mt.c \ ++ cpu-nds32.c \ + cpu-ns32k.c \ + cpu-nios2.c \ + cpu-openrisc.c \ +@@ -349,6 +351,7 @@ + elf32-moxie.lo \ + elf32-msp430.lo \ + elf32-mt.lo \ ++ elf32-nds32.lo \ + elf32-nios2.lo \ + elf32-openrisc.lo \ + elf32-or32.lo \ +@@ -537,6 +540,7 @@ + elf32-moxie.c \ + elf32-msp430.c \ + elf32-mt.c \ ++ elf32-nds32.c \ + elf32-nios2.c \ + elf32-openrisc.c \ + elf32-or32.c \ +diff -Nur binutils-2.24.orig/bfd/Makefile.in binutils-2.24/bfd/Makefile.in +--- binutils-2.24.orig/bfd/Makefile.in 2013-12-02 10:30:30.000000000 +0100 ++++ binutils-2.24/bfd/Makefile.in 2016-04-10 20:30:46.000000000 +0200 +@@ -437,6 +437,7 @@ + cpu-moxie.lo \ + cpu-msp430.lo \ + cpu-mt.lo \ ++ cpu-nds32.lo \ + cpu-nios2.lo \ + cpu-ns32k.lo \ + cpu-openrisc.lo \ +@@ -521,6 +522,7 @@ + cpu-moxie.c \ + cpu-msp430.c \ + cpu-mt.c \ ++ cpu-nds32.c \ + cpu-ns32k.c \ + cpu-nios2.c \ + cpu-openrisc.c \ +@@ -651,6 +653,7 @@ + elf32-moxie.lo \ + elf32-msp430.lo \ + elf32-mt.lo \ ++ elf32-nds32.lo \ + elf32-nios2.lo \ + elf32-openrisc.lo \ + elf32-or32.lo \ +@@ -839,6 +842,7 @@ + elf32-moxie.c \ + elf32-msp430.c \ + elf32-mt.c \ ++ elf32-nds32.c \ + elf32-nios2.c \ + elf32-openrisc.c \ + elf32-or32.c \ +@@ -1352,6 +1356,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-moxie.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-msp430.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-mt.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-nds32.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-nios2.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-ns32k.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-openrisc.Plo@am__quote@ +@@ -1442,6 +1447,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-moxie.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-msp430.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-mt.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-nds32.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-nios2.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-openrisc.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-or32.Plo@am__quote@ +diff -Nur binutils-2.24.orig/bfd/archures.c binutils-2.24/bfd/archures.c +--- binutils-2.24.orig/bfd/archures.c 2013-11-08 11:02:26.000000000 +0100 ++++ binutils-2.24/bfd/archures.c 2016-04-10 20:30:46.000000000 +0200 +@@ -316,6 +316,12 @@ + .#define bfd_mach_arm_ep9312 11 + .#define bfd_mach_arm_iWMMXt 12 + .#define bfd_mach_arm_iWMMXt2 13 ++. bfd_arch_nds32, {* Andes NDS32 *} ++.#define bfd_mach_n1 1 ++.#define bfd_mach_n1h 2 ++.#define bfd_mach_n1h_v2 3 ++.#define bfd_mach_n1h_v3 4 ++.#define bfd_mach_n1h_v3m 5 + . bfd_arch_ns32k, {* National Semiconductors ns32000 *} + . bfd_arch_w65, {* WDC 65816 *} + . bfd_arch_tic30, {* Texas Instruments TMS320C30 *} +@@ -574,6 +580,7 @@ + extern const bfd_arch_info_type bfd_moxie_arch; + extern const bfd_arch_info_type bfd_msp430_arch; + extern const bfd_arch_info_type bfd_mt_arch; ++extern const bfd_arch_info_type bfd_nds32_arch; + extern const bfd_arch_info_type bfd_nios2_arch; + extern const bfd_arch_info_type bfd_ns32k_arch; + extern const bfd_arch_info_type bfd_openrisc_arch; +@@ -663,6 +670,7 @@ + &bfd_moxie_arch, + &bfd_msp430_arch, + &bfd_mt_arch, ++ &bfd_nds32_arch, + &bfd_nios2_arch, + &bfd_ns32k_arch, + &bfd_openrisc_arch, +diff -Nur binutils-2.24.orig/bfd/bfd-in.h binutils-2.24/bfd/bfd-in.h +--- binutils-2.24.orig/bfd/bfd-in.h 2013-11-04 16:33:37.000000000 +0100 ++++ binutils-2.24/bfd/bfd-in.h 2016-04-10 20:30:46.000000000 +0200 +@@ -292,9 +292,6 @@ + + #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 = 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) + /* Find the address one past the end of SEC. */ + #define bfd_get_section_limit(bfd, sec) \ + (((bfd)->direction != write_direction && (sec)->rawsize != 0 \ +@@ -517,8 +514,6 @@ + + #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char) + +-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE) +- + extern bfd_boolean bfd_cache_close + (bfd *abfd); + /* NB: This declaration should match the autogenerated one in libbfd.h. */ +diff -Nur binutils-2.24.orig/bfd/bfd-in2.h binutils-2.24/bfd/bfd-in2.h +--- binutils-2.24.orig/bfd/bfd-in2.h 2013-11-18 09:40:15.000000000 +0100 ++++ binutils-2.24/bfd/bfd-in2.h 2016-04-10 20:30:46.000000000 +0200 +@@ -299,9 +299,6 @@ + + #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 = 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) + /* Find the address one past the end of SEC. */ + #define bfd_get_section_limit(bfd, sec) \ + (((bfd)->direction != write_direction && (sec)->rawsize != 0 \ +@@ -524,8 +521,6 @@ + + #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char) + +-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE) +- + extern bfd_boolean bfd_cache_close + (bfd *abfd); + /* NB: This declaration should match the autogenerated one in libbfd.h. */ +@@ -1594,6 +1589,32 @@ + int size; + }; + ++/* Note: the following are provided as inline functions rather than macros ++ because not all callers use the return value. A macro implementation ++ would use a comma expression, eg: "((ptr)->foo = val, TRUE)" and some ++ compilers will complain about comma expressions that have no effect. */ ++static inline bfd_boolean ++bfd_set_section_userdata (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, void * val) ++{ ++ ptr->userdata = val; ++ return TRUE; ++} ++ ++static inline bfd_boolean ++bfd_set_section_vma (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, bfd_vma val) ++{ ++ ptr->vma = ptr->lma = val; ++ ptr->user_set_vma = TRUE; ++ return TRUE; ++} ++ ++static inline bfd_boolean ++bfd_set_section_alignment (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, unsigned int val) ++{ ++ ptr->alignment_power = val; ++ return TRUE; ++} ++ + /* 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. */ +@@ -2071,6 +2092,12 @@ + #define bfd_mach_arm_ep9312 11 + #define bfd_mach_arm_iWMMXt 12 + #define bfd_mach_arm_iWMMXt2 13 ++ bfd_arch_nds32, /* Andes NDS32 */ ++#define bfd_mach_n1 1 ++#define bfd_mach_n1h 2 ++#define bfd_mach_n1h_v2 3 ++#define bfd_mach_n1h_v3 4 ++#define bfd_mach_n1h_v3m 5 + bfd_arch_ns32k, /* National Semiconductors ns32000 */ + bfd_arch_w65, /* WDC 65816 */ + bfd_arch_tic30, /* Texas Instruments TMS320C30 */ +@@ -3794,6 +3821,229 @@ + BFD_RELOC_M32R_GOTPC_HI_SLO, + BFD_RELOC_M32R_GOTPC_LO, + ++/* NDS32 relocs. ++This is a 20 bit absolute address. */ ++ BFD_RELOC_NDS32_20, ++ ++/* This is a 9-bit pc-relative reloc with the right 1 bit assumed to be 0. */ ++ BFD_RELOC_NDS32_9_PCREL, ++ ++/* This is a 9-bit pc-relative reloc with the right 1 bit assumed to be 0. */ ++ BFD_RELOC_NDS32_WORD_9_PCREL, ++ ++/* This is an 15-bit reloc with the right 1 bit assumed to be 0. */ ++ BFD_RELOC_NDS32_15_PCREL, ++ ++/* This is an 17-bit reloc with the right 1 bit assumed to be 0. */ ++ BFD_RELOC_NDS32_17_PCREL, ++ ++/* This is a 25-bit reloc with the right 1 bit assumed to be 0. */ ++ BFD_RELOC_NDS32_25_PCREL, ++ ++/* This is a 20-bit reloc containing the high 20 bits of an address ++used with the lower 12 bits */ ++ BFD_RELOC_NDS32_HI20, ++ ++/* This is a 12-bit reloc containing the lower 12 bits of an address ++then shift right by 3. This is used with ldi,sdi... */ ++ BFD_RELOC_NDS32_LO12S3, ++ ++/* This is a 12-bit reloc containing the lower 12 bits of an address ++then shift left by 2. This is used with lwi,swi... */ ++ BFD_RELOC_NDS32_LO12S2, ++ ++/* This is a 12-bit reloc containing the lower 12 bits of an address ++then shift left by 1. This is used with lhi,shi... */ ++ BFD_RELOC_NDS32_LO12S1, ++ ++/* This is a 12-bit reloc containing the lower 12 bits of an address ++then shift left by 0. This is used with lbisbi... */ ++ BFD_RELOC_NDS32_LO12S0, ++ ++/* This is a 12-bit reloc containing the lower 12 bits of an address ++then shift left by 0. This is only used with branch relaxations */ ++ BFD_RELOC_NDS32_LO12S0_ORI, ++ ++/* This is a 15-bit reloc containing the small data area 18-bit signed offset ++and shift left by 3 for use in ldi, sdi... */ ++ BFD_RELOC_NDS32_SDA15S3, ++ ++/* This is a 15-bit reloc containing the small data area 17-bit signed offset ++and shift left by 2 for use in lwi, swi... */ ++ BFD_RELOC_NDS32_SDA15S2, ++ ++/* This is a 15-bit reloc containing the small data area 16-bit signed offset ++and shift left by 1 for use in lhi, shi... */ ++ BFD_RELOC_NDS32_SDA15S1, ++ ++/* This is a 15-bit reloc containing the small data area 15-bit signed offset ++and shift left by 0 for use in lbi, sbi... */ ++ BFD_RELOC_NDS32_SDA15S0, ++ ++/* This is a 16-bit reloc containing the small data area 16-bit signed offset ++and shift left by 3 */ ++ BFD_RELOC_NDS32_SDA16S3, ++ ++/* This is a 17-bit reloc containing the small data area 17-bit signed offset ++and shift left by 2 for use in lwi.gp, swi.gp... */ ++ BFD_RELOC_NDS32_SDA17S2, ++ ++/* This is a 18-bit reloc containing the small data area 18-bit signed offset ++and shift left by 1 for use in lhi.gp, shi.gp... */ ++ BFD_RELOC_NDS32_SDA18S1, ++ ++/* This is a 19-bit reloc containing the small data area 19-bit signed offset ++and shift left by 0 for use in lbi.gp, sbi.gp... */ ++ BFD_RELOC_NDS32_SDA19S0, ++ ++/* This is a 24-bit reloc for security check sum. */ ++ BFD_RELOC_NDS32_SECURITY_16, ++ ++/* for PIC */ ++ BFD_RELOC_NDS32_GOT20, ++ BFD_RELOC_NDS32_9_PLTREL, ++ BFD_RELOC_NDS32_25_PLTREL, ++ BFD_RELOC_NDS32_COPY, ++ BFD_RELOC_NDS32_GLOB_DAT, ++ BFD_RELOC_NDS32_JMP_SLOT, ++ BFD_RELOC_NDS32_RELATIVE, ++ BFD_RELOC_NDS32_GOTOFF, ++ BFD_RELOC_NDS32_GOTOFF_HI20, ++ BFD_RELOC_NDS32_GOTOFF_LO12, ++ BFD_RELOC_NDS32_GOTPC20, ++ BFD_RELOC_NDS32_GOT_HI20, ++ BFD_RELOC_NDS32_GOT_LO12, ++ BFD_RELOC_NDS32_GOTPC_HI20, ++ BFD_RELOC_NDS32_GOTPC_LO12, ++ ++/* for relax */ ++ BFD_RELOC_NDS32_INSN16, ++ BFD_RELOC_NDS32_LABEL, ++ BFD_RELOC_NDS32_LONGCALL1, ++ BFD_RELOC_NDS32_LONGCALL2, ++ BFD_RELOC_NDS32_LONGCALL3, ++ BFD_RELOC_NDS32_LONGJUMP1, ++ BFD_RELOC_NDS32_LONGJUMP2, ++ BFD_RELOC_NDS32_LONGJUMP3, ++ BFD_RELOC_NDS32_LOADSTORE, ++ BFD_RELOC_NDS32_9_FIXED, ++ BFD_RELOC_NDS32_15_FIXED, ++ BFD_RELOC_NDS32_17_FIXED, ++ BFD_RELOC_NDS32_25_FIXED, ++ BFD_RELOC_NDS32_LONGCALL4, ++ BFD_RELOC_NDS32_LONGCALL5, ++ BFD_RELOC_NDS32_LONGCALL6, ++ BFD_RELOC_NDS32_LONGJUMP4, ++ BFD_RELOC_NDS32_LONGJUMP5, ++ BFD_RELOC_NDS32_LONGJUMP6, ++ BFD_RELOC_NDS32_LONGJUMP7, ++ ++/* for PIC */ ++ BFD_RELOC_NDS32_PLTREL_HI20, ++ BFD_RELOC_NDS32_PLTREL_LO12, ++ BFD_RELOC_NDS32_PLT_GOTREL_HI20, ++ BFD_RELOC_NDS32_PLT_GOTREL_LO12, ++ ++/* for floating point */ ++ BFD_RELOC_NDS32_SDA12S2_DP, ++ BFD_RELOC_NDS32_SDA12S2_SP, ++ BFD_RELOC_NDS32_LO12S2_DP, ++ BFD_RELOC_NDS32_LO12S2_SP, ++ ++/* for dwarf2 debug_line. */ ++ BFD_RELOC_NDS32_DWARF2_OP1, ++ BFD_RELOC_NDS32_DWARF2_OP2, ++ BFD_RELOC_NDS32_DWARF2_LEB, ++ ++/* for eliminate 16-bit instructions */ ++ BFD_RELOC_NDS32_UPDATE_TA, ++ ++/* for PIC object relaxation */ ++ BFD_RELOC_NDS32_PLT_GOTREL_LO20, ++ BFD_RELOC_NDS32_PLT_GOTREL_LO15, ++ BFD_RELOC_NDS32_PLT_GOTREL_LO19, ++ BFD_RELOC_NDS32_GOT_LO15, ++ BFD_RELOC_NDS32_GOT_LO19, ++ BFD_RELOC_NDS32_GOTOFF_LO15, ++ BFD_RELOC_NDS32_GOTOFF_LO19, ++ BFD_RELOC_NDS32_GOT15S2, ++ BFD_RELOC_NDS32_GOT17S2, ++ ++/* NDS32 relocs. ++This is a 5 bit absolute address. */ ++ BFD_RELOC_NDS32_5, ++ ++/* This is a 10-bit unsigned pc-relative reloc with the right 1 bit assumed to be 0. */ ++ BFD_RELOC_NDS32_10_UPCREL, ++ ++/* If fp were omitted, fp can used as another gp. */ ++ BFD_RELOC_NDS32_SDA_FP7U2_RELA, ++ ++/* relaxation relative relocation types */ ++ BFD_RELOC_NDS32_RELAX_ENTRY, ++ BFD_RELOC_NDS32_GOT_SUFF, ++ BFD_RELOC_NDS32_GOTOFF_SUFF, ++ BFD_RELOC_NDS32_PLT_GOT_SUFF, ++ BFD_RELOC_NDS32_MULCALL_SUFF, ++ BFD_RELOC_NDS32_PTR, ++ BFD_RELOC_NDS32_PTR_COUNT, ++ BFD_RELOC_NDS32_PTR_RESOLVED, ++ BFD_RELOC_NDS32_PLTBLOCK, ++ BFD_RELOC_NDS32_RELAX_REGION_BEGIN, ++ BFD_RELOC_NDS32_RELAX_REGION_END, ++ BFD_RELOC_NDS32_MINUEND, ++ BFD_RELOC_NDS32_SUBTRAHEND, ++ BFD_RELOC_NDS32_DIFF8, ++ BFD_RELOC_NDS32_DIFF16, ++ BFD_RELOC_NDS32_DIFF32, ++ BFD_RELOC_NDS32_DIFF_ULEB128, ++ BFD_RELOC_NDS32_EMPTY, ++ ++/* This is a 25 bit absolute address. */ ++ BFD_RELOC_NDS32_25_ABS, ++ ++/* For ex9 and ifc using. */ ++ BFD_RELOC_NDS32_DATA, ++ BFD_RELOC_NDS32_TRAN, ++ BFD_RELOC_NDS32_17IFC_PCREL, ++ BFD_RELOC_NDS32_10IFCU_PCREL, ++ ++/* For TLS. */ ++ BFD_RELOC_NDS32_TPOFF, ++ BFD_RELOC_NDS32_GOTTPOFF, ++ BFD_RELOC_NDS32_TLS_LE_HI20, ++ BFD_RELOC_NDS32_TLS_LE_LO12, ++ BFD_RELOC_NDS32_TLS_LE_20, ++ BFD_RELOC_NDS32_TLS_LE_15S0, ++ BFD_RELOC_NDS32_TLS_LE_15S1, ++ BFD_RELOC_NDS32_TLS_LE_15S2, ++ BFD_RELOC_NDS32_TLS_LE_ADD, ++ BFD_RELOC_NDS32_TLS_LE_LS, ++ BFD_RELOC_NDS32_TLS_IE_HI20, ++ BFD_RELOC_NDS32_TLS_IE_LO12, ++ BFD_RELOC_NDS32_TLS_IE_LO12S2, ++ BFD_RELOC_NDS32_TLS_IEGP_HI20, ++ BFD_RELOC_NDS32_TLS_IEGP_LO12, ++ BFD_RELOC_NDS32_TLS_IEGP_LO12S2, ++ BFD_RELOC_NDS32_TLS_IEGP_LW, ++ BFD_RELOC_NDS32_TLS_DESC, ++ BFD_RELOC_NDS32_TLS_DESC_HI20, ++ BFD_RELOC_NDS32_TLS_DESC_LO12, ++ BFD_RELOC_NDS32_TLS_DESC_20, ++ BFD_RELOC_NDS32_TLS_DESC_SDA17S2, ++ BFD_RELOC_NDS32_TLS_DESC_ADD, ++ BFD_RELOC_NDS32_TLS_DESC_FUNC, ++ BFD_RELOC_NDS32_TLS_DESC_CALL, ++ BFD_RELOC_NDS32_TLS_DESC_MEM, ++ BFD_RELOC_NDS32_REMOVE, ++ BFD_RELOC_NDS32_GROUP, ++ ++/* Jump-patch table relative relocations. */ ++ BFD_RELOC_NDS32_ICT, ++ BFD_RELOC_NDS32_ICT_HI20, ++ BFD_RELOC_NDS32_ICT_LO12, ++ BFD_RELOC_NDS32_ICT_25PC, ++ + /* This is a 9-bit reloc */ + BFD_RELOC_V850_9_PCREL, + +@@ -6235,6 +6485,14 @@ + unsigned int selective_search : 1; + }; + ++/* See note beside bfd_set_section_userdata. */ ++static inline bfd_boolean ++bfd_set_cacheable (bfd * abfd, bfd_boolean val) ++{ ++ abfd->cacheable = val; ++ return TRUE; ++} ++ + typedef enum bfd_error + { + bfd_error_no_error = 0, +diff -Nur binutils-2.24.orig/bfd/bfd.c binutils-2.24/bfd/bfd.c +--- binutils-2.24.orig/bfd/bfd.c 2013-11-04 16:33:37.000000000 +0100 ++++ binutils-2.24/bfd/bfd.c 2016-04-10 20:30:46.000000000 +0200 +@@ -311,6 +311,14 @@ + . unsigned int selective_search : 1; + .}; + . ++.{* See note beside bfd_set_section_userdata. *} ++.static inline bfd_boolean ++.bfd_set_cacheable (bfd * abfd, bfd_boolean val) ++.{ ++. abfd->cacheable = val; ++. return TRUE; ++.} ++. + */ + + #include "sysdep.h" +diff -Nur binutils-2.24.orig/bfd/config.bfd binutils-2.24/bfd/config.bfd +--- binutils-2.24.orig/bfd/config.bfd 2013-11-04 16:33:37.000000000 +0100 ++++ binutils-2.24/bfd/config.bfd 2016-04-10 20:30:46.000000000 +0200 +@@ -6,12 +6,12 @@ + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 3 of the License, or + # (at your option) any later version. +-# ++# + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + # GNU General Public License for more details. +-# ++# + # You should have received a copy of the GNU General Public License + # along with this program; see the file COPYING3. If not see + # . +@@ -109,6 +109,7 @@ + m88*) targ_archs=bfd_m88k_arch ;; + microblaze*) targ_archs=bfd_microblaze_arch ;; + mips*) targ_archs=bfd_mips_arch ;; ++nds32*) targ_archs=bfd_nds32_arch ;; + nios2*) targ_archs=bfd_nios2_arch ;; + or32*) targ_archs=bfd_or32_arch ;; + pdp11*) targ_archs=bfd_pdp11_arch ;; +@@ -1120,6 +1121,28 @@ + targ_selvecs=bfd_elf32_msp430_ti_vec + ;; + ++ nds32*le-*-linux*) ++ targ_defvec=bfd_elf32_nds32lelin_vec ++ targ_selvecs=bfd_elf32_nds32belin_vec ++ targ_cflags=-DNDS32_LINUX_TOOLCHAIN ++ ;; ++ ++ nds32*be-*-linux*) ++ targ_defvec=bfd_elf32_nds32belin_vec ++ targ_selvecs=bfd_elf32_nds32lelin_vec ++ targ_cflags=-DNDS32_LINUX_TOOLCHAIN ++ ;; ++ ++ nds32*le-*-*) ++ targ_defvec=bfd_elf32_nds32le_vec ++ targ_selvecs=bfd_elf32_nds32be_vec ++ ;; ++ ++ nds32*be-*-*) ++ targ_defvec=bfd_elf32_nds32be_vec ++ targ_selvecs=bfd_elf32_nds32le_vec ++ ;; ++ + ns32k-pc532-mach* | ns32k-pc532-ux*) + targ_defvec=pc532machaout_vec + targ_underscore=yes +@@ -1640,12 +1663,12 @@ + w65-*-*) + targ_defvec=w65_vec + ;; +- ++ + xgate-*-*) + targ_defvec=bfd_elf32_xgate_vec + targ_selvecs="bfd_elf32_xgate_vec" + ;; +- ++ + xstormy16-*-elf) + targ_defvec=bfd_elf32_xstormy16_vec + ;; +diff -Nur binutils-2.24.orig/bfd/configure binutils-2.24/bfd/configure +--- binutils-2.24.orig/bfd/configure 2013-12-02 10:30:30.000000000 +0100 ++++ binutils-2.24/bfd/configure 2016-04-10 20:30:46.000000000 +0200 +@@ -15307,6 +15307,10 @@ + tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; + bfd_elf32_ntradlittlemips_vec | bfd_elf32_ntradlittlemips_freebsd_vec) + tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; ++ bfd_elf32_nds32le_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;; ++ bfd_elf32_nds32be_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;; ++ bfd_elf32_nds32lelin_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;; ++ bfd_elf32_nds32belin_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;; + bfd_elf32_openrisc_vec) tb="$tb elf32-openrisc.lo elf32.lo $elf" ;; + bfd_elf32_or32_big_vec) tb="$tb elf32-or32.lo elf32.lo $elf" ;; + bfd_elf32_pj_vec) tb="$tb elf32-pj.lo elf32.lo $elf";; +diff -Nur binutils-2.24.orig/bfd/configure.in binutils-2.24/bfd/configure.in +--- binutils-2.24.orig/bfd/configure.in 2013-12-02 10:30:28.000000000 +0100 ++++ binutils-2.24/bfd/configure.in 2016-04-10 20:30:46.000000000 +0200 +@@ -796,6 +796,10 @@ + tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; + bfd_elf32_ntradlittlemips_vec | bfd_elf32_ntradlittlemips_freebsd_vec) + tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; ++ bfd_elf32_nds32be_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;; ++ bfd_elf32_nds32le_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;; ++ bfd_elf32_nds32belin_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;; ++ bfd_elf32_nds32lelin_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;; + bfd_elf32_openrisc_vec) tb="$tb elf32-openrisc.lo elf32.lo $elf" ;; + bfd_elf32_or32_big_vec) tb="$tb elf32-or32.lo elf32.lo $elf" ;; + bfd_elf32_pj_vec) tb="$tb elf32-pj.lo elf32.lo $elf";; +diff -Nur binutils-2.24.orig/bfd/cpu-nds32.c binutils-2.24/bfd/cpu-nds32.c +--- binutils-2.24.orig/bfd/cpu-nds32.c 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-2.24/bfd/cpu-nds32.c 2016-04-10 20:30:46.000000000 +0200 +@@ -0,0 +1,44 @@ ++/* BFD support for the NDS32 processor ++ Copyright (C) 2012-2013 Free Software Foundation, Inc. ++ Contributed by Andes Technology Corporation. ++ ++ 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 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA. */ ++ ++#include "sysdep.h" ++#include "bfd.h" ++#include "libbfd.h" ++#include "elf-bfd.h" ++ ++#define N(number, print, default, next) \ ++ {32, 32, 8, bfd_arch_nds32, number, "nds32", print, 4, default, \ ++ bfd_default_compatible, bfd_default_scan, bfd_arch_default_fill, next } ++ ++#define NEXT &arch_info_struct[0] ++#define NDS32V2_NEXT &arch_info_struct[1] ++#define NDS32V3_NEXT &arch_info_struct[2] ++#define NDS32V3M_NEXT &arch_info_struct[3] ++ ++static const bfd_arch_info_type arch_info_struct[] = { ++ N (bfd_mach_n1h, "n1h", FALSE, NDS32V2_NEXT), ++ N (bfd_mach_n1h_v2, "n1h_v2", FALSE, NDS32V3_NEXT), ++ N (bfd_mach_n1h_v3, "n1h_v3", FALSE, NDS32V3M_NEXT), ++ N (bfd_mach_n1h_v3m, "n1h_v3m", FALSE, NULL), ++}; ++ ++const bfd_arch_info_type bfd_nds32_arch = ++ N (bfd_mach_n1, "n1h", TRUE, NEXT); +diff -Nur binutils-2.24.orig/bfd/doc/aoutx.texi binutils-2.24/bfd/doc/aoutx.texi +--- binutils-2.24.orig/bfd/doc/aoutx.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/aoutx.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,213 +0,0 @@ +-@section a.out backends +- +- +-@strong{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 +-@code{aout_32_swap_exec_header_in}, @code{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}: +- +-@example +- #define ARCH_SIZE 32 +- #include "aoutx.h" +-@end example +- +-Which exports names: +- +-@example +- ... +- aout_32_canonicalize_reloc +- aout_32_find_nearest_line +- aout_32_get_lineno +- aout_32_get_reloc_upper_bound +- ... +-@end example +- +-from @file{sunos.c}: +- +-@example +- #define TARGET_NAME "a.out-sunos-big" +- #define VECNAME sunos_big_vec +- #include "aoutf1.h" +-@end example +- +-requires all the names from @file{aout32.c}, and produces the jump vector +- +-@example +- sunos_big_vec +-@end example +- +-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: +- +-@example +- HOST_PAGE_SIZE +- HOST_SEGMENT_SIZE +- HOST_MACHINE_ARCH (optional) +- HOST_MACHINE_MACHINE (optional) +- HOST_TEXT_START_ADDR +- HOST_STACK_END_ADDR +-@end example +- +-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: +- +-@example +- TDEFAULTS = -DDEFAULT_VECTOR=host_aout_big_vec +- TDEPFILES= host-aout.o trad-core.o +-@end example +- +-in the @file{config/@var{XXX}.mt} file, and modify @file{configure.in} +-to use the +-@file{@var{XXX}.mt} file (by setting "@code{bfd_target=XXX}") when your +-configuration is selected. +- +-@subsection Relocations +- +- +-@strong{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. +- +-@subsection Internal entry points +- +- +-@strong{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). +- +-@findex aout_@var{size}_swap_exec_header_in +-@subsubsection @code{aout_@var{size}_swap_exec_header_in} +-@strong{Synopsis} +-@example +-void aout_@var{size}_swap_exec_header_in, +- (bfd *abfd, +- struct external_exec *bytes, +- struct internal_exec *execp); +-@end example +-@strong{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}. +- +-@findex aout_@var{size}_swap_exec_header_out +-@subsubsection @code{aout_@var{size}_swap_exec_header_out} +-@strong{Synopsis} +-@example +-void aout_@var{size}_swap_exec_header_out +- (bfd *abfd, +- struct internal_exec *execp, +- struct external_exec *raw_bytes); +-@end example +-@strong{Description}@* +-Swap the information in an internal exec header structure +-@var{execp} into the buffer @var{raw_bytes} ready for writing to disk. +- +-@findex aout_@var{size}_some_aout_object_p +-@subsubsection @code{aout_@var{size}_some_aout_object_p} +-@strong{Synopsis} +-@example +-const bfd_target *aout_@var{size}_some_aout_object_p +- (bfd *abfd, +- struct internal_exec *execp, +- const bfd_target *(*callback_to_real_object_p) (bfd *)); +-@end example +-@strong{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. +- +-@findex aout_@var{size}_mkobject +-@subsubsection @code{aout_@var{size}_mkobject} +-@strong{Synopsis} +-@example +-bfd_boolean aout_@var{size}_mkobject, (bfd *abfd); +-@end example +-@strong{Description}@* +-Initialize BFD @var{abfd} for use with a.out files. +- +-@findex aout_@var{size}_machine_type +-@subsubsection @code{aout_@var{size}_machine_type} +-@strong{Synopsis} +-@example +-enum machine_type aout_@var{size}_machine_type +- (enum bfd_architecture arch, +- unsigned long machine, +- bfd_boolean *unknown); +-@end example +-@strong{Description}@* +-Keep track of machine architecture and machine type for +-a.out's. Return the @code{machine_type} for a particular +-architecture and machine, or @code{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. +- +-@findex aout_@var{size}_set_arch_mach +-@subsubsection @code{aout_@var{size}_set_arch_mach} +-@strong{Synopsis} +-@example +-bfd_boolean aout_@var{size}_set_arch_mach, +- (bfd *, +- enum bfd_architecture arch, +- unsigned long machine); +-@end example +-@strong{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. +- +-@findex aout_@var{size}_new_section_hook +-@subsubsection @code{aout_@var{size}_new_section_hook} +-@strong{Synopsis} +-@example +-bfd_boolean aout_@var{size}_new_section_hook, +- (bfd *abfd, +- asection *newsect); +-@end example +-@strong{Description}@* +-Called by the BFD in response to a @code{bfd_make_section} +-request. +- +diff -Nur binutils-2.24.orig/bfd/doc/archive.texi binutils-2.24/bfd/doc/archive.texi +--- binutils-2.24.orig/bfd/doc/archive.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/archive.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,105 +0,0 @@ +-@section Archives +- +- +-@strong{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 @code{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. +- +-A BFD returned by @code{bfd_openr_next_archived_file} can be +-closed manually with @code{bfd_close}. If you do not close it, +-then a second iteration through the members of an archive may +-return the same BFD. If you close the archive BFD, then all +-the member BFDs will automatically be closed as well. +- +-Archive contents of output BFDs are chained through the +-@code{archive_next} pointer in a BFD. The first one is findable +-through the @code{archive_head} slot of the archive. Set it with +-@code{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 @code{archive.c}. +- +-@subsection Archive functions +- +- +-@findex bfd_get_next_mapent +-@subsubsection @code{bfd_get_next_mapent} +-@strong{Synopsis} +-@example +-symindex bfd_get_next_mapent +- (bfd *abfd, symindex previous, carsym **sym); +-@end example +-@strong{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 @code{BFD_NO_MORE_SYMBOLS} as the @var{previous} entry to get +-the first one; returns @code{BFD_NO_MORE_SYMBOLS} when you've already +-got the last one. +- +-A @code{carsym} is a canonical archive symbol. The only +-user-visible element is its name, a null-terminated string. +- +-@findex bfd_set_archive_head +-@subsubsection @code{bfd_set_archive_head} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_set_archive_head (bfd *output, bfd *new_head); +-@end example +-@strong{Description}@* +-Set the head of the chain of +-BFDs contained in the archive @var{output} to @var{new_head}. +- +-@findex bfd_openr_next_archived_file +-@subsubsection @code{bfd_openr_next_archived_file} +-@strong{Synopsis} +-@example +-bfd *bfd_openr_next_archived_file (bfd *archive, bfd *previous); +-@end example +-@strong{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. +- +diff -Nur binutils-2.24.orig/bfd/doc/archures.texi binutils-2.24/bfd/doc/archures.texi +--- binutils-2.24.orig/bfd/doc/archures.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/archures.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,706 +0,0 @@ +-@section Architectures +-BFD keeps one atom in a BFD describing the +-architecture of the data attached to the BFD: a pointer to a +-@code{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 +-@code{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 +- +- +-@strong{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. +-@example +-enum bfd_architecture +-@{ +- bfd_arch_unknown, /* File arch not known. */ +- bfd_arch_obscure, /* Arch known, not one of these. */ +- bfd_arch_m68k, /* Motorola 68xxx */ +-#define bfd_mach_m68000 1 +-#define bfd_mach_m68008 2 +-#define bfd_mach_m68010 3 +-#define bfd_mach_m68020 4 +-#define bfd_mach_m68030 5 +-#define bfd_mach_m68040 6 +-#define bfd_mach_m68060 7 +-#define bfd_mach_cpu32 8 +-#define bfd_mach_fido 9 +-#define bfd_mach_mcf_isa_a_nodiv 10 +-#define bfd_mach_mcf_isa_a 11 +-#define bfd_mach_mcf_isa_a_mac 12 +-#define bfd_mach_mcf_isa_a_emac 13 +-#define bfd_mach_mcf_isa_aplus 14 +-#define bfd_mach_mcf_isa_aplus_mac 15 +-#define bfd_mach_mcf_isa_aplus_emac 16 +-#define bfd_mach_mcf_isa_b_nousp 17 +-#define bfd_mach_mcf_isa_b_nousp_mac 18 +-#define bfd_mach_mcf_isa_b_nousp_emac 19 +-#define bfd_mach_mcf_isa_b 20 +-#define bfd_mach_mcf_isa_b_mac 21 +-#define bfd_mach_mcf_isa_b_emac 22 +-#define bfd_mach_mcf_isa_b_float 23 +-#define bfd_mach_mcf_isa_b_float_mac 24 +-#define bfd_mach_mcf_isa_b_float_emac 25 +-#define bfd_mach_mcf_isa_c 26 +-#define bfd_mach_mcf_isa_c_mac 27 +-#define bfd_mach_mcf_isa_c_emac 28 +-#define bfd_mach_mcf_isa_c_nodiv 29 +-#define bfd_mach_mcf_isa_c_nodiv_mac 30 +-#define bfd_mach_mcf_isa_c_nodiv_emac 31 +- 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_or32, /* OpenRISC 32 */ +- +- 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_sparclet 2 +-#define bfd_mach_sparc_sparclite 3 +-#define bfd_mach_sparc_v8plus 4 +-#define bfd_mach_sparc_v8plusa 5 /* with ultrasparc add'ns. */ +-#define bfd_mach_sparc_sparclite_le 6 +-#define bfd_mach_sparc_v9 7 +-#define bfd_mach_sparc_v9a 8 /* with ultrasparc add'ns. */ +-#define bfd_mach_sparc_v8plusb 9 /* with cheetah add'ns. */ +-#define bfd_mach_sparc_v9b 10 /* with cheetah add'ns. */ +-/* Nonzero if MACH has the v9 instruction set. */ +-#define bfd_mach_sparc_v9_p(mach) \ +- ((mach) >= bfd_mach_sparc_v8plus && (mach) <= bfd_mach_sparc_v9b \ +- && (mach) != bfd_mach_sparc_sparclite_le) +-/* Nonzero if MACH is a 64 bit sparc architecture. */ +-#define bfd_mach_sparc_64bit_p(mach) \ +- ((mach) >= bfd_mach_sparc_v9 && (mach) != bfd_mach_sparc_v8plusb) +- bfd_arch_spu, /* PowerPC SPU */ +-#define bfd_mach_spu 256 +- bfd_arch_mips, /* MIPS Rxxxx */ +-#define bfd_mach_mips3000 3000 +-#define bfd_mach_mips3900 3900 +-#define bfd_mach_mips4000 4000 +-#define bfd_mach_mips4010 4010 +-#define bfd_mach_mips4100 4100 +-#define bfd_mach_mips4111 4111 +-#define bfd_mach_mips4120 4120 +-#define bfd_mach_mips4300 4300 +-#define bfd_mach_mips4400 4400 +-#define bfd_mach_mips4600 4600 +-#define bfd_mach_mips4650 4650 +-#define bfd_mach_mips5000 5000 +-#define bfd_mach_mips5400 5400 +-#define bfd_mach_mips5500 5500 +-#define bfd_mach_mips5900 5900 +-#define bfd_mach_mips6000 6000 +-#define bfd_mach_mips7000 7000 +-#define bfd_mach_mips8000 8000 +-#define bfd_mach_mips9000 9000 +-#define bfd_mach_mips10000 10000 +-#define bfd_mach_mips12000 12000 +-#define bfd_mach_mips14000 14000 +-#define bfd_mach_mips16000 16000 +-#define bfd_mach_mips16 16 +-#define bfd_mach_mips5 5 +-#define bfd_mach_mips_loongson_2e 3001 +-#define bfd_mach_mips_loongson_2f 3002 +-#define bfd_mach_mips_loongson_3a 3003 +-#define bfd_mach_mips_sb1 12310201 /* octal 'SB', 01 */ +-#define bfd_mach_mips_octeon 6501 +-#define bfd_mach_mips_octeonp 6601 +-#define bfd_mach_mips_octeon2 6502 +-#define bfd_mach_mips_xlr 887682 /* decimal 'XLR' */ +-#define bfd_mach_mipsisa32 32 +-#define bfd_mach_mipsisa32r2 33 +-#define bfd_mach_mipsisa64 64 +-#define bfd_mach_mipsisa64r2 65 +-#define bfd_mach_mips_micromips 96 +- bfd_arch_i386, /* Intel 386 */ +-#define bfd_mach_i386_intel_syntax (1 << 0) +-#define bfd_mach_i386_i8086 (1 << 1) +-#define bfd_mach_i386_i386 (1 << 2) +-#define bfd_mach_x86_64 (1 << 3) +-#define bfd_mach_x64_32 (1 << 4) +-#define bfd_mach_i386_i386_intel_syntax (bfd_mach_i386_i386 | bfd_mach_i386_intel_syntax) +-#define bfd_mach_x86_64_intel_syntax (bfd_mach_x86_64 | bfd_mach_i386_intel_syntax) +-#define bfd_mach_x64_32_intel_syntax (bfd_mach_x64_32 | bfd_mach_i386_intel_syntax) +- bfd_arch_l1om, /* Intel L1OM */ +-#define bfd_mach_l1om (1 << 5) +-#define bfd_mach_l1om_intel_syntax (bfd_mach_l1om | bfd_mach_i386_intel_syntax) +- bfd_arch_k1om, /* Intel K1OM */ +-#define bfd_mach_k1om (1 << 6) +-#define bfd_mach_k1om_intel_syntax (bfd_mach_k1om | bfd_mach_i386_intel_syntax) +-#define bfd_mach_i386_nacl (1 << 7) +-#define bfd_mach_i386_i386_nacl (bfd_mach_i386_i386 | bfd_mach_i386_nacl) +-#define bfd_mach_x86_64_nacl (bfd_mach_x86_64 | bfd_mach_i386_nacl) +-#define bfd_mach_x64_32_nacl (bfd_mach_x64_32 | bfd_mach_i386_nacl) +- bfd_arch_we32k, /* AT&T WE32xxx */ +- bfd_arch_tahoe, /* CCI/Harris Tahoe */ +- bfd_arch_i860, /* Intel 860 */ +- bfd_arch_i370, /* IBM 360/370 Mainframes */ +- bfd_arch_romp, /* IBM ROMP PC/RT */ +- bfd_arch_convex, /* Convex */ +- bfd_arch_m88k, /* Motorola 88xxx */ +- bfd_arch_m98k, /* Motorola 98xxx */ +- bfd_arch_pyramid, /* Pyramid Technology */ +- bfd_arch_h8300, /* Renesas H8/300 (formerly Hitachi H8/300) */ +-#define bfd_mach_h8300 1 +-#define bfd_mach_h8300h 2 +-#define bfd_mach_h8300s 3 +-#define bfd_mach_h8300hn 4 +-#define bfd_mach_h8300sn 5 +-#define bfd_mach_h8300sx 6 +-#define bfd_mach_h8300sxn 7 +- bfd_arch_pdp11, /* DEC PDP-11 */ +- bfd_arch_plugin, +- bfd_arch_powerpc, /* PowerPC */ +-#define bfd_mach_ppc 32 +-#define bfd_mach_ppc64 64 +-#define bfd_mach_ppc_403 403 +-#define bfd_mach_ppc_403gc 4030 +-#define bfd_mach_ppc_405 405 +-#define bfd_mach_ppc_505 505 +-#define bfd_mach_ppc_601 601 +-#define bfd_mach_ppc_602 602 +-#define bfd_mach_ppc_603 603 +-#define bfd_mach_ppc_ec603e 6031 +-#define bfd_mach_ppc_604 604 +-#define bfd_mach_ppc_620 620 +-#define bfd_mach_ppc_630 630 +-#define bfd_mach_ppc_750 750 +-#define bfd_mach_ppc_860 860 +-#define bfd_mach_ppc_a35 35 +-#define bfd_mach_ppc_rs64ii 642 +-#define bfd_mach_ppc_rs64iii 643 +-#define bfd_mach_ppc_7400 7400 +-#define bfd_mach_ppc_e500 500 +-#define bfd_mach_ppc_e500mc 5001 +-#define bfd_mach_ppc_e500mc64 5005 +-#define bfd_mach_ppc_e5500 5006 +-#define bfd_mach_ppc_e6500 5007 +-#define bfd_mach_ppc_titan 83 +-#define bfd_mach_ppc_vle 84 +- bfd_arch_rs6000, /* IBM RS/6000 */ +-#define bfd_mach_rs6k 6000 +-#define bfd_mach_rs6k_rs1 6001 +-#define bfd_mach_rs6k_rsc 6003 +-#define bfd_mach_rs6k_rs2 6002 +- bfd_arch_hppa, /* HP PA RISC */ +-#define bfd_mach_hppa10 10 +-#define bfd_mach_hppa11 11 +-#define bfd_mach_hppa20 20 +-#define bfd_mach_hppa20w 25 +- bfd_arch_d10v, /* Mitsubishi D10V */ +-#define bfd_mach_d10v 1 +-#define bfd_mach_d10v_ts2 2 +-#define bfd_mach_d10v_ts3 3 +- bfd_arch_d30v, /* Mitsubishi D30V */ +- bfd_arch_dlx, /* DLX */ +- bfd_arch_m68hc11, /* Motorola 68HC11 */ +- bfd_arch_m68hc12, /* Motorola 68HC12 */ +-#define bfd_mach_m6812_default 0 +-#define bfd_mach_m6812 1 +-#define bfd_mach_m6812s 2 +- bfd_arch_m9s12x, /* Freescale S12X */ +- bfd_arch_m9s12xg, /* Freescale XGATE */ +- bfd_arch_z8k, /* Zilog Z8000 */ +-#define bfd_mach_z8001 1 +-#define bfd_mach_z8002 2 +- bfd_arch_h8500, /* Renesas H8/500 (formerly Hitachi H8/500) */ +- bfd_arch_sh, /* Renesas / SuperH SH (formerly Hitachi SH) */ +-#define bfd_mach_sh 1 +-#define bfd_mach_sh2 0x20 +-#define bfd_mach_sh_dsp 0x2d +-#define bfd_mach_sh2a 0x2a +-#define bfd_mach_sh2a_nofpu 0x2b +-#define bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu 0x2a1 +-#define bfd_mach_sh2a_nofpu_or_sh3_nommu 0x2a2 +-#define bfd_mach_sh2a_or_sh4 0x2a3 +-#define bfd_mach_sh2a_or_sh3e 0x2a4 +-#define bfd_mach_sh2e 0x2e +-#define bfd_mach_sh3 0x30 +-#define bfd_mach_sh3_nommu 0x31 +-#define bfd_mach_sh3_dsp 0x3d +-#define bfd_mach_sh3e 0x3e +-#define bfd_mach_sh4 0x40 +-#define bfd_mach_sh4_nofpu 0x41 +-#define bfd_mach_sh4_nommu_nofpu 0x42 +-#define bfd_mach_sh4a 0x4a +-#define bfd_mach_sh4a_nofpu 0x4b +-#define bfd_mach_sh4al_dsp 0x4d +-#define bfd_mach_sh5 0x50 +- bfd_arch_alpha, /* Dec Alpha */ +-#define bfd_mach_alpha_ev4 0x10 +-#define bfd_mach_alpha_ev5 0x20 +-#define bfd_mach_alpha_ev6 0x30 +- bfd_arch_arm, /* Advanced Risc Machines ARM. */ +-#define bfd_mach_arm_unknown 0 +-#define bfd_mach_arm_2 1 +-#define bfd_mach_arm_2a 2 +-#define bfd_mach_arm_3 3 +-#define bfd_mach_arm_3M 4 +-#define bfd_mach_arm_4 5 +-#define bfd_mach_arm_4T 6 +-#define bfd_mach_arm_5 7 +-#define bfd_mach_arm_5T 8 +-#define bfd_mach_arm_5TE 9 +-#define bfd_mach_arm_XScale 10 +-#define bfd_mach_arm_ep9312 11 +-#define bfd_mach_arm_iWMMXt 12 +-#define bfd_mach_arm_iWMMXt2 13 +- bfd_arch_ns32k, /* National Semiconductors ns32000 */ +- bfd_arch_w65, /* WDC 65816 */ +- bfd_arch_tic30, /* Texas Instruments TMS320C30 */ +- bfd_arch_tic4x, /* Texas Instruments TMS320C3X/4X */ +-#define bfd_mach_tic3x 30 +-#define bfd_mach_tic4x 40 +- bfd_arch_tic54x, /* Texas Instruments TMS320C54X */ +- bfd_arch_tic6x, /* Texas Instruments TMS320C6X */ +- bfd_arch_tic80, /* TI TMS320c80 (MVP) */ +- bfd_arch_v850, /* NEC V850 */ +- bfd_arch_v850_rh850,/* NEC V850 (using RH850 ABI) */ +-#define bfd_mach_v850 1 +-#define bfd_mach_v850e 'E' +-#define bfd_mach_v850e1 '1' +-#define bfd_mach_v850e2 0x4532 +-#define bfd_mach_v850e2v3 0x45325633 +-#define bfd_mach_v850e3v5 0x45335635 /* ('E'|'3'|'V'|'5') */ +- bfd_arch_arc, /* ARC Cores */ +-#define bfd_mach_arc_5 5 +-#define bfd_mach_arc_6 6 +-#define bfd_mach_arc_7 7 +-#define bfd_mach_arc_8 8 +- bfd_arch_m32c, /* Renesas M16C/M32C. */ +-#define bfd_mach_m16c 0x75 +-#define bfd_mach_m32c 0x78 +- bfd_arch_m32r, /* Renesas M32R (formerly Mitsubishi M32R/D) */ +-#define bfd_mach_m32r 1 /* For backwards compatibility. */ +-#define bfd_mach_m32rx 'x' +-#define bfd_mach_m32r2 '2' +- bfd_arch_mn10200, /* Matsushita MN10200 */ +- bfd_arch_mn10300, /* Matsushita MN10300 */ +-#define bfd_mach_mn10300 300 +-#define bfd_mach_am33 330 +-#define bfd_mach_am33_2 332 +- bfd_arch_fr30, +-#define bfd_mach_fr30 0x46523330 +- bfd_arch_frv, +-#define bfd_mach_frv 1 +-#define bfd_mach_frvsimple 2 +-#define bfd_mach_fr300 300 +-#define bfd_mach_fr400 400 +-#define bfd_mach_fr450 450 +-#define bfd_mach_frvtomcat 499 /* fr500 prototype */ +-#define bfd_mach_fr500 500 +-#define bfd_mach_fr550 550 +- bfd_arch_moxie, /* The moxie processor */ +-#define bfd_mach_moxie 1 +- bfd_arch_mcore, +- bfd_arch_mep, +-#define bfd_mach_mep 1 +-#define bfd_mach_mep_h1 0x6831 +-#define bfd_mach_mep_c5 0x6335 +- bfd_arch_metag, +-#define bfd_mach_metag 1 +- bfd_arch_ia64, /* HP/Intel ia64 */ +-#define bfd_mach_ia64_elf64 64 +-#define bfd_mach_ia64_elf32 32 +- bfd_arch_ip2k, /* Ubicom IP2K microcontrollers. */ +-#define bfd_mach_ip2022 1 +-#define bfd_mach_ip2022ext 2 +- bfd_arch_iq2000, /* Vitesse IQ2000. */ +-#define bfd_mach_iq2000 1 +-#define bfd_mach_iq10 2 +- bfd_arch_epiphany, /* Adapteva EPIPHANY */ +-#define bfd_mach_epiphany16 1 +-#define bfd_mach_epiphany32 2 +- bfd_arch_mt, +-#define bfd_mach_ms1 1 +-#define bfd_mach_mrisc2 2 +-#define bfd_mach_ms2 3 +- bfd_arch_pj, +- bfd_arch_avr, /* Atmel AVR microcontrollers. */ +-#define bfd_mach_avr1 1 +-#define bfd_mach_avr2 2 +-#define bfd_mach_avr25 25 +-#define bfd_mach_avr3 3 +-#define bfd_mach_avr31 31 +-#define bfd_mach_avr35 35 +-#define bfd_mach_avr4 4 +-#define bfd_mach_avr5 5 +-#define bfd_mach_avr51 51 +-#define bfd_mach_avr6 6 +-#define bfd_mach_avrxmega1 101 +-#define bfd_mach_avrxmega2 102 +-#define bfd_mach_avrxmega3 103 +-#define bfd_mach_avrxmega4 104 +-#define bfd_mach_avrxmega5 105 +-#define bfd_mach_avrxmega6 106 +-#define bfd_mach_avrxmega7 107 +- bfd_arch_bfin, /* ADI Blackfin */ +-#define bfd_mach_bfin 1 +- bfd_arch_cr16, /* National Semiconductor CompactRISC (ie CR16). */ +-#define bfd_mach_cr16 1 +- bfd_arch_cr16c, /* National Semiconductor CompactRISC. */ +-#define bfd_mach_cr16c 1 +- bfd_arch_crx, /* National Semiconductor CRX. */ +-#define bfd_mach_crx 1 +- bfd_arch_cris, /* Axis CRIS */ +-#define bfd_mach_cris_v0_v10 255 +-#define bfd_mach_cris_v32 32 +-#define bfd_mach_cris_v10_v32 1032 +- bfd_arch_rl78, +-#define bfd_mach_rl78 0x75 +- bfd_arch_rx, /* Renesas RX. */ +-#define bfd_mach_rx 0x75 +- bfd_arch_s390, /* IBM s390 */ +-#define bfd_mach_s390_31 31 +-#define bfd_mach_s390_64 64 +- bfd_arch_score, /* Sunplus score */ +-#define bfd_mach_score3 3 +-#define bfd_mach_score7 7 +- bfd_arch_openrisc, /* OpenRISC */ +- bfd_arch_mmix, /* Donald Knuth's educational processor. */ +- bfd_arch_xstormy16, +-#define bfd_mach_xstormy16 1 +- bfd_arch_msp430, /* Texas Instruments MSP430 architecture. */ +-#define bfd_mach_msp11 11 +-#define bfd_mach_msp110 110 +-#define bfd_mach_msp12 12 +-#define bfd_mach_msp13 13 +-#define bfd_mach_msp14 14 +-#define bfd_mach_msp15 15 +-#define bfd_mach_msp16 16 +-#define bfd_mach_msp20 20 +-#define bfd_mach_msp21 21 +-#define bfd_mach_msp22 22 +-#define bfd_mach_msp23 23 +-#define bfd_mach_msp24 24 +-#define bfd_mach_msp26 26 +-#define bfd_mach_msp31 31 +-#define bfd_mach_msp32 32 +-#define bfd_mach_msp33 33 +-#define bfd_mach_msp41 41 +-#define bfd_mach_msp42 42 +-#define bfd_mach_msp43 43 +-#define bfd_mach_msp44 44 +-#define bfd_mach_msp430x 45 +-#define bfd_mach_msp46 46 +-#define bfd_mach_msp47 47 +-#define bfd_mach_msp54 54 +- bfd_arch_xc16x, /* Infineon's XC16X Series. */ +-#define bfd_mach_xc16x 1 +-#define bfd_mach_xc16xl 2 +-#define bfd_mach_xc16xs 3 +- bfd_arch_xgate, /* Freescale XGATE */ +-#define bfd_mach_xgate 1 +- bfd_arch_xtensa, /* Tensilica's Xtensa cores. */ +-#define bfd_mach_xtensa 1 +- bfd_arch_z80, +-#define bfd_mach_z80strict 1 /* No undocumented opcodes. */ +-#define bfd_mach_z80 3 /* With ixl, ixh, iyl, and iyh. */ +-#define bfd_mach_z80full 7 /* All undocumented instructions. */ +-#define bfd_mach_r800 11 /* R800: successor with multiplication. */ +- bfd_arch_lm32, /* Lattice Mico32 */ +-#define bfd_mach_lm32 1 +- bfd_arch_microblaze,/* Xilinx MicroBlaze. */ +- bfd_arch_tilepro, /* Tilera TILEPro */ +- bfd_arch_tilegx, /* Tilera TILE-Gx */ +-#define bfd_mach_tilepro 1 +-#define bfd_mach_tilegx 1 +-#define bfd_mach_tilegx32 2 +- bfd_arch_aarch64, /* AArch64 */ +-#define bfd_mach_aarch64 0 +-#define bfd_mach_aarch64_ilp32 32 +- bfd_arch_nios2, +-#define bfd_mach_nios2 0 +- bfd_arch_last +- @}; +-@end example +- +-@subsection bfd_arch_info +- +- +-@strong{Description}@* +-This structure contains information on architectures for use +-within BFD. +-@example +- +-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. +- The default arch should be the first entry for an arch so that +- all the entries for that arch can be accessed via @code{next}. */ +- bfd_boolean the_default; +- const struct bfd_arch_info * (*compatible) +- (const struct bfd_arch_info *a, const struct bfd_arch_info *b); +- +- bfd_boolean (*scan) (const struct bfd_arch_info *, const char *); +- +- /* Allocate via bfd_malloc and return a fill buffer of size COUNT. If +- IS_BIGENDIAN is TRUE, the order of bytes is big endian. If CODE is +- TRUE, the buffer contains code. */ +- void *(*fill) (bfd_size_type count, bfd_boolean is_bigendian, +- bfd_boolean code); +- +- const struct bfd_arch_info *next; +-@} +-bfd_arch_info_type; +- +-@end example +- +-@findex bfd_printable_name +-@subsubsection @code{bfd_printable_name} +-@strong{Synopsis} +-@example +-const char *bfd_printable_name (bfd *abfd); +-@end example +-@strong{Description}@* +-Return a printable string representing the architecture and machine +-from the pointer to the architecture info structure. +- +-@findex bfd_scan_arch +-@subsubsection @code{bfd_scan_arch} +-@strong{Synopsis} +-@example +-const bfd_arch_info_type *bfd_scan_arch (const char *string); +-@end example +-@strong{Description}@* +-Figure out if BFD supports any cpu which could be described with +-the name @var{string}. Return a pointer to an @code{arch_info} +-structure if a machine is found, otherwise NULL. +- +-@findex bfd_arch_list +-@subsubsection @code{bfd_arch_list} +-@strong{Synopsis} +-@example +-const char **bfd_arch_list (void); +-@end example +-@strong{Description}@* +-Return a freshly malloced NULL-terminated vector of the names +-of all the valid BFD architectures. Do not modify the names. +- +-@findex bfd_arch_get_compatible +-@subsubsection @code{bfd_arch_get_compatible} +-@strong{Synopsis} +-@example +-const bfd_arch_info_type *bfd_arch_get_compatible +- (const bfd *abfd, const bfd *bbfd, bfd_boolean accept_unknowns); +-@end example +-@strong{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 @code{arch_info} structure +-describing the compatible machine. +- +-@findex bfd_default_arch_struct +-@subsubsection @code{bfd_default_arch_struct} +-@strong{Description}@* +-The @code{bfd_default_arch_struct} is an item of +-@code{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. +-@example +-extern const bfd_arch_info_type bfd_default_arch_struct; +-@end example +- +-@findex bfd_set_arch_info +-@subsubsection @code{bfd_set_arch_info} +-@strong{Synopsis} +-@example +-void bfd_set_arch_info (bfd *abfd, const bfd_arch_info_type *arg); +-@end example +-@strong{Description}@* +-Set the architecture info of @var{abfd} to @var{arg}. +- +-@findex bfd_default_set_arch_mach +-@subsubsection @code{bfd_default_set_arch_mach} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_default_set_arch_mach +- (bfd *abfd, enum bfd_architecture arch, unsigned long mach); +-@end example +-@strong{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 @code{arch_info} +-pointer. +- +-@findex bfd_get_arch +-@subsubsection @code{bfd_get_arch} +-@strong{Synopsis} +-@example +-enum bfd_architecture bfd_get_arch (bfd *abfd); +-@end example +-@strong{Description}@* +-Return the enumerated type which describes the BFD @var{abfd}'s +-architecture. +- +-@findex bfd_get_mach +-@subsubsection @code{bfd_get_mach} +-@strong{Synopsis} +-@example +-unsigned long bfd_get_mach (bfd *abfd); +-@end example +-@strong{Description}@* +-Return the long type which describes the BFD @var{abfd}'s +-machine. +- +-@findex bfd_arch_bits_per_byte +-@subsubsection @code{bfd_arch_bits_per_byte} +-@strong{Synopsis} +-@example +-unsigned int bfd_arch_bits_per_byte (bfd *abfd); +-@end example +-@strong{Description}@* +-Return the number of bits in one of the BFD @var{abfd}'s +-architecture's bytes. +- +-@findex bfd_arch_bits_per_address +-@subsubsection @code{bfd_arch_bits_per_address} +-@strong{Synopsis} +-@example +-unsigned int bfd_arch_bits_per_address (bfd *abfd); +-@end example +-@strong{Description}@* +-Return the number of bits in one of the BFD @var{abfd}'s +-architecture's addresses. +- +-@findex bfd_default_compatible +-@subsubsection @code{bfd_default_compatible} +-@strong{Synopsis} +-@example +-const bfd_arch_info_type *bfd_default_compatible +- (const bfd_arch_info_type *a, const bfd_arch_info_type *b); +-@end example +-@strong{Description}@* +-The default function for testing for compatibility. +- +-@findex bfd_default_scan +-@subsubsection @code{bfd_default_scan} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_default_scan +- (const struct bfd_arch_info *info, const char *string); +-@end example +-@strong{Description}@* +-The default function for working out whether this is an +-architecture hit and a machine hit. +- +-@findex bfd_get_arch_info +-@subsubsection @code{bfd_get_arch_info} +-@strong{Synopsis} +-@example +-const bfd_arch_info_type *bfd_get_arch_info (bfd *abfd); +-@end example +-@strong{Description}@* +-Return the architecture info struct in @var{abfd}. +- +-@findex bfd_lookup_arch +-@subsubsection @code{bfd_lookup_arch} +-@strong{Synopsis} +-@example +-const bfd_arch_info_type *bfd_lookup_arch +- (enum bfd_architecture arch, unsigned long machine); +-@end example +-@strong{Description}@* +-Look for the architecture 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. +- +-@findex bfd_printable_arch_mach +-@subsubsection @code{bfd_printable_arch_mach} +-@strong{Synopsis} +-@example +-const char *bfd_printable_arch_mach +- (enum bfd_architecture arch, unsigned long machine); +-@end example +-@strong{Description}@* +-Return a printable string representing the architecture and +-machine type. +- +-This routine is depreciated. +- +-@findex bfd_octets_per_byte +-@subsubsection @code{bfd_octets_per_byte} +-@strong{Synopsis} +-@example +-unsigned int bfd_octets_per_byte (bfd *abfd); +-@end example +-@strong{Description}@* +-Return the number of octets (8-bit quantities) per target byte +-(minimum addressable unit). In most cases, this will be one, but some +-DSP targets have 16, 32, or even 48 bits per byte. +- +-@findex bfd_arch_mach_octets_per_byte +-@subsubsection @code{bfd_arch_mach_octets_per_byte} +-@strong{Synopsis} +-@example +-unsigned int bfd_arch_mach_octets_per_byte +- (enum bfd_architecture arch, unsigned long machine); +-@end example +-@strong{Description}@* +-See bfd_octets_per_byte. +- +-This routine is provided for those cases where a bfd * is not +-available +- +-@findex bfd_arch_default_fill +-@subsubsection @code{bfd_arch_default_fill} +-@strong{Synopsis} +-@example +-void *bfd_arch_default_fill (bfd_size_type count, +- bfd_boolean is_bigendian, +- bfd_boolean code); +-@end example +-@strong{Description}@* +-Allocate via bfd_malloc and return a fill buffer of size COUNT. +-If IS_BIGENDIAN is TRUE, the order of bytes is big endian. If +-CODE is TRUE, the buffer contains code. +- +diff -Nur binutils-2.24.orig/bfd/doc/bfd.info binutils-2.24/bfd/doc/bfd.info +--- binutils-2.24.orig/bfd/doc/bfd.info 2013-12-02 10:32:19.000000000 +0100 ++++ binutils-2.24/bfd/doc/bfd.info 1970-01-01 01:00:00.000000000 +0100 +@@ -1,13242 +0,0 @@ +-This is bfd.info, produced by makeinfo version 4.8 from bfd.texinfo. +- +-INFO-DIR-SECTION Software development +-START-INFO-DIR-ENTRY +-* Bfd: (bfd). The Binary File Descriptor library. +-END-INFO-DIR-ENTRY +- +- This file documents the BFD library. +- +- Copyright (C) 1991 - 2013 Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.3 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "GNU General Public License" and "Funding Free +-Software", the Front-Cover texts being (a) (see below), and with the +-Back-Cover Texts being (b) (see below). A copy of the license is +-included in the section entitled "GNU Free Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: bfd.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir) +- +- This file documents the binary file descriptor library libbfd. +- +-* Menu: +- +-* Overview:: Overview of BFD +-* BFD front end:: BFD front end +-* BFD back ends:: BFD back ends +-* GNU Free Documentation License:: GNU Free Documentation License +-* BFD Index:: BFD Index +- +- +-File: bfd.info, Node: Overview, Next: BFD front end, Prev: Top, Up: Top +- +-1 Introduction +-************** +- +-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). +- * 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. +- +- * 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. +- +-* Menu: +- +-* History:: History +-* How It Works:: How It Works +-* What BFD Version 2 Can Do:: What BFD Version 2 Can Do +- +- +-File: bfd.info, Node: History, Next: How It Works, Prev: Overview, Up: Overview +- +-1.1 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 (`sac@cygnus.com'), John Gilmore (`gnu@cygnus.com'), K. +-Richard Pixley (`rich@cygnus.com') and David Henkel-Wallace +-(`gumby@cygnus.com'). +- +- +-File: bfd.info, Node: How It Works, Next: What BFD Version 2 Can Do, Prev: History, Up: Overview +- +-1.2 How To Use BFD +-================== +- +-To use the library, include `bfd.h' and link with `libbfd.a'. +- +- BFD provides a common interface to the parts of an object file for a +-calling application. +- +- When an application successfully opens a target file (object, +-archive, or whatever), a pointer to an internal structure is returned. +-This pointer points to a structure called `bfd', described in `bfd.h'. +-Our convention is to call this pointer a BFD, and instances of it +-within code `abfd'. All operations on the target object file are +-applied as methods to the BFD. The mapping is defined within `bfd.h' +-in a set of macros, all beginning with `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 +-`abfd'. +- +- #include "bfd.h" +- +- unsigned int number_of_sections (abfd) +- bfd *abfd; +- { +- return bfd_count_sections (abfd); +- } +- +- The abstraction used within BFD is that an object file has: +- +- * a header, +- +- * a number of sections containing raw data (*note Sections::), +- +- * a set of relocations (*note Relocations::), and +- +- * some symbol information (*note Symbols::). +- 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. +- +- +-File: bfd.info, Node: What BFD Version 2 Can Do, Prev: How It Works, Up: Overview +- +-1.3 What BFD Version 2 Can Do +-============================= +- +-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 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 +- +- +-File: bfd.info, Node: BFD information loss, Next: Canonical format, Up: What BFD Version 2 Can Do +- +-1.3.1 Information Loss +----------------------- +- +-_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 `b.out'. There is nowhere +-in an `a.out' format file to store alignment information on the +-contained data, so when a file is linked from `b.out' and an `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., `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. +- +- _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 `a.out' to +-`b.out'. When a mixture of formats is linked, the information is only +-lost from the files whose format differs from the destination. +- +- +-File: bfd.info, Node: Canonical format, Prev: BFD information loss, Up: What BFD Version 2 Can Do +- +-1.3.2 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. +- +-_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 `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. +- +-_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. +- +-_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. `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 `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. +- +-_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. +- +-_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). +- +- +-File: bfd.info, Node: BFD front end, Next: BFD back ends, Prev: Overview, Up: Top +- +-2 BFD Front End +-*************** +- +-* Menu: +- +-* typedef bfd:: +-* Error reporting:: +-* Miscellaneous:: +-* Memory Usage:: +-* Initialization:: +-* Sections:: +-* Symbols:: +-* Archives:: +-* Formats:: +-* Relocations:: +-* Core Files:: +-* Targets:: +-* Architectures:: +-* Opening and Closing:: +-* Internal:: +-* File Caching:: +-* Linker Functions:: +-* Hash Tables:: +- +- +-File: bfd.info, Node: typedef bfd, Next: Error reporting, Prev: BFD front end, Up: BFD front end +- +-2.1 `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. +- +- +- enum bfd_direction +- { +- no_direction = 0, +- read_direction = 1, +- write_direction = 2, +- both_direction = 3 +- }; +- +- struct bfd +- { +- /* A unique identifier of the BFD */ +- unsigned int id; +- +- /* The filename the application opened the BFD with. */ +- const char *filename; +- +- /* A pointer to the target jump table. */ +- const struct bfd_target *xvec; +- +- /* The IOSTREAM, and corresponding IO vector that provide access +- to the file backing the BFD. */ +- void *iostream; +- const struct bfd_iovec *iovec; +- +- /* 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... */ +- ufile_ptr where; +- +- /* 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 with which the BFD was opened. */ +- enum bfd_direction direction; +- +- /* Format_specific flags. */ +- flagword flags; +- +- /* 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). */ +- +- #define BFD_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 +- +- /* The sections in this BFD specify a memory page. */ +- #define HAS_LOAD_PAGE 0x1000 +- +- /* This BFD has been created by the linker and doesn't correspond +- to any input file. */ +- #define BFD_LINKER_CREATED 0x2000 +- +- /* This may be set before writing out a BFD to request that it +- be written using values for UIDs, GIDs, timestamps, etc. that +- will be consistent from run to run. */ +- #define BFD_DETERMINISTIC_OUTPUT 0x4000 +- +- /* Compress sections in this BFD. */ +- #define BFD_COMPRESS 0x8000 +- +- /* Decompress sections in this BFD. */ +- #define BFD_DECOMPRESS 0x10000 +- +- /* BFD is a dummy, for plugins. */ +- #define BFD_PLUGIN 0x20000 +- +- /* Flags bits to be saved in bfd_preserve_save. */ +- #define BFD_FLAGS_SAVED \ +- (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_PLUGIN) +- +- /* Flags bits which are for BFD use only. */ +- #define BFD_FLAGS_FOR_BFD_USE_MASK \ +- (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \ +- | BFD_PLUGIN | BFD_TRADITIONAL_FORMAT | BFD_DETERMINISTIC_OUTPUT) +- +- /* 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. */ +- ufile_ptr origin; +- +- /* The origin in the archive of the proxy entry. This will +- normally be the same as origin, except for thin archives, +- when it will contain the current offset of the proxy in the +- thin archive rather than the offset of the bfd in its actual +- container. */ +- ufile_ptr proxy_origin; +- +- /* A hash table for section names. */ +- struct bfd_hash_table section_htab; +- +- /* Pointer to linked list of sections. */ +- struct bfd_section *sections; +- +- /* The last section on the section list. */ +- struct bfd_section *section_last; +- +- /* 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). +- Also used by the linker to cache input BFD symbols. */ +- struct bfd_symbol **outsymbols; +- +- /* Used for slurped dynamic symbol tables. */ +- unsigned int dynsymcount; +- +- /* Pointer to structure which contains architecture information. */ +- const struct bfd_arch_info *arch_info; +- +- /* Stuff only useful for archives. */ +- void *arelt_data; +- struct bfd *my_archive; /* The containing archive BFD. */ +- struct bfd *archive_next; /* The next BFD in the archive. */ +- struct bfd *archive_head; /* The first BFD in the archive. */ +- struct bfd *nested_archives; /* List of nested archive in a flattened +- thin archive. */ +- +- /* 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 verilog_data_struct *verilog_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 mmo_data_struct *mmo_data; +- struct sun_core_struct *sun_core_data; +- struct sco5_core_struct *sco5_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; +- struct mach_o_data_struct *mach_o_data; +- struct mach_o_fat_data_struct *mach_o_fat_data; +- struct plugin_data_struct *plugin_data; +- struct bfd_pef_data_struct *pef_data; +- struct bfd_pef_xlib_data_struct *pef_xlib_data; +- struct bfd_sym_data_struct *sym_data; +- void *any; +- } +- tdata; +- +- /* Used by the application to hold private data. */ +- void *usrdata; +- +- /* Where all the allocated stuff under this BFD goes. This is a +- struct objalloc *, but we use void * to avoid requiring the inclusion +- of objalloc.h. */ +- void *memory; +- +- /* Is the file descriptor being cached? That is, can it be closed as +- needed, and re-opened when accessed later? */ +- unsigned int cacheable : 1; +- +- /* 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. */ +- unsigned int target_defaulted : 1; +- +- /* ... and here: (``once'' means at least once). */ +- unsigned int opened_once : 1; +- +- /* Set if we have a locally maintained mtime value, rather than +- getting it from the file each time. */ +- unsigned int mtime_set : 1; +- +- /* Flag set if symbols from this BFD should not be exported. */ +- unsigned int no_export : 1; +- +- /* Remember when output has begun, to stop strange things +- from happening. */ +- unsigned int output_has_begun : 1; +- +- /* Have archive map. */ +- unsigned int has_armap : 1; +- +- /* Set if this is a thin archive. */ +- unsigned int is_thin_archive : 1; +- +- /* Set if only required symbols should be added in the link hash table for +- this object. Used by VMS linkers. */ +- unsigned int selective_search : 1; +- }; +- +- +-File: bfd.info, Node: Error reporting, Next: Miscellaneous, Prev: typedef bfd, Up: BFD front end +- +-2.2 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'. +- +-2.2.1 Type `bfd_error_type' +---------------------------- +- +-The values returned by `bfd_get_error' are defined by the enumerated +-type `bfd_error_type'. +- +- +- typedef enum bfd_error +- { +- bfd_error_no_error = 0, +- bfd_error_system_call, +- bfd_error_invalid_target, +- bfd_error_wrong_format, +- bfd_error_wrong_object_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_missing_dso, +- 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_on_input, +- bfd_error_invalid_error_code +- } +- bfd_error_type; +- +-2.2.1.1 `bfd_get_error' +-....................... +- +-*Synopsis* +- bfd_error_type bfd_get_error (void); +- *Description* +-Return the current BFD error condition. +- +-2.2.1.2 `bfd_set_error' +-....................... +- +-*Synopsis* +- void bfd_set_error (bfd_error_type error_tag, ...); +- *Description* +-Set the BFD error condition to be ERROR_TAG. If ERROR_TAG is +-bfd_error_on_input, then this function takes two more parameters, the +-input bfd where the error occurred, and the bfd_error_type error. +- +-2.2.1.3 `bfd_errmsg' +-.................... +- +-*Synopsis* +- const char *bfd_errmsg (bfd_error_type error_tag); +- *Description* +-Return a string describing the error ERROR_TAG, or the system error if +-ERROR_TAG is `bfd_error_system_call'. +- +-2.2.1.4 `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 MESSAGE is non-NULL and non-empty, the error +-string printed is preceded by MESSAGE, a colon, and a space. It is +-followed by a newline. +- +-2.2.2 BFD error handler +------------------------ +- +-Some BFD functions want to print messages describing the problem. They +-call a BFD error handler function. This function may be overridden by +-the program. +- +- The BFD error handler acts like printf. +- +- +- typedef void (*bfd_error_handler_type) (const char *, ...); +- +-2.2.2.1 `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. +- +-2.2.2.2 `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. +- +-2.2.2.3 `bfd_get_error_handler' +-............................... +- +-*Synopsis* +- bfd_error_handler_type bfd_get_error_handler (void); +- *Description* +-Return the BFD error handler function. +- +-2.2.3 BFD assert handler +------------------------- +- +-If BFD finds an internal inconsistency, the bfd assert handler is +-called with information on the BFD version, BFD source file and line. +-If this happens, most programs linked against BFD are expected to want +-to exit with an error, or mark the current BFD operation as failed, so +-it is recommended to override the default handler, which just calls +-_bfd_error_handler and continues. +- +- +- typedef void (*bfd_assert_handler_type) (const char *bfd_formatmsg, +- const char *bfd_version, +- const char *bfd_file, +- int bfd_line); +- +-2.2.3.1 `bfd_set_assert_handler' +-................................ +- +-*Synopsis* +- bfd_assert_handler_type bfd_set_assert_handler (bfd_assert_handler_type); +- *Description* +-Set the BFD assert handler function. Returns the previous function. +- +-2.2.3.2 `bfd_get_assert_handler' +-................................ +- +-*Synopsis* +- bfd_assert_handler_type bfd_get_assert_handler (void); +- *Description* +-Return the BFD assert handler function. +- +- +-File: bfd.info, Node: Miscellaneous, Next: Memory Usage, Prev: Error reporting, Up: BFD front end +- +-2.3 Miscellaneous +-================= +- +-2.3.1 Miscellaneous functions +------------------------------ +- +-2.3.1.1 `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 SECT attached to bfd ABFD. If an error occurs, +-return -1. +- +-2.3.1.2 `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 ABFD and translate the +-external form of the relocation information attached to SEC into the +-internal canonical form. Place the table into memory at 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 SYMS table is also needed for horrible internal magic reasons. +- +-2.3.1.3 `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 SEC to the values +-REL and COUNT. The argument ABFD is ignored. +- +-2.3.1.4 `bfd_set_file_flags' +-............................ +- +-*Synopsis* +- bfd_boolean bfd_set_file_flags (bfd *abfd, flagword flags); +- *Description* +-Set the flag word in the BFD ABFD to the value FLAGS. +- +- Possible errors are: +- * `bfd_error_wrong_format' - The target bfd was not of object format. +- +- * `bfd_error_invalid_operation' - The target bfd was open for +- reading. +- +- * `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. +- +-2.3.1.5 `bfd_get_arch_size' +-........................... +- +-*Synopsis* +- int bfd_get_arch_size (bfd *abfd); +- *Description* +-Returns the architecture address size, in bits, as determined by the +-object file's format. For ELF, this information is included in the +-header. +- +- *Returns* +-Returns the arch size in bits if known, `-1' otherwise. +- +-2.3.1.6 `bfd_get_sign_extend_vma' +-................................. +- +-*Synopsis* +- int bfd_get_sign_extend_vma (bfd *abfd); +- *Description* +-Indicates if the target architecture "naturally" sign extends an +-address. Some architectures implicitly sign extend address values when +-they are converted to types larger than the size of an address. For +-instance, bfd_get_start_address() will return an address sign extended +-to fill a bfd_vma when this is the case. +- +- *Returns* +-Returns `1' if the target architecture is known to sign extend +-addresses, `0' if the target architecture is known to not sign extend +-addresses, and `-1' otherwise. +- +-2.3.1.7 `bfd_set_start_address' +-............................... +- +-*Synopsis* +- bfd_boolean bfd_set_start_address (bfd *abfd, bfd_vma vma); +- *Description* +-Make VMA the entry point of output BFD ABFD. +- +- *Returns* +-Returns `TRUE' on success, `FALSE' otherwise. +- +-2.3.1.8 `bfd_get_gp_size' +-......................... +- +-*Synopsis* +- unsigned 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. +- +-2.3.1.9 `bfd_set_gp_size' +-......................... +- +-*Synopsis* +- void bfd_set_gp_size (bfd *abfd, unsigned 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. +- +-2.3.1.10 `bfd_scan_vma' +-....................... +- +-*Synopsis* +- bfd_vma bfd_scan_vma (const char *string, const char **end, int base); +- *Description* +-Convert, like `strtoul', a numerical expression 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 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. +- +- If the value would overflow, the maximum `bfd_vma' value is returned. +- +-2.3.1.11 `bfd_copy_private_header_data' +-....................................... +- +-*Synopsis* +- bfd_boolean bfd_copy_private_header_data (bfd *ibfd, bfd *obfd); +- *Description* +-Copy private BFD header information from the BFD IBFD to the the BFD +-OBFD. This copies information that may require sections to exist, but +-does not require symbol tables. Return `true' on success, `false' on +-error. Possible error returns are: +- +- * `bfd_error_no_memory' - Not enough memory exists to create private +- data for OBFD. +- +- #define bfd_copy_private_header_data(ibfd, obfd) \ +- BFD_SEND (obfd, _bfd_copy_private_header_data, \ +- (ibfd, obfd)) +- +-2.3.1.12 `bfd_copy_private_bfd_data' +-.................................... +- +-*Synopsis* +- bfd_boolean bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd); +- *Description* +-Copy private BFD information from the BFD IBFD to the the BFD OBFD. +-Return `TRUE' on success, `FALSE' on error. Possible error returns are: +- +- * `bfd_error_no_memory' - Not enough memory exists to create private +- data for OBFD. +- +- #define bfd_copy_private_bfd_data(ibfd, obfd) \ +- BFD_SEND (obfd, _bfd_copy_private_bfd_data, \ +- (ibfd, obfd)) +- +-2.3.1.13 `bfd_merge_private_bfd_data' +-..................................... +- +-*Synopsis* +- bfd_boolean bfd_merge_private_bfd_data (bfd *ibfd, bfd *obfd); +- *Description* +-Merge private BFD information from the BFD IBFD to the the output file +-BFD OBFD when linking. Return `TRUE' on success, `FALSE' on error. +-Possible error returns are: +- +- * `bfd_error_no_memory' - Not enough memory exists to create private +- data for OBFD. +- +- #define bfd_merge_private_bfd_data(ibfd, obfd) \ +- BFD_SEND (obfd, _bfd_merge_private_bfd_data, \ +- (ibfd, obfd)) +- +-2.3.1.14 `bfd_set_private_flags' +-................................ +- +-*Synopsis* +- bfd_boolean bfd_set_private_flags (bfd *abfd, flagword flags); +- *Description* +-Set private BFD flag information in the BFD ABFD. Return `TRUE' on +-success, `FALSE' on error. Possible error returns are: +- +- * `bfd_error_no_memory' - Not enough memory exists to create private +- data for OBFD. +- +- #define bfd_set_private_flags(abfd, flags) \ +- BFD_SEND (abfd, _bfd_set_private_flags, (abfd, flags)) +- +-2.3.1.15 `Other functions' +-.......................... +- +-*Description* +-The following functions exist but have not yet been documented. +- #define bfd_sizeof_headers(abfd, info) \ +- BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, info)) +- +- #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)) +- +- #define bfd_find_nearest_line_discriminator(abfd, sec, syms, off, file, func, \ +- line, disc) \ +- BFD_SEND (abfd, _bfd_find_nearest_line_discriminator, \ +- (abfd, sec, syms, off, file, func, line, disc)) +- +- #define bfd_find_line(abfd, syms, sym, file, line) \ +- BFD_SEND (abfd, _bfd_find_line, \ +- (abfd, syms, sym, file, line)) +- +- #define bfd_find_inliner_info(abfd, file, func, line) \ +- BFD_SEND (abfd, _bfd_find_inliner_info, \ +- (abfd, file, func, line)) +- +- #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_gc_sections(abfd, link_info) \ +- BFD_SEND (abfd, _bfd_gc_sections, (abfd, link_info)) +- +- #define bfd_lookup_section_flags(link_info, flag_info, section) \ +- BFD_SEND (abfd, _bfd_lookup_section_flags, (link_info, flag_info, section)) +- +- #define bfd_merge_sections(abfd, link_info) \ +- BFD_SEND (abfd, _bfd_merge_sections, (abfd, link_info)) +- +- #define bfd_is_group_section(abfd, sec) \ +- BFD_SEND (abfd, _bfd_is_group_section, (abfd, sec)) +- +- #define bfd_discard_group(abfd, sec) \ +- BFD_SEND (abfd, _bfd_discard_group, (abfd, sec)) +- +- #define bfd_link_hash_table_create(abfd) \ +- BFD_SEND (abfd, _bfd_link_hash_table_create, (abfd)) +- +- #define bfd_link_hash_table_free(abfd, hash) \ +- BFD_SEND (abfd, _bfd_link_hash_table_free, (hash)) +- +- #define bfd_link_add_symbols(abfd, info) \ +- BFD_SEND (abfd, _bfd_link_add_symbols, (abfd, info)) +- +- #define bfd_link_just_syms(abfd, sec, info) \ +- BFD_SEND (abfd, _bfd_link_just_syms, (sec, 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_synthetic_symtab(abfd, count, syms, dyncount, dynsyms, ret) \ +- BFD_SEND (abfd, _bfd_get_synthetic_symtab, (abfd, count, syms, \ +- dyncount, dynsyms, ret)) +- +- #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 +- (bfd *, struct bfd_link_info *, struct bfd_link_order *, bfd_byte *, +- bfd_boolean, asymbol **); +- +-2.3.1.16 `bfd_alt_mach_code' +-............................ +- +-*Synopsis* +- bfd_boolean bfd_alt_mach_code (bfd *abfd, int alternative); +- *Description* +-When more than one machine code number is available for the same +-machine type, this function can be used to switch between the preferred +-one (alternative == 0) and any others. Currently, only ELF supports +-this feature, with up to two alternate machine codes. +- +-2.3.1.17 `bfd_emul_get_maxpagesize' +-................................... +- +-*Synopsis* +- bfd_vma bfd_emul_get_maxpagesize (const char *); +- *Description* +-Returns the maximum page size, in bytes, as determined by emulation. +- +- *Returns* +-Returns the maximum page size in bytes for ELF, 0 otherwise. +- +-2.3.1.18 `bfd_emul_set_maxpagesize' +-................................... +- +-*Synopsis* +- void bfd_emul_set_maxpagesize (const char *, bfd_vma); +- *Description* +-For ELF, set the maximum page size for the emulation. It is a no-op +-for other formats. +- +-2.3.1.19 `bfd_emul_get_commonpagesize' +-...................................... +- +-*Synopsis* +- bfd_vma bfd_emul_get_commonpagesize (const char *); +- *Description* +-Returns the common page size, in bytes, as determined by emulation. +- +- *Returns* +-Returns the common page size in bytes for ELF, 0 otherwise. +- +-2.3.1.20 `bfd_emul_set_commonpagesize' +-...................................... +- +-*Synopsis* +- void bfd_emul_set_commonpagesize (const char *, bfd_vma); +- *Description* +-For ELF, set the common page size for the emulation. It is a no-op for +-other formats. +- +-2.3.1.21 `bfd_demangle' +-....................... +- +-*Synopsis* +- char *bfd_demangle (bfd *, const char *, int); +- *Description* +-Wrapper around cplus_demangle. Strips leading underscores and other +-such chars that would otherwise confuse the demangler. If passed a g++ +-v3 ABI mangled name, returns a buffer allocated with malloc holding the +-demangled name. Returns NULL otherwise and on memory alloc failure. +- +-2.3.1.22 `struct bfd_iovec' +-........................... +- +-*Description* +-The `struct bfd_iovec' contains the internal file I/O class. Each +-`BFD' has an instance of this class and all file I/O is routed through +-it (it is assumed that the instance implements all methods listed +-below). +- struct bfd_iovec +- { +- /* To avoid problems with macros, a "b" rather than "f" +- prefix is prepended to each method name. */ +- /* Attempt to read/write NBYTES on ABFD's IOSTREAM storing/fetching +- bytes starting at PTR. Return the number of bytes actually +- transfered (a read past end-of-file returns less than NBYTES), +- or -1 (setting `bfd_error') if an error occurs. */ +- file_ptr (*bread) (struct bfd *abfd, void *ptr, file_ptr nbytes); +- file_ptr (*bwrite) (struct bfd *abfd, const void *ptr, +- file_ptr nbytes); +- /* Return the current IOSTREAM file offset, or -1 (setting `bfd_error' +- if an error occurs. */ +- file_ptr (*btell) (struct bfd *abfd); +- /* For the following, on successful completion a value of 0 is returned. +- Otherwise, a value of -1 is returned (and `bfd_error' is set). */ +- int (*bseek) (struct bfd *abfd, file_ptr offset, int whence); +- int (*bclose) (struct bfd *abfd); +- int (*bflush) (struct bfd *abfd); +- int (*bstat) (struct bfd *abfd, struct stat *sb); +- /* Mmap a part of the files. ADDR, LEN, PROT, FLAGS and OFFSET are the usual +- mmap parameter, except that LEN and OFFSET do not need to be page +- aligned. Returns (void *)-1 on failure, mmapped address on success. +- Also write in MAP_ADDR the address of the page aligned buffer and in +- MAP_LEN the size mapped (a page multiple). Use unmap with MAP_ADDR and +- MAP_LEN to unmap. */ +- void *(*bmmap) (struct bfd *abfd, void *addr, bfd_size_type len, +- int prot, int flags, file_ptr offset, +- void **map_addr, bfd_size_type *map_len); +- }; +- extern const struct bfd_iovec _bfd_memory_iovec; +- +-2.3.1.23 `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). +- +-2.3.1.24 `bfd_get_size' +-....................... +- +-*Synopsis* +- file_ptr bfd_get_size (bfd *abfd); +- *Description* +-Return the file size (as read from file system) for the file associated +-with BFD 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 question, "is +-the size reasonable?". +- +-2.3.1.25 `bfd_mmap' +-................... +- +-*Synopsis* +- void *bfd_mmap (bfd *abfd, void *addr, bfd_size_type len, +- int prot, int flags, file_ptr offset, +- void **map_addr, bfd_size_type *map_len); +- *Description* +-Return mmap()ed region of the file, if possible and implemented. LEN +-and OFFSET do not need to be page aligned. The page aligned address +-and length are written to MAP_ADDR and MAP_LEN. +- +- +-File: bfd.info, Node: Memory Usage, Next: Initialization, Prev: Miscellaneous, Up: BFD front end +- +-2.4 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 `bfd' structures become invalid on a `bfd_close'; for example, +-after a `bfd_close' the vector passed to `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 (`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. +- +- +-File: bfd.info, Node: Initialization, Next: Sections, Prev: Memory Usage, Up: BFD front end +- +-2.5 Initialization +-================== +- +-2.5.1 Initialization functions +------------------------------- +- +-These are the functions that handle initializing a BFD. +- +-2.5.1.1 `bfd_init' +-.................. +- +-*Synopsis* +- void bfd_init (void); +- *Description* +-This routine must be called before any other BFD function to initialize +-magical internal data structures. +- +- +-File: bfd.info, Node: Sections, Next: Symbols, Prev: Initialization, Up: BFD front end +- +-2.6 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:: +- +- +-File: bfd.info, Node: Section Input, Next: Section Output, Prev: Sections, Up: Sections +- +-2.6.1 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. +- +- +-File: bfd.info, Node: Section Output, Next: typedef asection, Prev: Section Input, Up: Sections +- +-2.6.2 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 --------| +- +-2.6.3 Link orders +------------------ +- +-The data within a section is stored in a "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. +- +- +-File: bfd.info, Node: typedef asection, Next: section prototypes, Prev: Section Output, Up: Sections +- +-2.6.4 typedef asection +----------------------- +- +-Here is the section structure: +- +- +- typedef struct bfd_section +- { +- /* 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; +- +- /* A unique sequence number. */ +- int id; +- +- /* Which section in the bfd; 0..n-1 as sections are created in a bfd. */ +- int index; +- +- /* The next section in the list belonging to the BFD, or NULL. */ +- struct bfd_section *next; +- +- /* The previous section in the list belonging to the BFD, or NULL. */ +- struct bfd_section *prev; +- +- /* 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 +- +- /* A signal to the OS that the section contains read only data. */ +- #define SEC_READONLY 0x008 +- +- /* The section contains code only. */ +- #define SEC_CODE 0x010 +- +- /* The section contains data only. */ +- #define SEC_DATA 0x020 +- +- /* The section will reside in ROM. */ +- #define SEC_ROM 0x040 +- +- /* 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 0x080 +- +- /* 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 0x100 +- +- /* An instruction to the linker to not output the section +- even if it has information which would normally be written. */ +- #define SEC_NEVER_LOAD 0x200 +- +- /* The section contains thread local data. */ +- #define SEC_THREAD_LOCAL 0x400 +- +- /* The section has GOT references. This flag is only for the +- linker, and is currently only used by the elf32-hppa back end. +- It will be set if global offset table references were detected +- in this section, which indicate to the linker that the section +- contains PIC code, and must be handled specially when doing a +- static link. */ +- #define SEC_HAS_GOT_REF 0x800 +- +- /* The section contains common symbols (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 0x1000 +- +- /* 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 0x2000 +- +- /* 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 0x4000 +- +- /* 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 0x8000 +- +- /* The contents of this section are to be sorted based on the sum of +- the symbol and addend values specified by the associated relocation +- entries. Entries without associated relocation entries will be +- appended to the end of the section in an unspecified order. */ +- #define SEC_SORT_ENTRIES 0x10000 +- +- /* When linking, duplicate sections of the same name should be +- discarded, rather than being combined into a single section as +- is usually done. This is similar to how common symbols are +- handled. See SEC_LINK_DUPLICATES below. */ +- #define SEC_LINK_ONCE 0x20000 +- +- /* If SEC_LINK_ONCE is set, this bitfield describes how the linker +- should handle duplicate sections. */ +- #define SEC_LINK_DUPLICATES 0xc0000 +- +- /* This value for SEC_LINK_DUPLICATES means that duplicate +- sections with the same name should simply be discarded. */ +- #define SEC_LINK_DUPLICATES_DISCARD 0x0 +- +- /* This value for SEC_LINK_DUPLICATES means that the linker +- should warn if there are any duplicate sections, although +- it should still only link one copy. */ +- #define SEC_LINK_DUPLICATES_ONE_ONLY 0x40000 +- +- /* This value for SEC_LINK_DUPLICATES means that the linker +- should warn if any duplicate sections are a different size. */ +- #define SEC_LINK_DUPLICATES_SAME_SIZE 0x80000 +- +- /* This value for SEC_LINK_DUPLICATES means that the linker +- should warn if any duplicate sections contain different +- contents. */ +- #define SEC_LINK_DUPLICATES_SAME_CONTENTS \ +- (SEC_LINK_DUPLICATES_ONE_ONLY | SEC_LINK_DUPLICATES_SAME_SIZE) +- +- /* This section was created by the linker as part of dynamic +- relocation or other arcane processing. It is skipped when +- going through the first-pass output, trusting that someone +- else up the line will take care of it later. */ +- #define SEC_LINKER_CREATED 0x100000 +- +- /* This section should not be subject to garbage collection. +- Also set to inform the linker that this section should not be +- listed in the link map as discarded. */ +- #define SEC_KEEP 0x200000 +- +- /* This section contains "short" data, and should be placed +- "near" the GP. */ +- #define SEC_SMALL_DATA 0x400000 +- +- /* Attempt to merge identical entities in the section. +- Entity size is given in the entsize field. */ +- #define SEC_MERGE 0x800000 +- +- /* If given with SEC_MERGE, entities to merge are zero terminated +- strings where entsize specifies character size instead of fixed +- size entries. */ +- #define SEC_STRINGS 0x1000000 +- +- /* This section contains data about section groups. */ +- #define SEC_GROUP 0x2000000 +- +- /* 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 0x4000000 +- +- /* This input section should be copied to output in reverse order +- as an array of pointers. This is for ELF linker internal use +- only. */ +- #define SEC_ELF_REVERSE_COPY 0x4000000 +- +- /* This section contains data which may be shared with other +- executables or shared objects. This is for COFF only. */ +- #define SEC_COFF_SHARED 0x8000000 +- +- /* When a section with this flag is being linked, then if the size of +- the input section is less than a page, it should not cross a page +- boundary. If the size of the input section is one page or more, +- it should be aligned on a page boundary. This is for TI +- TMS320C54X only. */ +- #define SEC_TIC54X_BLOCK 0x10000000 +- +- /* Conditionally link this section; do not link if there are no +- references found to any symbol in the section. This is for TI +- TMS320C54X only. */ +- #define SEC_TIC54X_CLINK 0x20000000 +- +- /* Indicate that section has the no read flag set. This happens +- when memory read flag isn't set. */ +- #define SEC_COFF_NOREAD 0x40000000 +- +- /* End of section flags. */ +- +- /* Some internal packed boolean fields. */ +- +- /* See the vma field. */ +- unsigned int user_set_vma : 1; +- +- /* A mark flag used by some of the linker backends. */ +- unsigned int linker_mark : 1; +- +- /* Another mark flag used by some of the linker backends. Set for +- output sections that have an input section. */ +- unsigned int linker_has_input : 1; +- +- /* Mark flag used by some linker backends for garbage collection. */ +- unsigned int gc_mark : 1; +- +- /* Section compression status. */ +- unsigned int compress_status : 2; +- #define COMPRESS_SECTION_NONE 0 +- #define COMPRESS_SECTION_DONE 1 +- #define DECOMPRESS_SECTION_SIZED 2 +- +- /* The following flags are used by the ELF linker. */ +- +- /* Mark sections which have been allocated to segments. */ +- unsigned int segment_mark : 1; +- +- /* Type of sec_info information. */ +- unsigned int sec_info_type:3; +- #define SEC_INFO_TYPE_NONE 0 +- #define SEC_INFO_TYPE_STABS 1 +- #define SEC_INFO_TYPE_MERGE 2 +- #define SEC_INFO_TYPE_EH_FRAME 3 +- #define SEC_INFO_TYPE_JUST_SYMS 4 +- +- /* Nonzero if this section uses RELA relocations, rather than REL. */ +- unsigned int use_rela_p:1; +- +- /* Bits used by various backends. The generic code doesn't touch +- these fields. */ +- +- unsigned int sec_flg0:1; +- unsigned int sec_flg1:1; +- unsigned int sec_flg2:1; +- unsigned int sec_flg3:1; +- unsigned int sec_flg4:1; +- unsigned int sec_flg5:1; +- +- /* End of internal packed boolean fields. */ +- +- /* 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; +- +- /* 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 octets, as it will be output. +- Contains a value even if the section has no contents (e.g., the +- size of `.bss'). */ +- bfd_size_type size; +- +- /* For input sections, the original size on disk of the section, in +- octets. This field should be set for any section whose size is +- changed by linker relaxation. It is required for sections where +- the linker relaxation scheme doesn't cache altered section and +- reloc contents (stabs, eh_frame, SEC_MERGE, some coff relaxing +- targets), and thus the original size needs to be kept to read the +- section multiple times. For output sections, rawsize holds the +- section size calculated on a previous linker relaxation pass. */ +- bfd_size_type rawsize; +- +- /* The compressed size of the section in octets. */ +- bfd_size_type compressed_size; +- +- /* Relaxation table. */ +- struct relax_table *relax; +- +- /* Count of used relaxation table entries. */ +- int relax_count; +- +- +- /* If this section is going to be output, then this value is the +- offset in *bytes* into the output section of the first byte in the +- input section (byte ==> smallest addressable unit on the +- target). In most cases, if this was going to start at the +- 100th octet (8-bit quantity) in the output section, this value +- would be 100. However, if the target byte size is 16 bits +- (bfd_octets_per_byte is "2"), this value would be 50. */ +- bfd_vma output_offset; +- +- /* The output section through which to map on output. */ +- struct bfd_section *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. */ +- void *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; +- +- /* Entity size for merging purposes. */ +- unsigned int entsize; +- +- /* Points to the kept section if this section is a link-once section, +- and is discarded. */ +- struct bfd_section *kept_section; +- +- /* 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; +- +- void *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; +- +- /* A symbol which points at this section only. */ +- struct bfd_symbol *symbol; +- struct bfd_symbol **symbol_ptr_ptr; +- +- /* Early in the link process, map_head and map_tail are used to build +- a list of input sections attached to an output section. Later, +- output sections use these fields for a list of bfd_link_order +- structs. */ +- union { +- struct bfd_link_order *link_order; +- struct bfd_section *s; +- } map_head, map_tail; +- } asection; +- +- /* Relax table contains information about instructions which can +- be removed by relaxation -- replacing a long address with a +- short address. */ +- struct relax_table { +- /* Address where bytes may be deleted. */ +- bfd_vma addr; +- +- /* Number of bytes to be deleted. */ +- int size; +- }; +- +- /* 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. */ +- extern asection _bfd_std_section[4]; +- +- #define BFD_ABS_SECTION_NAME "*ABS*" +- #define BFD_UND_SECTION_NAME "*UND*" +- #define BFD_COM_SECTION_NAME "*COM*" +- #define BFD_IND_SECTION_NAME "*IND*" +- +- /* Pointer to the common section. */ +- #define bfd_com_section_ptr (&_bfd_std_section[0]) +- /* Pointer to the undefined section. */ +- #define bfd_und_section_ptr (&_bfd_std_section[1]) +- /* Pointer to the absolute section. */ +- #define bfd_abs_section_ptr (&_bfd_std_section[2]) +- /* Pointer to the indirect section. */ +- #define bfd_ind_section_ptr (&_bfd_std_section[3]) +- +- #define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr) +- #define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr) +- #define bfd_is_ind_section(sec) ((sec) == bfd_ind_section_ptr) +- +- #define bfd_is_const_section(SEC) \ +- ( ((SEC) == bfd_abs_section_ptr) \ +- || ((SEC) == bfd_und_section_ptr) \ +- || ((SEC) == bfd_com_section_ptr) \ +- || ((SEC) == bfd_ind_section_ptr)) +- +- /* Macros to handle insertion and deletion of a bfd's sections. These +- only handle the list pointers, ie. do not adjust section_count, +- target_index etc. */ +- #define bfd_section_list_remove(ABFD, S) \ +- do \ +- { \ +- asection *_s = S; \ +- asection *_next = _s->next; \ +- asection *_prev = _s->prev; \ +- if (_prev) \ +- _prev->next = _next; \ +- else \ +- (ABFD)->sections = _next; \ +- if (_next) \ +- _next->prev = _prev; \ +- else \ +- (ABFD)->section_last = _prev; \ +- } \ +- while (0) +- #define bfd_section_list_append(ABFD, S) \ +- do \ +- { \ +- asection *_s = S; \ +- bfd *_abfd = ABFD; \ +- _s->next = NULL; \ +- if (_abfd->section_last) \ +- { \ +- _s->prev = _abfd->section_last; \ +- _abfd->section_last->next = _s; \ +- } \ +- else \ +- { \ +- _s->prev = NULL; \ +- _abfd->sections = _s; \ +- } \ +- _abfd->section_last = _s; \ +- } \ +- while (0) +- #define bfd_section_list_prepend(ABFD, S) \ +- do \ +- { \ +- asection *_s = S; \ +- bfd *_abfd = ABFD; \ +- _s->prev = NULL; \ +- if (_abfd->sections) \ +- { \ +- _s->next = _abfd->sections; \ +- _abfd->sections->prev = _s; \ +- } \ +- else \ +- { \ +- _s->next = NULL; \ +- _abfd->section_last = _s; \ +- } \ +- _abfd->sections = _s; \ +- } \ +- while (0) +- #define bfd_section_list_insert_after(ABFD, A, S) \ +- do \ +- { \ +- asection *_a = A; \ +- asection *_s = S; \ +- asection *_next = _a->next; \ +- _s->next = _next; \ +- _s->prev = _a; \ +- _a->next = _s; \ +- if (_next) \ +- _next->prev = _s; \ +- else \ +- (ABFD)->section_last = _s; \ +- } \ +- while (0) +- #define bfd_section_list_insert_before(ABFD, B, S) \ +- do \ +- { \ +- asection *_b = B; \ +- asection *_s = S; \ +- asection *_prev = _b->prev; \ +- _s->prev = _prev; \ +- _s->next = _b; \ +- _b->prev = _s; \ +- if (_prev) \ +- _prev->next = _s; \ +- else \ +- (ABFD)->sections = _s; \ +- } \ +- while (0) +- #define bfd_section_removed_from_list(ABFD, S) \ +- ((S)->next == NULL ? (ABFD)->section_last != (S) : (S)->next->prev != (S)) +- +- #define BFD_FAKE_SECTION(SEC, FLAGS, SYM, NAME, IDX) \ +- /* name, id, index, next, prev, flags, user_set_vma, */ \ +- { NAME, IDX, 0, NULL, NULL, FLAGS, 0, \ +- \ +- /* linker_mark, linker_has_input, gc_mark, decompress_status, */ \ +- 0, 0, 1, 0, \ +- \ +- /* segment_mark, sec_info_type, use_rela_p, */ \ +- 0, 0, 0, \ +- \ +- /* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, */ \ +- 0, 0, 0, 0, 0, 0, \ +- \ +- /* vma, lma, size, rawsize, compressed_size, relax, relax_count, */ \ +- 0, 0, 0, 0, 0, 0, 0, \ +- \ +- /* output_offset, output_section, alignment_power, */ \ +- 0, &SEC, 0, \ +- \ +- /* relocation, orelocation, reloc_count, filepos, rel_filepos, */ \ +- NULL, NULL, 0, 0, 0, \ +- \ +- /* line_filepos, userdata, contents, lineno, lineno_count, */ \ +- 0, NULL, NULL, NULL, 0, \ +- \ +- /* entsize, kept_section, moving_line_filepos, */ \ +- 0, NULL, 0, \ +- \ +- /* target_index, used_by_bfd, constructor_chain, owner, */ \ +- 0, NULL, NULL, NULL, \ +- \ +- /* symbol, symbol_ptr_ptr, */ \ +- (struct bfd_symbol *) SYM, &SEC.symbol, \ +- \ +- /* map_head, map_tail */ \ +- { NULL }, { NULL } \ +- } +- +- +-File: bfd.info, Node: section prototypes, Prev: typedef asection, Up: Sections +- +-2.6.5 Section prototypes +------------------------- +- +-These are the functions exported by the section handling part of BFD. +- +-2.6.5.1 `bfd_section_list_clear' +-................................ +- +-*Synopsis* +- void bfd_section_list_clear (bfd *); +- *Description* +-Clears the section list, and also resets the section count and hash +-table entries. +- +-2.6.5.2 `bfd_get_section_by_name' +-................................. +- +-*Synopsis* +- asection *bfd_get_section_by_name (bfd *abfd, const char *name); +- *Description* +-Return the most recently created section attached to ABFD named NAME. +-Return NULL if no such section exists. +- +-2.6.5.3 `bfd_get_next_section_by_name' +-...................................... +- +-*Synopsis* +- asection *bfd_get_next_section_by_name (asection *sec); +- *Description* +-Given SEC is a section returned by `bfd_get_section_by_name', return +-the next most recently created section attached to the same BFD with +-the same name. Return NULL if no such section exists. +- +-2.6.5.4 `bfd_get_linker_section' +-................................ +- +-*Synopsis* +- asection *bfd_get_linker_section (bfd *abfd, const char *name); +- *Description* +-Return the linker created section attached to ABFD named NAME. Return +-NULL if no such section exists. +- +-2.6.5.5 `bfd_get_section_by_name_if' +-.................................... +- +-*Synopsis* +- asection *bfd_get_section_by_name_if +- (bfd *abfd, +- const char *name, +- bfd_boolean (*func) (bfd *abfd, asection *sect, void *obj), +- void *obj); +- *Description* +-Call the provided function FUNC for each section attached to the BFD +-ABFD whose name matches NAME, passing OBJ as an argument. The function +-will be called as if by +- +- func (abfd, the_section, obj); +- +- It returns the first section for which FUNC returns true, otherwise +-`NULL'. +- +-2.6.5.6 `bfd_get_unique_section_name' +-..................................... +- +-*Synopsis* +- char *bfd_get_unique_section_name +- (bfd *abfd, const char *templat, int *count); +- *Description* +-Invent a section name that is unique in ABFD by tacking a dot and a +-digit suffix onto the original TEMPLAT. If COUNT is non-NULL, then it +-specifies the first number tried as a suffix to generate a unique name. +-The value pointed to by COUNT will be incremented in this case. +- +-2.6.5.7 `bfd_make_section_old_way' +-.................................. +- +-*Synopsis* +- asection *bfd_make_section_old_way (bfd *abfd, const char *name); +- *Description* +-Create a new empty section called NAME and attach it to the end of the +-chain of sections for the BFD 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: +- * `bfd_error_invalid_operation' - If output has already started for +- this BFD. +- +- * `bfd_error_no_memory' - If memory allocation fails. +- +-2.6.5.8 `bfd_make_section_anyway_with_flags' +-............................................ +- +-*Synopsis* +- asection *bfd_make_section_anyway_with_flags +- (bfd *abfd, const char *name, flagword flags); +- *Description* +-Create a new empty section called NAME and attach it to the end of the +-chain of sections for ABFD. Create a new section even if there is +-already a section with that name. Also set the attributes of the new +-section to the value FLAGS. +- +- Return `NULL' and set `bfd_error' on error; possible errors are: +- * `bfd_error_invalid_operation' - If output has already started for +- ABFD. +- +- * `bfd_error_no_memory' - If memory allocation fails. +- +-2.6.5.9 `bfd_make_section_anyway' +-................................. +- +-*Synopsis* +- asection *bfd_make_section_anyway (bfd *abfd, const char *name); +- *Description* +-Create a new empty section called NAME and attach it to the end of the +-chain of sections for 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: +- * `bfd_error_invalid_operation' - If output has already started for +- ABFD. +- +- * `bfd_error_no_memory' - If memory allocation fails. +- +-2.6.5.10 `bfd_make_section_with_flags' +-...................................... +- +-*Synopsis* +- asection *bfd_make_section_with_flags +- (bfd *, const char *name, flagword flags); +- *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 NAME. Also set the attributes of the new +-section to the value FLAGS. If there is an error, return `NULL' and set +-`bfd_error'. +- +-2.6.5.11 `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 NAME. If there is an error, return `NULL' and +-set `bfd_error'. +- +-2.6.5.12 `bfd_set_section_flags' +-................................ +- +-*Synopsis* +- bfd_boolean bfd_set_section_flags +- (bfd *abfd, asection *sec, flagword flags); +- *Description* +-Set the attributes of the section SEC in the BFD ABFD to the value +-FLAGS. Return `TRUE' on success, `FALSE' on error. Possible error +-returns are: +- +- * `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. +- +-2.6.5.13 `bfd_rename_section' +-............................. +- +-*Synopsis* +- void bfd_rename_section +- (bfd *abfd, asection *sec, const char *newname); +- *Description* +-Rename section SEC in ABFD to NEWNAME. +- +-2.6.5.14 `bfd_map_over_sections' +-................................ +- +-*Synopsis* +- void bfd_map_over_sections +- (bfd *abfd, +- void (*func) (bfd *abfd, asection *sect, void *obj), +- void *obj); +- *Description* +-Call the provided function FUNC for each section attached to the BFD +-ABFD, passing OBJ as an argument. The function will be called as if by +- +- func (abfd, the_section, obj); +- +- This is the preferred method for iterating over sections; an +-alternative would be to use a loop: +- +- asection *p; +- for (p = abfd->sections; p != NULL; p = p->next) +- func (abfd, p, ...) +- +-2.6.5.15 `bfd_sections_find_if' +-............................... +- +-*Synopsis* +- asection *bfd_sections_find_if +- (bfd *abfd, +- bfd_boolean (*operation) (bfd *abfd, asection *sect, void *obj), +- void *obj); +- *Description* +-Call the provided function OPERATION for each section attached to the +-BFD ABFD, passing OBJ as an argument. The function will be called as if +-by +- +- operation (abfd, the_section, obj); +- +- It returns the first section for which OPERATION returns true. +- +-2.6.5.16 `bfd_set_section_size' +-............................... +- +-*Synopsis* +- bfd_boolean bfd_set_section_size +- (bfd *abfd, asection *sec, bfd_size_type val); +- *Description* +-Set SEC to the size VAL. If the operation is ok, then `TRUE' is +-returned, else `FALSE'. +- +- Possible error returns: +- * `bfd_error_invalid_operation' - Writing has started to the BFD, so +- setting the size is invalid. +- +-2.6.5.17 `bfd_set_section_contents' +-................................... +- +-*Synopsis* +- bfd_boolean bfd_set_section_contents +- (bfd *abfd, asection *section, const void *data, +- file_ptr offset, bfd_size_type count); +- *Description* +-Sets the contents of the section SECTION in BFD ABFD to the data +-starting in memory at DATA. The data is written to the output section +-starting at offset OFFSET for COUNT octets. +- +- Normally `TRUE' is returned, else `FALSE'. Possible error returns +-are: +- * `bfd_error_no_contents' - The output section does not have the +- `SEC_HAS_CONTENTS' attribute, so nothing can be written to it. +- +- * and some more too +- This routine is front end to the back end function +-`_bfd_set_section_contents'. +- +-2.6.5.18 `bfd_get_section_contents' +-................................... +- +-*Synopsis* +- bfd_boolean bfd_get_section_contents +- (bfd *abfd, asection *section, void *location, file_ptr offset, +- bfd_size_type count); +- *Description* +-Read data from SECTION in BFD ABFD into memory starting at LOCATION. +-The data is read at an offset of OFFSET from the start of the input +-section, and is read for 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 LOCATION is filled with zeroes. If no errors occur, +-`TRUE' is returned, else `FALSE'. +- +-2.6.5.19 `bfd_malloc_and_get_section' +-..................................... +- +-*Synopsis* +- bfd_boolean bfd_malloc_and_get_section +- (bfd *abfd, asection *section, bfd_byte **buf); +- *Description* +-Read all data from SECTION in BFD ABFD into a buffer, *BUF, malloc'd by +-this function. +- +-2.6.5.20 `bfd_copy_private_section_data' +-........................................ +- +-*Synopsis* +- bfd_boolean bfd_copy_private_section_data +- (bfd *ibfd, asection *isec, bfd *obfd, asection *osec); +- *Description* +-Copy private section information from ISEC in the BFD IBFD to the +-section OSEC in the BFD OBFD. Return `TRUE' on success, `FALSE' on +-error. Possible error returns are: +- +- * `bfd_error_no_memory' - Not enough memory exists to create private +- data for OSEC. +- +- #define bfd_copy_private_section_data(ibfd, isection, obfd, osection) \ +- BFD_SEND (obfd, _bfd_copy_private_section_data, \ +- (ibfd, isection, obfd, osection)) +- +-2.6.5.21 `bfd_generic_is_group_section' +-....................................... +- +-*Synopsis* +- bfd_boolean bfd_generic_is_group_section (bfd *, const asection *sec); +- *Description* +-Returns TRUE if SEC is a member of a group. +- +-2.6.5.22 `bfd_generic_discard_group' +-.................................... +- +-*Synopsis* +- bfd_boolean bfd_generic_discard_group (bfd *abfd, asection *group); +- *Description* +-Remove all members of GROUP from the output. +- +- +-File: bfd.info, Node: Symbols, Next: Archives, Prev: Sections, Up: BFD front end +- +-2.7 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:: +- +- +-File: bfd.info, Node: Reading Symbols, Next: Writing Symbols, Prev: Symbols, Up: Symbols +- +-2.7.1 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 = 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 objalloc connected +-to the BFD; it is freed when the BFD is closed. +- +- +-File: bfd.info, Node: Writing Symbols, Next: Mini Symbols, Prev: Reading Symbols, Up: Symbols +- +-2.7.2 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 "sysdep.h" +- #include "bfd.h" +- int main (void) +- { +- 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] = 0; +- +- bfd_set_symtab (abfd, ptrs, 1); +- bfd_close (abfd); +- return 0; +- } +- +- ./makesym +- nm foo +- 00012345 A dummy_symbol +- +- Many formats cannot represent arbitrary symbol information; for +-instance, the `a.out' object format does not allow an arbitrary number +-of sections. A symbol pointing to a section which is not one of +-`.text', `.data' or `.bss' cannot be described. +- +- +-File: bfd.info, Node: Mini Symbols, Next: typedef asymbol, Prev: Writing Symbols, Up: Symbols +- +-2.7.3 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. +- +- +-File: bfd.info, Node: typedef asymbol, Next: symbol handling functions, Prev: Mini Symbols, Up: Symbols +- +-2.7.4 typedef asymbol +---------------------- +- +-An `asymbol' has the form: +- +- +- typedef struct bfd_symbol +- { +- /* 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 (1 << 0) +- +- /* The symbol has global scope; initialized data in `C'. The +- value is the offset into the section of the data. */ +- #define BSF_GLOBAL (1 << 1) +- +- /* 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_COMMON', `BSF_UNDEFINED' or +- `BSF_GLOBAL'. */ +- +- /* The symbol is a debugging record. The value has an arbitrary +- meaning, unless BSF_DEBUGGING_RELOC is also set. */ +- #define BSF_DEBUGGING (1 << 2) +- +- /* The symbol denotes a function entry point. Used in ELF, +- perhaps others someday. */ +- #define BSF_FUNCTION (1 << 3) +- +- /* Used by the linker. */ +- #define BSF_KEEP (1 << 5) +- #define BSF_KEEP_G (1 << 6) +- +- /* A weak global symbol, overridable without warnings by +- a regular global symbol of the same name. */ +- #define BSF_WEAK (1 << 7) +- +- /* This symbol was created to point to a section, e.g. ELF's +- STT_SECTION symbols. */ +- #define BSF_SECTION_SYM (1 << 8) +- +- /* The symbol used to be a common symbol, but now it is +- allocated. */ +- #define BSF_OLD_COMMON (1 << 9) +- +- /* 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 (1 << 10) +- +- /* Signal that the symbol is the label of constructor section. */ +- #define BSF_CONSTRUCTOR (1 << 11) +- +- /* 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 (1 << 12) +- +- /* 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 (1 << 13) +- +- /* BSF_FILE marks symbols that contain a file name. This is used +- for ELF STT_FILE symbols. */ +- #define BSF_FILE (1 << 14) +- +- /* Symbol is from dynamic linking information. */ +- #define BSF_DYNAMIC (1 << 15) +- +- /* The symbol denotes a data object. Used in ELF, and perhaps +- others someday. */ +- #define BSF_OBJECT (1 << 16) +- +- /* This symbol is a debugging symbol. The value is the offset +- into the section of the data. BSF_DEBUGGING should be set +- as well. */ +- #define BSF_DEBUGGING_RELOC (1 << 17) +- +- /* This symbol is thread local. Used in ELF. */ +- #define BSF_THREAD_LOCAL (1 << 18) +- +- /* This symbol represents a complex relocation expression, +- with the expression tree serialized in the symbol name. */ +- #define BSF_RELC (1 << 19) +- +- /* This symbol represents a signed complex relocation expression, +- with the expression tree serialized in the symbol name. */ +- #define BSF_SRELC (1 << 20) +- +- /* This symbol was created by bfd_get_synthetic_symtab. */ +- #define BSF_SYNTHETIC (1 << 21) +- +- /* This symbol is an indirect code object. Unrelated to BSF_INDIRECT. +- The dynamic linker will compute the value of this symbol by +- calling the function that it points to. BSF_FUNCTION must +- also be also set. */ +- #define BSF_GNU_INDIRECT_FUNCTION (1 << 22) +- /* This symbol is a globally unique data object. The dynamic linker +- will make sure that in the entire process there is just one symbol +- with this name and type in use. BSF_OBJECT must also be set. */ +- #define BSF_GNU_UNIQUE (1 << 23) +- +- 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 bfd_section *section; +- +- /* Back end special data. */ +- union +- { +- void *p; +- bfd_vma i; +- } +- udata; +- } +- asymbol; +- +- +-File: bfd.info, Node: symbol handling functions, Prev: typedef asymbol, Up: Symbols +- +-2.7.5 Symbol handling functions +-------------------------------- +- +-2.7.5.1 `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 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)) +- +-2.7.5.2 `bfd_is_local_label' +-............................ +- +-*Synopsis* +- bfd_boolean bfd_is_local_label (bfd *abfd, asymbol *sym); +- *Description* +-Return TRUE if the given symbol SYM in the BFD ABFD is a compiler +-generated local label, else return FALSE. +- +-2.7.5.3 `bfd_is_local_label_name' +-................................. +- +-*Synopsis* +- bfd_boolean bfd_is_local_label_name (bfd *abfd, const char *name); +- *Description* +-Return TRUE if a symbol with the name NAME in the BFD ABFD is a +-compiler generated local label, else return FALSE. This just checks +-whether the name has the form of a local label. +- #define bfd_is_local_label_name(abfd, name) \ +- BFD_SEND (abfd, _bfd_is_local_label_name, (abfd, name)) +- +-2.7.5.4 `bfd_is_target_special_symbol' +-...................................... +- +-*Synopsis* +- bfd_boolean bfd_is_target_special_symbol (bfd *abfd, asymbol *sym); +- *Description* +-Return TRUE iff a symbol SYM in the BFD ABFD is something special to +-the particular target represented by the BFD. Such symbols should +-normally not be mentioned to the user. +- #define bfd_is_target_special_symbol(abfd, sym) \ +- BFD_SEND (abfd, _bfd_is_target_special_symbol, (abfd, sym)) +- +-2.7.5.5 `bfd_canonicalize_symtab' +-................................. +- +-*Description* +-Read the symbols from the BFD ABFD, and fills in the vector 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)) +- +-2.7.5.6 `bfd_set_symtab' +-........................ +- +-*Synopsis* +- bfd_boolean bfd_set_symtab +- (bfd *abfd, asymbol **location, unsigned int count); +- *Description* +-Arrange that when the output BFD ABFD is closed, the table LOCATION of +-COUNT pointers to symbols will be written. +- +-2.7.5.7 `bfd_print_symbol_vandf' +-................................ +- +-*Synopsis* +- void bfd_print_symbol_vandf (bfd *abfd, void *file, asymbol *symbol); +- *Description* +-Print the value and flags of the SYMBOL supplied to the stream FILE. +- +-2.7.5.8 `bfd_make_empty_symbol' +-............................... +- +-*Description* +-Create a new `asymbol' structure for the BFD 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)) +- +-2.7.5.9 `_bfd_generic_make_empty_symbol' +-........................................ +- +-*Synopsis* +- asymbol *_bfd_generic_make_empty_symbol (bfd *); +- *Description* +-Create a new `asymbol' structure for the BFD ABFD and return a pointer +-to it. Used by core file routines, binary back-end and anywhere else +-where no private info is needed. +- +-2.7.5.10 `bfd_make_debug_symbol' +-................................ +- +-*Description* +-Create a new `asymbol' structure for the BFD 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)) +- +-2.7.5.11 `bfd_decode_symclass' +-.............................. +- +-*Description* +-Return a character corresponding to the symbol class of SYMBOL, or '?' +-for an unknown class. +- +- *Synopsis* +- int bfd_decode_symclass (asymbol *symbol); +- +-2.7.5.12 `bfd_is_undefined_symclass' +-.................................... +- +-*Description* +-Returns non-zero if the class symbol returned by bfd_decode_symclass +-represents an undefined symbol. Returns zero otherwise. +- +- *Synopsis* +- bfd_boolean bfd_is_undefined_symclass (int symclass); +- +-2.7.5.13 `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); +- +-2.7.5.14 `bfd_copy_private_symbol_data' +-....................................... +- +-*Synopsis* +- bfd_boolean bfd_copy_private_symbol_data +- (bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym); +- *Description* +-Copy private symbol information from ISYM in the BFD IBFD to the symbol +-OSYM in the BFD OBFD. Return `TRUE' on success, `FALSE' on error. +-Possible error returns are: +- +- * `bfd_error_no_memory' - Not enough memory exists to create private +- data for OSEC. +- +- #define bfd_copy_private_symbol_data(ibfd, isymbol, obfd, osymbol) \ +- BFD_SEND (obfd, _bfd_copy_private_symbol_data, \ +- (ibfd, isymbol, obfd, osymbol)) +- +- +-File: bfd.info, Node: Archives, Next: Formats, Prev: Symbols, Up: BFD front end +- +-2.8 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. +- +- A BFD returned by `bfd_openr_next_archived_file' can be closed +-manually with `bfd_close'. If you do not close it, then a second +-iteration through the members of an archive may return the same BFD. +-If you close the archive BFD, then all the member BFDs will +-automatically be closed as well. +- +- Archive contents of output BFDs are chained through the +-`archive_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'. +- +-2.8.1 Archive functions +------------------------ +- +-2.8.1.1 `bfd_get_next_mapent' +-............................. +- +-*Synopsis* +- symindex bfd_get_next_mapent +- (bfd *abfd, symindex previous, carsym **sym); +- *Description* +-Step through archive ABFD's symbol table (if it has one). Successively +-update SYM with the next symbol's information, returning that symbol's +-(internal) index into the symbol table. +- +- Supply `BFD_NO_MORE_SYMBOLS' as the 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. +- +-2.8.1.2 `bfd_set_archive_head' +-.............................. +- +-*Synopsis* +- bfd_boolean bfd_set_archive_head (bfd *output, bfd *new_head); +- *Description* +-Set the head of the chain of BFDs contained in the archive OUTPUT to +-NEW_HEAD. +- +-2.8.1.3 `bfd_openr_next_archived_file' +-...................................... +- +-*Synopsis* +- bfd *bfd_openr_next_archived_file (bfd *archive, bfd *previous); +- *Description* +-Provided a BFD, 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. +- +- +-File: bfd.info, Node: Formats, Next: Relocations, Prev: Archives, Up: BFD front end +- +-2.9 File formats +-================ +- +-A format is a BFD concept of high level file contents type. The formats +-supported by BFD are: +- +- * `bfd_object' +- The BFD may contain data, symbols, relocations and debug info. +- +- * `bfd_archive' +- The BFD contains other BFDs and an optional index. +- +- * `bfd_core' +- The BFD contains the result of an executable core dump. +- +-2.9.1 File format functions +---------------------------- +- +-2.9.1.1 `bfd_check_format' +-.......................... +- +-*Synopsis* +- bfd_boolean bfd_check_format (bfd *abfd, bfd_format format); +- *Description* +-Verify if the file attached to the BFD ABFD is compatible with the +-format 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: +- +- * `bfd_error_invalid_operation' - if `format' is not one of +- `bfd_object', `bfd_archive' or `bfd_core'. +- +- * `bfd_error_system_call' - if an error occured during a read - even +- some file mismatches can cause bfd_error_system_calls. +- +- * `file_not_recognised' - none of the backends recognised the file +- format. +- +- * `bfd_error_file_ambiguously_recognized' - more than one backend +- recognised the file format. +- +-2.9.1.2 `bfd_check_format_matches' +-.................................. +- +-*Synopsis* +- bfd_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 +-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 MATCHING points to, the caller should +-free it. +- +-2.9.1.3 `bfd_set_format' +-........................ +- +-*Synopsis* +- bfd_boolean bfd_set_format (bfd *abfd, bfd_format format); +- *Description* +-This function sets the file format of the BFD ABFD to the format +-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. +- +-2.9.1.4 `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 FORMAT. +- +- +-File: bfd.info, Node: Relocations, Next: Core Files, Prev: Formats, Up: BFD front end +- +-2.10 Relocations +-================ +- +-BFD maintains relocations in much the same way it maintains symbols: +-they are left alone until required, then read in en-masse 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:: +- +- +-File: bfd.info, Node: typedef arelent, Next: howto manager, Prev: Relocations, Up: Relocations +- +-2.10.1 typedef arelent +----------------------- +- +-This is the structure of a relocation entry: +- +- +- 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 bfd_symbol **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': +- +- * `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 `canonicalize_symtab' action. *Note +-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. +- +- * `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. +- +- * `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 +- +- * `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. +- +-2.10.1.1 `enum complain_overflow' +-................................. +- +-Indicates what sort of overflow checking should be done when performing +-a relocation. +- +- +- enum complain_overflow +- { +- /* Do not complain on overflow. */ +- complain_overflow_dont, +- +- /* Complain if the value overflows when considered as a signed +- number one bit larger than the field. ie. A bitfield of N bits +- is allowed to represent -2**n to 2**n-1. */ +- complain_overflow_bitfield, +- +- /* Complain if the value overflows when considered as a signed +- number. */ +- complain_overflow_signed, +- +- /* Complain if the value overflows when considered as an +- unsigned number. */ +- complain_overflow_unsigned +- }; +- +-2.10.1.2 `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. +- +- struct bfd_symbol; /* Forward declaration. */ +- +- struct reloc_howto_struct +- { +- /* The type field has mainly a documentary 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; +- +- /* The relocation is relative to the field being relocated. */ +- bfd_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 accommodated (e.g., i960 callj +- instructions). */ +- bfd_reloc_status_type (*special_function) +- (bfd *, arelent *, struct bfd_symbol *, void *, asection *, +- bfd *, char **); +- +- /* The textual name of the relocation type. */ +- char *name; +- +- /* Some formats record a relocation addend in the section contents +- rather than with the relocation. For ELF formats this is the +- distinction between USE_REL and USE_RELA (though the code checks +- for USE_REL == 1/0). The value of this field is TRUE if the +- addend is recorded with the section contents; when performing a +- partial link (ld -r) the section contents (the data) will be +- modified. The value of this field is FALSE if addends are +- recorded with the relocation (in arelent.addend); when performing +- a partial link the relocation will be modified. +- All relocations for all ELF USE_RELA targets should set this field +- to FALSE (values of TRUE should be looked on with suspicion). +- However, the converse is not true: not all relocations of all ELF +- USE_REL targets set this field to TRUE. Why this is so is peculiar +- to each particular target. For relocs that aren't used in partial +- links (e.g. GOT stuff) it doesn't matter what this is set to. */ +- bfd_boolean partial_inplace; +- +- /* src_mask selects the part of the instruction (or data) to be used +- in the relocation sum. If the target relocations don't have an +- addend in the reloc, eg. ELF USE_REL, src_mask will normally equal +- dst_mask to extract the addend from the section contents. If +- relocations do have an addend in the reloc, eg. ELF USE_RELA, this +- field should be zero. Non-zero values for ELF USE_RELA targets are +- bogus as in those cases the value in the dst_mask part of the +- section contents should be treated as garbage. */ +- bfd_vma src_mask; +- +- /* dst_mask selects which parts of the instruction (or data) are +- replaced with a relocated value. */ +- 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. */ +- bfd_boolean pcrel_offset; +- }; +- +-2.10.1.3 `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* +-This is used to fill in an empty howto entry in an array. +- #define EMPTY_HOWTO(C) \ +- HOWTO ((C), 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL, \ +- NULL, FALSE, 0, 0, FALSE) +- +- *Description* +-Helper routine to turn a symbol into a relocation value. +- #define HOWTO_PREPARE(relocation, symbol) \ +- { \ +- if (symbol != NULL) \ +- { \ +- if (bfd_is_com_section (symbol->section)) \ +- { \ +- relocation = 0; \ +- } \ +- else \ +- { \ +- relocation = symbol->value; \ +- } \ +- } \ +- } +- +-2.10.1.4 `bfd_get_reloc_size' +-............................. +- +-*Synopsis* +- unsigned 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. +- +-2.10.1.5 `arelent_chain' +-........................ +- +-*Description* +-How relocs are tied together in an `asection': +- typedef struct relent_chain +- { +- arelent relent; +- struct relent_chain *next; +- } +- arelent_chain; +- +-2.10.1.6 `bfd_check_overflow' +-............................. +- +-*Synopsis* +- bfd_reloc_status_type bfd_check_overflow +- (enum complain_overflow how, +- unsigned int bitsize, +- unsigned int rightshift, +- unsigned int addrsize, +- bfd_vma relocation); +- *Description* +-Perform overflow checking on RELOCATION which has BITSIZE significant +-bits and will be shifted right by RIGHTSHIFT bits, on a machine with +-addresses containing ADDRSIZE significant bits. The result is either of +-`bfd_reloc_ok' or `bfd_reloc_overflow'. +- +-2.10.1.7 `bfd_perform_relocation' +-................................. +- +-*Synopsis* +- bfd_reloc_status_type bfd_perform_relocation +- (bfd *abfd, +- arelent *reloc_entry, +- void *data, +- asection *input_section, +- bfd *output_bfd, +- char **error_message); +- *Description* +-If 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 +-ERROR_MESSAGE argument is set to an error message if this return +-`bfd_reloc_dangerous'. +- +-2.10.1.8 `bfd_install_relocation' +-................................. +- +-*Synopsis* +- bfd_reloc_status_type bfd_install_relocation +- (bfd *abfd, +- arelent *reloc_entry, +- void *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. +- +- +-File: bfd.info, Node: howto manager, Prev: typedef arelent, Up: Relocations +- +-2.10.2 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. +- +-2.10.2.1 `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. +- +- Here are the possible values for `enum bfd_reloc_code_real': +- +- -- : BFD_RELOC_64 +- -- : BFD_RELOC_32 +- -- : BFD_RELOC_26 +- -- : BFD_RELOC_24 +- -- : BFD_RELOC_16 +- -- : BFD_RELOC_14 +- -- : BFD_RELOC_8 +- Basic absolute relocations of N bits. +- +- -- : BFD_RELOC_64_PCREL +- -- : BFD_RELOC_32_PCREL +- -- : BFD_RELOC_24_PCREL +- -- : BFD_RELOC_16_PCREL +- -- : BFD_RELOC_12_PCREL +- -- : BFD_RELOC_8_PCREL +- 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_32_SECREL +- Section relative relocations. Some targets need this for DWARF2. +- +- -- : 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_64_PLT_PCREL +- -- : BFD_RELOC_32_PLT_PCREL +- -- : BFD_RELOC_24_PLT_PCREL +- -- : BFD_RELOC_16_PLT_PCREL +- -- : BFD_RELOC_8_PLT_PCREL +- -- : BFD_RELOC_64_PLTOFF +- -- : 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 +- For ELF. +- +- -- : BFD_RELOC_SIZE32 +- -- : BFD_RELOC_SIZE64 +- Size relocations. +- +- -- : BFD_RELOC_68K_GLOB_DAT +- -- : BFD_RELOC_68K_JMP_SLOT +- -- : BFD_RELOC_68K_RELATIVE +- -- : BFD_RELOC_68K_TLS_GD32 +- -- : BFD_RELOC_68K_TLS_GD16 +- -- : BFD_RELOC_68K_TLS_GD8 +- -- : BFD_RELOC_68K_TLS_LDM32 +- -- : BFD_RELOC_68K_TLS_LDM16 +- -- : BFD_RELOC_68K_TLS_LDM8 +- -- : BFD_RELOC_68K_TLS_LDO32 +- -- : BFD_RELOC_68K_TLS_LDO16 +- -- : BFD_RELOC_68K_TLS_LDO8 +- -- : BFD_RELOC_68K_TLS_IE32 +- -- : BFD_RELOC_68K_TLS_IE16 +- -- : BFD_RELOC_68K_TLS_IE8 +- -- : BFD_RELOC_68K_TLS_LE32 +- -- : BFD_RELOC_68K_TLS_LE16 +- -- : BFD_RELOC_68K_TLS_LE8 +- Relocations used by 68K ELF. +- +- -- : 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 +- Linkage-table relative. +- +- -- : BFD_RELOC_8_FFnn +- Absolute 8-bit relocation, but used to form an address like 0xFFnn. +- +- -- : BFD_RELOC_32_PCREL_S2 +- -- : BFD_RELOC_16_PCREL_S2 +- -- : BFD_RELOC_23_PCREL_S2 +- 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 <>.) The +- signed 16-bit displacement is used on the MIPS, and the 23-bit +- displacement is used on the Alpha. +- +- -- : BFD_RELOC_HI22 +- -- : BFD_RELOC_LO10 +- 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_GPREL16 +- -- : BFD_RELOC_GPREL32 +- 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_I960_CALLJ +- Reloc types used for i960/b.out. +- +- -- : 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_UA16 +- -- : BFD_RELOC_SPARC_UA32 +- -- : BFD_RELOC_SPARC_UA64 +- -- : BFD_RELOC_SPARC_GOTDATA_HIX22 +- -- : BFD_RELOC_SPARC_GOTDATA_LOX10 +- -- : BFD_RELOC_SPARC_GOTDATA_OP_HIX22 +- -- : BFD_RELOC_SPARC_GOTDATA_OP_LOX10 +- -- : BFD_RELOC_SPARC_GOTDATA_OP +- -- : BFD_RELOC_SPARC_JMP_IREL +- -- : BFD_RELOC_SPARC_IRELATIVE +- SPARC ELF relocations. There is probably some overlap with other +- relocation types already defined. +- +- -- : BFD_RELOC_SPARC_BASE13 +- -- : BFD_RELOC_SPARC_BASE22 +- I think these are specific to SPARC a.out (e.g., Sun 4). +- +- -- : BFD_RELOC_SPARC_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_7 +- -- : BFD_RELOC_SPARC_6 +- -- : BFD_RELOC_SPARC_5 +- -- : BFD_RELOC_SPARC_DISP64 +- -- : BFD_RELOC_SPARC_PLT32 +- -- : BFD_RELOC_SPARC_PLT64 +- -- : BFD_RELOC_SPARC_HIX22 +- -- : BFD_RELOC_SPARC_LOX10 +- -- : BFD_RELOC_SPARC_H44 +- -- : BFD_RELOC_SPARC_M44 +- -- : BFD_RELOC_SPARC_L44 +- -- : BFD_RELOC_SPARC_REGISTER +- -- : BFD_RELOC_SPARC_H34 +- -- : BFD_RELOC_SPARC_SIZE32 +- -- : BFD_RELOC_SPARC_SIZE64 +- -- : BFD_RELOC_SPARC_WDISP10 +- SPARC64 relocations +- +- -- : BFD_RELOC_SPARC_REV32 +- SPARC little endian relocation +- +- -- : BFD_RELOC_SPARC_TLS_GD_HI22 +- -- : BFD_RELOC_SPARC_TLS_GD_LO10 +- -- : BFD_RELOC_SPARC_TLS_GD_ADD +- -- : BFD_RELOC_SPARC_TLS_GD_CALL +- -- : BFD_RELOC_SPARC_TLS_LDM_HI22 +- -- : BFD_RELOC_SPARC_TLS_LDM_LO10 +- -- : BFD_RELOC_SPARC_TLS_LDM_ADD +- -- : BFD_RELOC_SPARC_TLS_LDM_CALL +- -- : BFD_RELOC_SPARC_TLS_LDO_HIX22 +- -- : BFD_RELOC_SPARC_TLS_LDO_LOX10 +- -- : BFD_RELOC_SPARC_TLS_LDO_ADD +- -- : BFD_RELOC_SPARC_TLS_IE_HI22 +- -- : BFD_RELOC_SPARC_TLS_IE_LO10 +- -- : BFD_RELOC_SPARC_TLS_IE_LD +- -- : BFD_RELOC_SPARC_TLS_IE_LDX +- -- : BFD_RELOC_SPARC_TLS_IE_ADD +- -- : BFD_RELOC_SPARC_TLS_LE_HIX22 +- -- : BFD_RELOC_SPARC_TLS_LE_LOX10 +- -- : BFD_RELOC_SPARC_TLS_DTPMOD32 +- -- : BFD_RELOC_SPARC_TLS_DTPMOD64 +- -- : BFD_RELOC_SPARC_TLS_DTPOFF32 +- -- : BFD_RELOC_SPARC_TLS_DTPOFF64 +- -- : BFD_RELOC_SPARC_TLS_TPOFF32 +- -- : BFD_RELOC_SPARC_TLS_TPOFF64 +- SPARC TLS relocations +- +- -- : BFD_RELOC_SPU_IMM7 +- -- : BFD_RELOC_SPU_IMM8 +- -- : BFD_RELOC_SPU_IMM10 +- -- : BFD_RELOC_SPU_IMM10W +- -- : BFD_RELOC_SPU_IMM16 +- -- : BFD_RELOC_SPU_IMM16W +- -- : BFD_RELOC_SPU_IMM18 +- -- : BFD_RELOC_SPU_PCREL9a +- -- : BFD_RELOC_SPU_PCREL9b +- -- : BFD_RELOC_SPU_PCREL16 +- -- : BFD_RELOC_SPU_LO16 +- -- : BFD_RELOC_SPU_HI16 +- -- : BFD_RELOC_SPU_PPU32 +- -- : BFD_RELOC_SPU_PPU64 +- -- : BFD_RELOC_SPU_ADD_PIC +- SPU Relocations. +- +- -- : BFD_RELOC_ALPHA_GPDISP_HI16 +- Alpha ECOFF and ELF 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_LO16 +- 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 +- The ELF GPDISP relocation is exactly the same as the GPDISP_HI16 +- relocation except that there is no accompanying GPDISP_LO16 +- relocation. +- +- -- : BFD_RELOC_ALPHA_LITERAL +- -- : BFD_RELOC_ALPHA_ELF_LITERAL +- -- : BFD_RELOC_ALPHA_LITUSE +- 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 ELF_LITERAL reloc is somewhere between 16_GOTOFF and +- GPDISP_LO16. It should refer to the symbol to be referenced, as +- with 16_GOTOFF, but it generates output not based on the position +- within the .got section, but relative to the GP value chosen for +- the file during the final link stage. +- +- 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) +- +- -- : BFD_RELOC_ALPHA_HINT +- 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_LINKAGE +- The LINKAGE relocation outputs a linkage pair in the object file, +- which is filled by the linker. +- +- -- : BFD_RELOC_ALPHA_CODEADDR +- The CODEADDR relocation outputs a STO_CA in the object file, which +- is filled by the linker. +- +- -- : BFD_RELOC_ALPHA_GPREL_HI16 +- -- : BFD_RELOC_ALPHA_GPREL_LO16 +- The GPREL_HI/LO relocations together form a 32-bit offset from the +- GP register. +- +- -- : BFD_RELOC_ALPHA_BRSGP +- Like BFD_RELOC_23_PCREL_S2, except that the source and target must +- share a common GP, and the target address is adjusted for +- STO_ALPHA_STD_GPLOAD. +- +- -- : BFD_RELOC_ALPHA_NOP +- The NOP relocation outputs a NOP if the longword displacement +- between two procedure entry points is < 2^21. +- +- -- : BFD_RELOC_ALPHA_BSR +- The BSR relocation outputs a BSR if the longword displacement +- between two procedure entry points is < 2^21. +- +- -- : BFD_RELOC_ALPHA_LDA +- The LDA relocation outputs a LDA if the longword displacement +- between two procedure entry points is < 2^16. +- +- -- : BFD_RELOC_ALPHA_BOH +- The BOH relocation outputs a BSR if the longword displacement +- between two procedure entry points is < 2^21, or else a hint. +- +- -- : BFD_RELOC_ALPHA_TLSGD +- -- : BFD_RELOC_ALPHA_TLSLDM +- -- : BFD_RELOC_ALPHA_DTPMOD64 +- -- : BFD_RELOC_ALPHA_GOTDTPREL16 +- -- : BFD_RELOC_ALPHA_DTPREL64 +- -- : BFD_RELOC_ALPHA_DTPREL_HI16 +- -- : BFD_RELOC_ALPHA_DTPREL_LO16 +- -- : BFD_RELOC_ALPHA_DTPREL16 +- -- : BFD_RELOC_ALPHA_GOTTPREL16 +- -- : BFD_RELOC_ALPHA_TPREL64 +- -- : BFD_RELOC_ALPHA_TPREL_HI16 +- -- : BFD_RELOC_ALPHA_TPREL_LO16 +- -- : BFD_RELOC_ALPHA_TPREL16 +- Alpha thread-local storage relocations. +- +- -- : BFD_RELOC_MIPS_JMP +- -- : BFD_RELOC_MICROMIPS_JMP +- The MIPS jump instruction. +- +- -- : BFD_RELOC_MIPS16_JMP +- The MIPS16 jump instruction. +- +- -- : BFD_RELOC_MIPS16_GPREL +- MIPS16 GP relative reloc. +- +- -- : BFD_RELOC_HI16 +- High 16 bits of 32-bit value; simple reloc. +- +- -- : BFD_RELOC_HI16_S +- 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_LO16 +- Low 16 bits. +- +- -- : BFD_RELOC_HI16_PCREL +- High 16 bits of 32-bit pc-relative value +- +- -- : BFD_RELOC_HI16_S_PCREL +- High 16 bits of 32-bit pc-relative value, adjusted +- +- -- : BFD_RELOC_LO16_PCREL +- Low 16 bits of pc-relative value +- +- -- : BFD_RELOC_MIPS16_GOT16 +- -- : BFD_RELOC_MIPS16_CALL16 +- Equivalent of BFD_RELOC_MIPS_*, but with the MIPS16 layout of +- 16-bit immediate fields +- +- -- : BFD_RELOC_MIPS16_HI16 +- MIPS16 high 16 bits of 32-bit value. +- +- -- : BFD_RELOC_MIPS16_HI16_S +- MIPS16 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_MIPS16_LO16 +- MIPS16 low 16 bits. +- +- -- : BFD_RELOC_MIPS16_TLS_GD +- -- : BFD_RELOC_MIPS16_TLS_LDM +- -- : BFD_RELOC_MIPS16_TLS_DTPREL_HI16 +- -- : BFD_RELOC_MIPS16_TLS_DTPREL_LO16 +- -- : BFD_RELOC_MIPS16_TLS_GOTTPREL +- -- : BFD_RELOC_MIPS16_TLS_TPREL_HI16 +- -- : BFD_RELOC_MIPS16_TLS_TPREL_LO16 +- MIPS16 TLS relocations +- +- -- : BFD_RELOC_MIPS_LITERAL +- -- : BFD_RELOC_MICROMIPS_LITERAL +- Relocation against a MIPS literal section. +- +- -- : BFD_RELOC_MICROMIPS_7_PCREL_S1 +- -- : BFD_RELOC_MICROMIPS_10_PCREL_S1 +- -- : BFD_RELOC_MICROMIPS_16_PCREL_S1 +- microMIPS PC-relative relocations. +- +- -- : BFD_RELOC_MICROMIPS_GPREL16 +- -- : BFD_RELOC_MICROMIPS_HI16 +- -- : BFD_RELOC_MICROMIPS_HI16_S +- -- : BFD_RELOC_MICROMIPS_LO16 +- microMIPS versions of generic BFD relocs. +- +- -- : BFD_RELOC_MIPS_GOT16 +- -- : BFD_RELOC_MICROMIPS_GOT16 +- -- : BFD_RELOC_MIPS_CALL16 +- -- : BFD_RELOC_MICROMIPS_CALL16 +- -- : BFD_RELOC_MIPS_GOT_HI16 +- -- : BFD_RELOC_MICROMIPS_GOT_HI16 +- -- : BFD_RELOC_MIPS_GOT_LO16 +- -- : BFD_RELOC_MICROMIPS_GOT_LO16 +- -- : BFD_RELOC_MIPS_CALL_HI16 +- -- : BFD_RELOC_MICROMIPS_CALL_HI16 +- -- : BFD_RELOC_MIPS_CALL_LO16 +- -- : BFD_RELOC_MICROMIPS_CALL_LO16 +- -- : BFD_RELOC_MIPS_SUB +- -- : BFD_RELOC_MICROMIPS_SUB +- -- : BFD_RELOC_MIPS_GOT_PAGE +- -- : BFD_RELOC_MICROMIPS_GOT_PAGE +- -- : BFD_RELOC_MIPS_GOT_OFST +- -- : BFD_RELOC_MICROMIPS_GOT_OFST +- -- : BFD_RELOC_MIPS_GOT_DISP +- -- : BFD_RELOC_MICROMIPS_GOT_DISP +- -- : BFD_RELOC_MIPS_SHIFT5 +- -- : BFD_RELOC_MIPS_SHIFT6 +- -- : BFD_RELOC_MIPS_INSERT_A +- -- : BFD_RELOC_MIPS_INSERT_B +- -- : BFD_RELOC_MIPS_DELETE +- -- : BFD_RELOC_MIPS_HIGHEST +- -- : BFD_RELOC_MICROMIPS_HIGHEST +- -- : BFD_RELOC_MIPS_HIGHER +- -- : BFD_RELOC_MICROMIPS_HIGHER +- -- : BFD_RELOC_MIPS_SCN_DISP +- -- : BFD_RELOC_MICROMIPS_SCN_DISP +- -- : BFD_RELOC_MIPS_REL16 +- -- : BFD_RELOC_MIPS_RELGOT +- -- : BFD_RELOC_MIPS_JALR +- -- : BFD_RELOC_MICROMIPS_JALR +- -- : BFD_RELOC_MIPS_TLS_DTPMOD32 +- -- : BFD_RELOC_MIPS_TLS_DTPREL32 +- -- : BFD_RELOC_MIPS_TLS_DTPMOD64 +- -- : BFD_RELOC_MIPS_TLS_DTPREL64 +- -- : BFD_RELOC_MIPS_TLS_GD +- -- : BFD_RELOC_MICROMIPS_TLS_GD +- -- : BFD_RELOC_MIPS_TLS_LDM +- -- : BFD_RELOC_MICROMIPS_TLS_LDM +- -- : BFD_RELOC_MIPS_TLS_DTPREL_HI16 +- -- : BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16 +- -- : BFD_RELOC_MIPS_TLS_DTPREL_LO16 +- -- : BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16 +- -- : BFD_RELOC_MIPS_TLS_GOTTPREL +- -- : BFD_RELOC_MICROMIPS_TLS_GOTTPREL +- -- : BFD_RELOC_MIPS_TLS_TPREL32 +- -- : BFD_RELOC_MIPS_TLS_TPREL64 +- -- : BFD_RELOC_MIPS_TLS_TPREL_HI16 +- -- : BFD_RELOC_MICROMIPS_TLS_TPREL_HI16 +- -- : BFD_RELOC_MIPS_TLS_TPREL_LO16 +- -- : BFD_RELOC_MICROMIPS_TLS_TPREL_LO16 +- -- : BFD_RELOC_MIPS_EH +- MIPS ELF relocations. +- +- -- : BFD_RELOC_MIPS_COPY +- -- : BFD_RELOC_MIPS_JUMP_SLOT +- MIPS ELF relocations (VxWorks and PLT extensions). +- +- -- : BFD_RELOC_MOXIE_10_PCREL +- Moxie ELF relocations. +- +- -- : BFD_RELOC_FRV_LABEL16 +- -- : BFD_RELOC_FRV_LABEL24 +- -- : BFD_RELOC_FRV_LO16 +- -- : BFD_RELOC_FRV_HI16 +- -- : BFD_RELOC_FRV_GPREL12 +- -- : BFD_RELOC_FRV_GPRELU12 +- -- : BFD_RELOC_FRV_GPREL32 +- -- : BFD_RELOC_FRV_GPRELHI +- -- : BFD_RELOC_FRV_GPRELLO +- -- : BFD_RELOC_FRV_GOT12 +- -- : BFD_RELOC_FRV_GOTHI +- -- : BFD_RELOC_FRV_GOTLO +- -- : BFD_RELOC_FRV_FUNCDESC +- -- : BFD_RELOC_FRV_FUNCDESC_GOT12 +- -- : BFD_RELOC_FRV_FUNCDESC_GOTHI +- -- : BFD_RELOC_FRV_FUNCDESC_GOTLO +- -- : BFD_RELOC_FRV_FUNCDESC_VALUE +- -- : BFD_RELOC_FRV_FUNCDESC_GOTOFF12 +- -- : BFD_RELOC_FRV_FUNCDESC_GOTOFFHI +- -- : BFD_RELOC_FRV_FUNCDESC_GOTOFFLO +- -- : BFD_RELOC_FRV_GOTOFF12 +- -- : BFD_RELOC_FRV_GOTOFFHI +- -- : BFD_RELOC_FRV_GOTOFFLO +- -- : BFD_RELOC_FRV_GETTLSOFF +- -- : BFD_RELOC_FRV_TLSDESC_VALUE +- -- : BFD_RELOC_FRV_GOTTLSDESC12 +- -- : BFD_RELOC_FRV_GOTTLSDESCHI +- -- : BFD_RELOC_FRV_GOTTLSDESCLO +- -- : BFD_RELOC_FRV_TLSMOFF12 +- -- : BFD_RELOC_FRV_TLSMOFFHI +- -- : BFD_RELOC_FRV_TLSMOFFLO +- -- : BFD_RELOC_FRV_GOTTLSOFF12 +- -- : BFD_RELOC_FRV_GOTTLSOFFHI +- -- : BFD_RELOC_FRV_GOTTLSOFFLO +- -- : BFD_RELOC_FRV_TLSOFF +- -- : BFD_RELOC_FRV_TLSDESC_RELAX +- -- : BFD_RELOC_FRV_GETTLSOFF_RELAX +- -- : BFD_RELOC_FRV_TLSOFF_RELAX +- -- : BFD_RELOC_FRV_TLSMOFF +- Fujitsu Frv Relocations. +- +- -- : BFD_RELOC_MN10300_GOTOFF24 +- This is a 24bit GOT-relative reloc for the mn10300. +- +- -- : BFD_RELOC_MN10300_GOT32 +- This is a 32bit GOT-relative reloc for the mn10300, offset by two +- bytes in the instruction. +- +- -- : BFD_RELOC_MN10300_GOT24 +- This is a 24bit GOT-relative reloc for the mn10300, offset by two +- bytes in the instruction. +- +- -- : BFD_RELOC_MN10300_GOT16 +- This is a 16bit GOT-relative reloc for the mn10300, offset by two +- bytes in the instruction. +- +- -- : BFD_RELOC_MN10300_COPY +- Copy symbol at runtime. +- +- -- : BFD_RELOC_MN10300_GLOB_DAT +- Create GOT entry. +- +- -- : BFD_RELOC_MN10300_JMP_SLOT +- Create PLT entry. +- +- -- : BFD_RELOC_MN10300_RELATIVE +- Adjust by program base. +- +- -- : BFD_RELOC_MN10300_SYM_DIFF +- Together with another reloc targeted at the same location, allows +- for a value that is the difference of two symbols in the same +- section. +- +- -- : BFD_RELOC_MN10300_ALIGN +- The addend of this reloc is an alignment power that must be +- honoured at the offset's location, regardless of linker relaxation. +- +- -- : BFD_RELOC_MN10300_TLS_GD +- -- : BFD_RELOC_MN10300_TLS_LD +- -- : BFD_RELOC_MN10300_TLS_LDO +- -- : BFD_RELOC_MN10300_TLS_GOTIE +- -- : BFD_RELOC_MN10300_TLS_IE +- -- : BFD_RELOC_MN10300_TLS_LE +- -- : BFD_RELOC_MN10300_TLS_DTPMOD +- -- : BFD_RELOC_MN10300_TLS_DTPOFF +- -- : BFD_RELOC_MN10300_TLS_TPOFF +- Various TLS-related relocations. +- +- -- : BFD_RELOC_MN10300_32_PCREL +- This is a 32bit pcrel reloc for the mn10300, offset by two bytes +- in the instruction. +- +- -- : BFD_RELOC_MN10300_16_PCREL +- This is a 16bit pcrel reloc for the mn10300, offset by two bytes +- in the instruction. +- +- -- : 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_386_TLS_TPOFF +- -- : BFD_RELOC_386_TLS_IE +- -- : BFD_RELOC_386_TLS_GOTIE +- -- : BFD_RELOC_386_TLS_LE +- -- : BFD_RELOC_386_TLS_GD +- -- : BFD_RELOC_386_TLS_LDM +- -- : BFD_RELOC_386_TLS_LDO_32 +- -- : BFD_RELOC_386_TLS_IE_32 +- -- : BFD_RELOC_386_TLS_LE_32 +- -- : BFD_RELOC_386_TLS_DTPMOD32 +- -- : BFD_RELOC_386_TLS_DTPOFF32 +- -- : BFD_RELOC_386_TLS_TPOFF32 +- -- : BFD_RELOC_386_TLS_GOTDESC +- -- : BFD_RELOC_386_TLS_DESC_CALL +- -- : BFD_RELOC_386_TLS_DESC +- -- : BFD_RELOC_386_IRELATIVE +- i386/elf relocations +- +- -- : BFD_RELOC_X86_64_GOT32 +- -- : BFD_RELOC_X86_64_PLT32 +- -- : BFD_RELOC_X86_64_COPY +- -- : BFD_RELOC_X86_64_GLOB_DAT +- -- : BFD_RELOC_X86_64_JUMP_SLOT +- -- : BFD_RELOC_X86_64_RELATIVE +- -- : BFD_RELOC_X86_64_GOTPCREL +- -- : BFD_RELOC_X86_64_32S +- -- : BFD_RELOC_X86_64_DTPMOD64 +- -- : BFD_RELOC_X86_64_DTPOFF64 +- -- : BFD_RELOC_X86_64_TPOFF64 +- -- : BFD_RELOC_X86_64_TLSGD +- -- : BFD_RELOC_X86_64_TLSLD +- -- : BFD_RELOC_X86_64_DTPOFF32 +- -- : BFD_RELOC_X86_64_GOTTPOFF +- -- : BFD_RELOC_X86_64_TPOFF32 +- -- : BFD_RELOC_X86_64_GOTOFF64 +- -- : BFD_RELOC_X86_64_GOTPC32 +- -- : BFD_RELOC_X86_64_GOT64 +- -- : BFD_RELOC_X86_64_GOTPCREL64 +- -- : BFD_RELOC_X86_64_GOTPC64 +- -- : BFD_RELOC_X86_64_GOTPLT64 +- -- : BFD_RELOC_X86_64_PLTOFF64 +- -- : BFD_RELOC_X86_64_GOTPC32_TLSDESC +- -- : BFD_RELOC_X86_64_TLSDESC_CALL +- -- : BFD_RELOC_X86_64_TLSDESC +- -- : BFD_RELOC_X86_64_IRELATIVE +- -- : BFD_RELOC_X86_64_PC32_BND +- -- : BFD_RELOC_X86_64_PLT32_BND +- x86-64/elf 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 +- ns32k relocations +- +- -- : BFD_RELOC_PDP11_DISP_8_PCREL +- -- : BFD_RELOC_PDP11_DISP_6_PCREL +- PDP11 relocations +- +- -- : BFD_RELOC_PJ_CODE_HI16 +- -- : BFD_RELOC_PJ_CODE_LO16 +- -- : BFD_RELOC_PJ_CODE_DIR16 +- -- : BFD_RELOC_PJ_CODE_DIR32 +- -- : BFD_RELOC_PJ_CODE_REL16 +- -- : BFD_RELOC_PJ_CODE_REL32 +- Picojava relocs. Not all of these appear in object files. +- +- -- : 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_PPC_VLE_REL8 +- -- : BFD_RELOC_PPC_VLE_REL15 +- -- : BFD_RELOC_PPC_VLE_REL24 +- -- : BFD_RELOC_PPC_VLE_LO16A +- -- : BFD_RELOC_PPC_VLE_LO16D +- -- : BFD_RELOC_PPC_VLE_HI16A +- -- : BFD_RELOC_PPC_VLE_HI16D +- -- : BFD_RELOC_PPC_VLE_HA16A +- -- : BFD_RELOC_PPC_VLE_HA16D +- -- : BFD_RELOC_PPC_VLE_SDA21 +- -- : BFD_RELOC_PPC_VLE_SDA21_LO +- -- : BFD_RELOC_PPC_VLE_SDAREL_LO16A +- -- : BFD_RELOC_PPC_VLE_SDAREL_LO16D +- -- : BFD_RELOC_PPC_VLE_SDAREL_HI16A +- -- : BFD_RELOC_PPC_VLE_SDAREL_HI16D +- -- : BFD_RELOC_PPC_VLE_SDAREL_HA16A +- -- : BFD_RELOC_PPC_VLE_SDAREL_HA16D +- -- : BFD_RELOC_PPC64_HIGHER +- -- : BFD_RELOC_PPC64_HIGHER_S +- -- : BFD_RELOC_PPC64_HIGHEST +- -- : BFD_RELOC_PPC64_HIGHEST_S +- -- : BFD_RELOC_PPC64_TOC16_LO +- -- : BFD_RELOC_PPC64_TOC16_HI +- -- : BFD_RELOC_PPC64_TOC16_HA +- -- : BFD_RELOC_PPC64_TOC +- -- : BFD_RELOC_PPC64_PLTGOT16 +- -- : BFD_RELOC_PPC64_PLTGOT16_LO +- -- : BFD_RELOC_PPC64_PLTGOT16_HI +- -- : BFD_RELOC_PPC64_PLTGOT16_HA +- -- : BFD_RELOC_PPC64_ADDR16_DS +- -- : BFD_RELOC_PPC64_ADDR16_LO_DS +- -- : BFD_RELOC_PPC64_GOT16_DS +- -- : BFD_RELOC_PPC64_GOT16_LO_DS +- -- : BFD_RELOC_PPC64_PLT16_LO_DS +- -- : BFD_RELOC_PPC64_SECTOFF_DS +- -- : BFD_RELOC_PPC64_SECTOFF_LO_DS +- -- : BFD_RELOC_PPC64_TOC16_DS +- -- : BFD_RELOC_PPC64_TOC16_LO_DS +- -- : BFD_RELOC_PPC64_PLTGOT16_DS +- -- : BFD_RELOC_PPC64_PLTGOT16_LO_DS +- -- : BFD_RELOC_PPC64_ADDR16_HIGH +- -- : BFD_RELOC_PPC64_ADDR16_HIGHA +- Power(rs6000) and PowerPC relocations. +- +- -- : BFD_RELOC_PPC_TLS +- -- : BFD_RELOC_PPC_TLSGD +- -- : BFD_RELOC_PPC_TLSLD +- -- : BFD_RELOC_PPC_DTPMOD +- -- : BFD_RELOC_PPC_TPREL16 +- -- : BFD_RELOC_PPC_TPREL16_LO +- -- : BFD_RELOC_PPC_TPREL16_HI +- -- : BFD_RELOC_PPC_TPREL16_HA +- -- : BFD_RELOC_PPC_TPREL +- -- : BFD_RELOC_PPC_DTPREL16 +- -- : BFD_RELOC_PPC_DTPREL16_LO +- -- : BFD_RELOC_PPC_DTPREL16_HI +- -- : BFD_RELOC_PPC_DTPREL16_HA +- -- : BFD_RELOC_PPC_DTPREL +- -- : BFD_RELOC_PPC_GOT_TLSGD16 +- -- : BFD_RELOC_PPC_GOT_TLSGD16_LO +- -- : BFD_RELOC_PPC_GOT_TLSGD16_HI +- -- : BFD_RELOC_PPC_GOT_TLSGD16_HA +- -- : BFD_RELOC_PPC_GOT_TLSLD16 +- -- : BFD_RELOC_PPC_GOT_TLSLD16_LO +- -- : BFD_RELOC_PPC_GOT_TLSLD16_HI +- -- : BFD_RELOC_PPC_GOT_TLSLD16_HA +- -- : BFD_RELOC_PPC_GOT_TPREL16 +- -- : BFD_RELOC_PPC_GOT_TPREL16_LO +- -- : BFD_RELOC_PPC_GOT_TPREL16_HI +- -- : BFD_RELOC_PPC_GOT_TPREL16_HA +- -- : BFD_RELOC_PPC_GOT_DTPREL16 +- -- : BFD_RELOC_PPC_GOT_DTPREL16_LO +- -- : BFD_RELOC_PPC_GOT_DTPREL16_HI +- -- : BFD_RELOC_PPC_GOT_DTPREL16_HA +- -- : BFD_RELOC_PPC64_TPREL16_DS +- -- : BFD_RELOC_PPC64_TPREL16_LO_DS +- -- : BFD_RELOC_PPC64_TPREL16_HIGHER +- -- : BFD_RELOC_PPC64_TPREL16_HIGHERA +- -- : BFD_RELOC_PPC64_TPREL16_HIGHEST +- -- : BFD_RELOC_PPC64_TPREL16_HIGHESTA +- -- : BFD_RELOC_PPC64_DTPREL16_DS +- -- : BFD_RELOC_PPC64_DTPREL16_LO_DS +- -- : BFD_RELOC_PPC64_DTPREL16_HIGHER +- -- : BFD_RELOC_PPC64_DTPREL16_HIGHERA +- -- : BFD_RELOC_PPC64_DTPREL16_HIGHEST +- -- : BFD_RELOC_PPC64_DTPREL16_HIGHESTA +- -- : BFD_RELOC_PPC64_TPREL16_HIGH +- -- : BFD_RELOC_PPC64_TPREL16_HIGHA +- -- : BFD_RELOC_PPC64_DTPREL16_HIGH +- -- : BFD_RELOC_PPC64_DTPREL16_HIGHA +- PowerPC and PowerPC64 thread-local storage relocations. +- +- -- : BFD_RELOC_I370_D12 +- IBM 370/390 relocations +- +- -- : BFD_RELOC_CTOR +- The type of reloc used to build a constructor 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_ARM_PCREL_BRANCH +- ARM 26 bit pc-relative branch. The lowest two bits must be zero +- and are not stored in the instruction. +- +- -- : BFD_RELOC_ARM_PCREL_BLX +- ARM 26 bit pc-relative branch. The lowest bit must be zero and is +- not stored in the instruction. The 2nd lowest bit comes from a 1 +- bit field in the instruction. +- +- -- : BFD_RELOC_THUMB_PCREL_BLX +- Thumb 22 bit pc-relative branch. The lowest bit must be zero and +- is not stored in the instruction. The 2nd lowest bit comes from a +- 1 bit field in the instruction. +- +- -- : BFD_RELOC_ARM_PCREL_CALL +- ARM 26-bit pc-relative branch for an unconditional BL or BLX +- instruction. +- +- -- : BFD_RELOC_ARM_PCREL_JUMP +- ARM 26-bit pc-relative branch for B or conditional BL instruction. +- +- -- : BFD_RELOC_THUMB_PCREL_BRANCH7 +- -- : BFD_RELOC_THUMB_PCREL_BRANCH9 +- -- : BFD_RELOC_THUMB_PCREL_BRANCH12 +- -- : BFD_RELOC_THUMB_PCREL_BRANCH20 +- -- : BFD_RELOC_THUMB_PCREL_BRANCH23 +- -- : BFD_RELOC_THUMB_PCREL_BRANCH25 +- Thumb 7-, 9-, 12-, 20-, 23-, and 25-bit pc-relative branches. The +- lowest bit must be zero and is not stored in the instruction. +- Note that the corresponding ELF R_ARM_THM_JUMPnn constant has an +- "nn" one smaller in all cases. Note further that BRANCH23 +- corresponds to R_ARM_THM_CALL. +- +- -- : BFD_RELOC_ARM_OFFSET_IMM +- 12-bit immediate offset, used in ARM-format ldr and str +- instructions. +- +- -- : BFD_RELOC_ARM_THUMB_OFFSET +- 5-bit immediate offset, used in Thumb-format ldr and str +- instructions. +- +- -- : BFD_RELOC_ARM_TARGET1 +- Pc-relative or absolute relocation depending on target. Used for +- entries in .init_array sections. +- +- -- : BFD_RELOC_ARM_ROSEGREL32 +- Read-only segment base relative address. +- +- -- : BFD_RELOC_ARM_SBREL32 +- Data segment base relative address. +- +- -- : BFD_RELOC_ARM_TARGET2 +- This reloc is used for references to RTTI data from exception +- handling tables. The actual definition depends on the target. It +- may be a pc-relative or some form of GOT-indirect relocation. +- +- -- : BFD_RELOC_ARM_PREL31 +- 31-bit PC relative address. +- +- -- : BFD_RELOC_ARM_MOVW +- -- : BFD_RELOC_ARM_MOVT +- -- : BFD_RELOC_ARM_MOVW_PCREL +- -- : BFD_RELOC_ARM_MOVT_PCREL +- -- : BFD_RELOC_ARM_THUMB_MOVW +- -- : BFD_RELOC_ARM_THUMB_MOVT +- -- : BFD_RELOC_ARM_THUMB_MOVW_PCREL +- -- : BFD_RELOC_ARM_THUMB_MOVT_PCREL +- Low and High halfword relocations for MOVW and MOVT instructions. +- +- -- : BFD_RELOC_ARM_JUMP_SLOT +- -- : BFD_RELOC_ARM_GLOB_DAT +- -- : BFD_RELOC_ARM_GOT32 +- -- : BFD_RELOC_ARM_PLT32 +- -- : BFD_RELOC_ARM_RELATIVE +- -- : BFD_RELOC_ARM_GOTOFF +- -- : BFD_RELOC_ARM_GOTPC +- -- : BFD_RELOC_ARM_GOT_PREL +- Relocations for setting up GOTs and PLTs for shared libraries. +- +- -- : BFD_RELOC_ARM_TLS_GD32 +- -- : BFD_RELOC_ARM_TLS_LDO32 +- -- : BFD_RELOC_ARM_TLS_LDM32 +- -- : BFD_RELOC_ARM_TLS_DTPOFF32 +- -- : BFD_RELOC_ARM_TLS_DTPMOD32 +- -- : BFD_RELOC_ARM_TLS_TPOFF32 +- -- : BFD_RELOC_ARM_TLS_IE32 +- -- : BFD_RELOC_ARM_TLS_LE32 +- -- : BFD_RELOC_ARM_TLS_GOTDESC +- -- : BFD_RELOC_ARM_TLS_CALL +- -- : BFD_RELOC_ARM_THM_TLS_CALL +- -- : BFD_RELOC_ARM_TLS_DESCSEQ +- -- : BFD_RELOC_ARM_THM_TLS_DESCSEQ +- -- : BFD_RELOC_ARM_TLS_DESC +- ARM thread-local storage relocations. +- +- -- : BFD_RELOC_ARM_ALU_PC_G0_NC +- -- : BFD_RELOC_ARM_ALU_PC_G0 +- -- : BFD_RELOC_ARM_ALU_PC_G1_NC +- -- : BFD_RELOC_ARM_ALU_PC_G1 +- -- : BFD_RELOC_ARM_ALU_PC_G2 +- -- : BFD_RELOC_ARM_LDR_PC_G0 +- -- : BFD_RELOC_ARM_LDR_PC_G1 +- -- : BFD_RELOC_ARM_LDR_PC_G2 +- -- : BFD_RELOC_ARM_LDRS_PC_G0 +- -- : BFD_RELOC_ARM_LDRS_PC_G1 +- -- : BFD_RELOC_ARM_LDRS_PC_G2 +- -- : BFD_RELOC_ARM_LDC_PC_G0 +- -- : BFD_RELOC_ARM_LDC_PC_G1 +- -- : BFD_RELOC_ARM_LDC_PC_G2 +- -- : BFD_RELOC_ARM_ALU_SB_G0_NC +- -- : BFD_RELOC_ARM_ALU_SB_G0 +- -- : BFD_RELOC_ARM_ALU_SB_G1_NC +- -- : BFD_RELOC_ARM_ALU_SB_G1 +- -- : BFD_RELOC_ARM_ALU_SB_G2 +- -- : BFD_RELOC_ARM_LDR_SB_G0 +- -- : BFD_RELOC_ARM_LDR_SB_G1 +- -- : BFD_RELOC_ARM_LDR_SB_G2 +- -- : BFD_RELOC_ARM_LDRS_SB_G0 +- -- : BFD_RELOC_ARM_LDRS_SB_G1 +- -- : BFD_RELOC_ARM_LDRS_SB_G2 +- -- : BFD_RELOC_ARM_LDC_SB_G0 +- -- : BFD_RELOC_ARM_LDC_SB_G1 +- -- : BFD_RELOC_ARM_LDC_SB_G2 +- ARM group relocations. +- +- -- : BFD_RELOC_ARM_V4BX +- Annotation of BX instructions. +- +- -- : BFD_RELOC_ARM_IRELATIVE +- ARM support for STT_GNU_IFUNC. +- +- -- : BFD_RELOC_ARM_IMMEDIATE +- -- : BFD_RELOC_ARM_ADRL_IMMEDIATE +- -- : BFD_RELOC_ARM_T32_IMMEDIATE +- -- : BFD_RELOC_ARM_T32_ADD_IMM +- -- : BFD_RELOC_ARM_T32_IMM12 +- -- : BFD_RELOC_ARM_T32_ADD_PC12 +- -- : BFD_RELOC_ARM_SHIFT_IMM +- -- : BFD_RELOC_ARM_SMC +- -- : BFD_RELOC_ARM_HVC +- -- : BFD_RELOC_ARM_SWI +- -- : BFD_RELOC_ARM_MULTI +- -- : BFD_RELOC_ARM_CP_OFF_IMM +- -- : BFD_RELOC_ARM_CP_OFF_IMM_S2 +- -- : BFD_RELOC_ARM_T32_CP_OFF_IMM +- -- : BFD_RELOC_ARM_T32_CP_OFF_IMM_S2 +- -- : BFD_RELOC_ARM_ADR_IMM +- -- : BFD_RELOC_ARM_LDR_IMM +- -- : BFD_RELOC_ARM_LITERAL +- -- : BFD_RELOC_ARM_IN_POOL +- -- : BFD_RELOC_ARM_OFFSET_IMM8 +- -- : BFD_RELOC_ARM_T32_OFFSET_U8 +- -- : BFD_RELOC_ARM_T32_OFFSET_IMM +- -- : BFD_RELOC_ARM_HWLITERAL +- -- : BFD_RELOC_ARM_THUMB_ADD +- -- : BFD_RELOC_ARM_THUMB_IMM +- -- : BFD_RELOC_ARM_THUMB_SHIFT +- These relocs are only used within the ARM assembler. They are not +- (at present) written to any object files. +- +- -- : BFD_RELOC_SH_PCDISP8BY2 +- -- : BFD_RELOC_SH_PCDISP12BY2 +- -- : BFD_RELOC_SH_IMM3 +- -- : BFD_RELOC_SH_IMM3U +- -- : BFD_RELOC_SH_DISP12 +- -- : BFD_RELOC_SH_DISP12BY2 +- -- : BFD_RELOC_SH_DISP12BY4 +- -- : BFD_RELOC_SH_DISP12BY8 +- -- : BFD_RELOC_SH_DISP20 +- -- : BFD_RELOC_SH_DISP20BY8 +- -- : BFD_RELOC_SH_IMM4 +- -- : BFD_RELOC_SH_IMM4BY2 +- -- : BFD_RELOC_SH_IMM4BY4 +- -- : BFD_RELOC_SH_IMM8 +- -- : BFD_RELOC_SH_IMM8BY2 +- -- : BFD_RELOC_SH_IMM8BY4 +- -- : BFD_RELOC_SH_PCRELIMM8BY2 +- -- : BFD_RELOC_SH_PCRELIMM8BY4 +- -- : BFD_RELOC_SH_SWITCH16 +- -- : BFD_RELOC_SH_SWITCH32 +- -- : BFD_RELOC_SH_USES +- -- : BFD_RELOC_SH_COUNT +- -- : BFD_RELOC_SH_ALIGN +- -- : BFD_RELOC_SH_CODE +- -- : BFD_RELOC_SH_DATA +- -- : BFD_RELOC_SH_LABEL +- -- : BFD_RELOC_SH_LOOP_START +- -- : BFD_RELOC_SH_LOOP_END +- -- : BFD_RELOC_SH_COPY +- -- : BFD_RELOC_SH_GLOB_DAT +- -- : BFD_RELOC_SH_JMP_SLOT +- -- : BFD_RELOC_SH_RELATIVE +- -- : BFD_RELOC_SH_GOTPC +- -- : BFD_RELOC_SH_GOT_LOW16 +- -- : BFD_RELOC_SH_GOT_MEDLOW16 +- -- : BFD_RELOC_SH_GOT_MEDHI16 +- -- : BFD_RELOC_SH_GOT_HI16 +- -- : BFD_RELOC_SH_GOTPLT_LOW16 +- -- : BFD_RELOC_SH_GOTPLT_MEDLOW16 +- -- : BFD_RELOC_SH_GOTPLT_MEDHI16 +- -- : BFD_RELOC_SH_GOTPLT_HI16 +- -- : BFD_RELOC_SH_PLT_LOW16 +- -- : BFD_RELOC_SH_PLT_MEDLOW16 +- -- : BFD_RELOC_SH_PLT_MEDHI16 +- -- : BFD_RELOC_SH_PLT_HI16 +- -- : BFD_RELOC_SH_GOTOFF_LOW16 +- -- : BFD_RELOC_SH_GOTOFF_MEDLOW16 +- -- : BFD_RELOC_SH_GOTOFF_MEDHI16 +- -- : BFD_RELOC_SH_GOTOFF_HI16 +- -- : BFD_RELOC_SH_GOTPC_LOW16 +- -- : BFD_RELOC_SH_GOTPC_MEDLOW16 +- -- : BFD_RELOC_SH_GOTPC_MEDHI16 +- -- : BFD_RELOC_SH_GOTPC_HI16 +- -- : BFD_RELOC_SH_COPY64 +- -- : BFD_RELOC_SH_GLOB_DAT64 +- -- : BFD_RELOC_SH_JMP_SLOT64 +- -- : BFD_RELOC_SH_RELATIVE64 +- -- : BFD_RELOC_SH_GOT10BY4 +- -- : BFD_RELOC_SH_GOT10BY8 +- -- : BFD_RELOC_SH_GOTPLT10BY4 +- -- : BFD_RELOC_SH_GOTPLT10BY8 +- -- : BFD_RELOC_SH_GOTPLT32 +- -- : BFD_RELOC_SH_SHMEDIA_CODE +- -- : BFD_RELOC_SH_IMMU5 +- -- : BFD_RELOC_SH_IMMS6 +- -- : BFD_RELOC_SH_IMMS6BY32 +- -- : BFD_RELOC_SH_IMMU6 +- -- : BFD_RELOC_SH_IMMS10 +- -- : BFD_RELOC_SH_IMMS10BY2 +- -- : BFD_RELOC_SH_IMMS10BY4 +- -- : BFD_RELOC_SH_IMMS10BY8 +- -- : BFD_RELOC_SH_IMMS16 +- -- : BFD_RELOC_SH_IMMU16 +- -- : BFD_RELOC_SH_IMM_LOW16 +- -- : BFD_RELOC_SH_IMM_LOW16_PCREL +- -- : BFD_RELOC_SH_IMM_MEDLOW16 +- -- : BFD_RELOC_SH_IMM_MEDLOW16_PCREL +- -- : BFD_RELOC_SH_IMM_MEDHI16 +- -- : BFD_RELOC_SH_IMM_MEDHI16_PCREL +- -- : BFD_RELOC_SH_IMM_HI16 +- -- : BFD_RELOC_SH_IMM_HI16_PCREL +- -- : BFD_RELOC_SH_PT_16 +- -- : BFD_RELOC_SH_TLS_GD_32 +- -- : BFD_RELOC_SH_TLS_LD_32 +- -- : BFD_RELOC_SH_TLS_LDO_32 +- -- : BFD_RELOC_SH_TLS_IE_32 +- -- : BFD_RELOC_SH_TLS_LE_32 +- -- : BFD_RELOC_SH_TLS_DTPMOD32 +- -- : BFD_RELOC_SH_TLS_DTPOFF32 +- -- : BFD_RELOC_SH_TLS_TPOFF32 +- -- : BFD_RELOC_SH_GOT20 +- -- : BFD_RELOC_SH_GOTOFF20 +- -- : BFD_RELOC_SH_GOTFUNCDESC +- -- : BFD_RELOC_SH_GOTFUNCDESC20 +- -- : BFD_RELOC_SH_GOTOFFFUNCDESC +- -- : BFD_RELOC_SH_GOTOFFFUNCDESC20 +- -- : BFD_RELOC_SH_FUNCDESC +- Renesas / SuperH SH relocs. Not all of these appear in object +- files. +- +- -- : BFD_RELOC_ARC_B22_PCREL +- ARC Cores relocs. ARC 22 bit pc-relative branch. The lowest two +- bits must be zero and are not stored in the instruction. The high +- 20 bits are installed in bits 26 through 7 of the instruction. +- +- -- : BFD_RELOC_ARC_B26 +- ARC 26 bit absolute branch. The lowest two bits must be zero and +- are not stored in the instruction. The high 24 bits are installed +- in bits 23 through 0. +- +- -- : BFD_RELOC_BFIN_16_IMM +- ADI Blackfin 16 bit immediate absolute reloc. +- +- -- : BFD_RELOC_BFIN_16_HIGH +- ADI Blackfin 16 bit immediate absolute reloc higher 16 bits. +- +- -- : BFD_RELOC_BFIN_4_PCREL +- ADI Blackfin 'a' part of LSETUP. +- +- -- : BFD_RELOC_BFIN_5_PCREL +- ADI Blackfin. +- +- -- : BFD_RELOC_BFIN_16_LOW +- ADI Blackfin 16 bit immediate absolute reloc lower 16 bits. +- +- -- : BFD_RELOC_BFIN_10_PCREL +- ADI Blackfin. +- +- -- : BFD_RELOC_BFIN_11_PCREL +- ADI Blackfin 'b' part of LSETUP. +- +- -- : BFD_RELOC_BFIN_12_PCREL_JUMP +- ADI Blackfin. +- +- -- : BFD_RELOC_BFIN_12_PCREL_JUMP_S +- ADI Blackfin Short jump, pcrel. +- +- -- : BFD_RELOC_BFIN_24_PCREL_CALL_X +- ADI Blackfin Call.x not implemented. +- +- -- : BFD_RELOC_BFIN_24_PCREL_JUMP_L +- ADI Blackfin Long Jump pcrel. +- +- -- : BFD_RELOC_BFIN_GOT17M4 +- -- : BFD_RELOC_BFIN_GOTHI +- -- : BFD_RELOC_BFIN_GOTLO +- -- : BFD_RELOC_BFIN_FUNCDESC +- -- : BFD_RELOC_BFIN_FUNCDESC_GOT17M4 +- -- : BFD_RELOC_BFIN_FUNCDESC_GOTHI +- -- : BFD_RELOC_BFIN_FUNCDESC_GOTLO +- -- : BFD_RELOC_BFIN_FUNCDESC_VALUE +- -- : BFD_RELOC_BFIN_FUNCDESC_GOTOFF17M4 +- -- : BFD_RELOC_BFIN_FUNCDESC_GOTOFFHI +- -- : BFD_RELOC_BFIN_FUNCDESC_GOTOFFLO +- -- : BFD_RELOC_BFIN_GOTOFF17M4 +- -- : BFD_RELOC_BFIN_GOTOFFHI +- -- : BFD_RELOC_BFIN_GOTOFFLO +- ADI Blackfin FD-PIC relocations. +- +- -- : BFD_RELOC_BFIN_GOT +- ADI Blackfin GOT relocation. +- +- -- : BFD_RELOC_BFIN_PLTPC +- ADI Blackfin PLTPC relocation. +- +- -- : BFD_ARELOC_BFIN_PUSH +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_CONST +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_ADD +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_SUB +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_MULT +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_DIV +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_MOD +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_LSHIFT +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_RSHIFT +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_AND +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_OR +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_XOR +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_LAND +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_LOR +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_LEN +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_NEG +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_COMP +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_PAGE +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_HWPAGE +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_ARELOC_BFIN_ADDR +- ADI Blackfin arithmetic relocation. +- +- -- : BFD_RELOC_D10V_10_PCREL_R +- Mitsubishi D10V relocs. This is a 10-bit reloc with the right 2 +- bits assumed to be 0. +- +- -- : BFD_RELOC_D10V_10_PCREL_L +- Mitsubishi D10V relocs. This is a 10-bit reloc with the right 2 +- bits assumed to be 0. This is the same as the previous reloc +- except it is in the left container, i.e., shifted left 15 bits. +- +- -- : BFD_RELOC_D10V_18 +- This is an 18-bit reloc with the right 2 bits assumed to be 0. +- +- -- : BFD_RELOC_D10V_18_PCREL +- This is an 18-bit reloc with the right 2 bits assumed to be 0. +- +- -- : BFD_RELOC_D30V_6 +- Mitsubishi D30V relocs. This is a 6-bit absolute reloc. +- +- -- : BFD_RELOC_D30V_9_PCREL +- This is a 6-bit pc-relative reloc with the right 3 bits assumed to +- be 0. +- +- -- : BFD_RELOC_D30V_9_PCREL_R +- This is a 6-bit pc-relative reloc with the right 3 bits assumed to +- be 0. Same as the previous reloc but on the right side of the +- container. +- +- -- : BFD_RELOC_D30V_15 +- This is a 12-bit absolute reloc with the right 3 bitsassumed to be +- 0. +- +- -- : BFD_RELOC_D30V_15_PCREL +- This is a 12-bit pc-relative reloc with the right 3 bits assumed +- to be 0. +- +- -- : BFD_RELOC_D30V_15_PCREL_R +- This is a 12-bit pc-relative reloc with the right 3 bits assumed +- to be 0. Same as the previous reloc but on the right side of the +- container. +- +- -- : BFD_RELOC_D30V_21 +- This is an 18-bit absolute reloc with the right 3 bits assumed to +- be 0. +- +- -- : BFD_RELOC_D30V_21_PCREL +- This is an 18-bit pc-relative reloc with the right 3 bits assumed +- to be 0. +- +- -- : BFD_RELOC_D30V_21_PCREL_R +- This is an 18-bit pc-relative reloc with the right 3 bits assumed +- to be 0. Same as the previous reloc but on the right side of the +- container. +- +- -- : BFD_RELOC_D30V_32 +- This is a 32-bit absolute reloc. +- +- -- : BFD_RELOC_D30V_32_PCREL +- This is a 32-bit pc-relative reloc. +- +- -- : BFD_RELOC_DLX_HI16_S +- DLX relocs +- +- -- : BFD_RELOC_DLX_LO16 +- DLX relocs +- +- -- : BFD_RELOC_DLX_JMP26 +- DLX relocs +- +- -- : BFD_RELOC_M32C_HI8 +- -- : BFD_RELOC_M32C_RL_JUMP +- -- : BFD_RELOC_M32C_RL_1ADDR +- -- : BFD_RELOC_M32C_RL_2ADDR +- Renesas M16C/M32C Relocations. +- +- -- : BFD_RELOC_M32R_24 +- Renesas M32R (formerly Mitsubishi M32R) relocs. This is a 24 bit +- absolute address. +- +- -- : BFD_RELOC_M32R_10_PCREL +- This is a 10-bit pc-relative reloc with the right 2 bits assumed +- to be 0. +- +- -- : BFD_RELOC_M32R_18_PCREL +- This is an 18-bit reloc with the right 2 bits assumed to be 0. +- +- -- : BFD_RELOC_M32R_26_PCREL +- This is a 26-bit reloc with the right 2 bits assumed to be 0. +- +- -- : BFD_RELOC_M32R_HI16_ULO +- This is a 16-bit reloc containing the high 16 bits of an address +- used when the lower 16 bits are treated as unsigned. +- +- -- : BFD_RELOC_M32R_HI16_SLO +- This is a 16-bit reloc containing the high 16 bits of an address +- used when the lower 16 bits are treated as signed. +- +- -- : BFD_RELOC_M32R_LO16 +- This is a 16-bit reloc containing the lower 16 bits of an address. +- +- -- : BFD_RELOC_M32R_SDA16 +- This is a 16-bit reloc containing the small data area offset for +- use in add3, load, and store instructions. +- +- -- : BFD_RELOC_M32R_GOT24 +- -- : BFD_RELOC_M32R_26_PLTREL +- -- : BFD_RELOC_M32R_COPY +- -- : BFD_RELOC_M32R_GLOB_DAT +- -- : BFD_RELOC_M32R_JMP_SLOT +- -- : BFD_RELOC_M32R_RELATIVE +- -- : BFD_RELOC_M32R_GOTOFF +- -- : BFD_RELOC_M32R_GOTOFF_HI_ULO +- -- : BFD_RELOC_M32R_GOTOFF_HI_SLO +- -- : BFD_RELOC_M32R_GOTOFF_LO +- -- : BFD_RELOC_M32R_GOTPC24 +- -- : BFD_RELOC_M32R_GOT16_HI_ULO +- -- : BFD_RELOC_M32R_GOT16_HI_SLO +- -- : BFD_RELOC_M32R_GOT16_LO +- -- : BFD_RELOC_M32R_GOTPC_HI_ULO +- -- : BFD_RELOC_M32R_GOTPC_HI_SLO +- -- : BFD_RELOC_M32R_GOTPC_LO +- For PIC. +- +- -- : BFD_RELOC_V850_9_PCREL +- This is a 9-bit reloc +- +- -- : BFD_RELOC_V850_22_PCREL +- This is a 22-bit reloc +- +- -- : BFD_RELOC_V850_SDA_16_16_OFFSET +- This is a 16 bit offset from the short data area pointer. +- +- -- : BFD_RELOC_V850_SDA_15_16_OFFSET +- This is a 16 bit offset (of which only 15 bits are used) from the +- short data area pointer. +- +- -- : BFD_RELOC_V850_ZDA_16_16_OFFSET +- This is a 16 bit offset from the zero data area pointer. +- +- -- : BFD_RELOC_V850_ZDA_15_16_OFFSET +- This is a 16 bit offset (of which only 15 bits are used) from the +- zero data area pointer. +- +- -- : BFD_RELOC_V850_TDA_6_8_OFFSET +- This is an 8 bit offset (of which only 6 bits are used) from the +- tiny data area pointer. +- +- -- : BFD_RELOC_V850_TDA_7_8_OFFSET +- This is an 8bit offset (of which only 7 bits are used) from the +- tiny data area pointer. +- +- -- : BFD_RELOC_V850_TDA_7_7_OFFSET +- This is a 7 bit offset from the tiny data area pointer. +- +- -- : BFD_RELOC_V850_TDA_16_16_OFFSET +- This is a 16 bit offset from the tiny data area pointer. +- +- -- : BFD_RELOC_V850_TDA_4_5_OFFSET +- This is a 5 bit offset (of which only 4 bits are used) from the +- tiny data area pointer. +- +- -- : BFD_RELOC_V850_TDA_4_4_OFFSET +- This is a 4 bit offset from the tiny data area pointer. +- +- -- : BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET +- This is a 16 bit offset from the short data area pointer, with the +- bits placed non-contiguously in the instruction. +- +- -- : BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET +- This is a 16 bit offset from the zero data area pointer, with the +- bits placed non-contiguously in the instruction. +- +- -- : BFD_RELOC_V850_CALLT_6_7_OFFSET +- This is a 6 bit offset from the call table base pointer. +- +- -- : BFD_RELOC_V850_CALLT_16_16_OFFSET +- This is a 16 bit offset from the call table base pointer. +- +- -- : BFD_RELOC_V850_LONGCALL +- Used for relaxing indirect function calls. +- +- -- : BFD_RELOC_V850_LONGJUMP +- Used for relaxing indirect jumps. +- +- -- : BFD_RELOC_V850_ALIGN +- Used to maintain alignment whilst relaxing. +- +- -- : BFD_RELOC_V850_LO16_SPLIT_OFFSET +- This is a variation of BFD_RELOC_LO16 that can be used in v850e +- ld.bu instructions. +- +- -- : BFD_RELOC_V850_16_PCREL +- This is a 16-bit reloc. +- +- -- : BFD_RELOC_V850_17_PCREL +- This is a 17-bit reloc. +- +- -- : BFD_RELOC_V850_23 +- This is a 23-bit reloc. +- +- -- : BFD_RELOC_V850_32_PCREL +- This is a 32-bit reloc. +- +- -- : BFD_RELOC_V850_32_ABS +- This is a 32-bit reloc. +- +- -- : BFD_RELOC_V850_16_SPLIT_OFFSET +- This is a 16-bit reloc. +- +- -- : BFD_RELOC_V850_16_S1 +- This is a 16-bit reloc. +- +- -- : BFD_RELOC_V850_LO16_S1 +- Low 16 bits. 16 bit shifted by 1. +- +- -- : BFD_RELOC_V850_CALLT_15_16_OFFSET +- This is a 16 bit offset from the call table base pointer. +- +- -- : BFD_RELOC_V850_32_GOTPCREL +- DSO relocations. +- +- -- : BFD_RELOC_V850_16_GOT +- DSO relocations. +- +- -- : BFD_RELOC_V850_32_GOT +- DSO relocations. +- +- -- : BFD_RELOC_V850_22_PLT_PCREL +- DSO relocations. +- +- -- : BFD_RELOC_V850_32_PLT_PCREL +- DSO relocations. +- +- -- : BFD_RELOC_V850_COPY +- DSO relocations. +- +- -- : BFD_RELOC_V850_GLOB_DAT +- DSO relocations. +- +- -- : BFD_RELOC_V850_JMP_SLOT +- DSO relocations. +- +- -- : BFD_RELOC_V850_RELATIVE +- DSO relocations. +- +- -- : BFD_RELOC_V850_16_GOTOFF +- DSO relocations. +- +- -- : BFD_RELOC_V850_32_GOTOFF +- DSO relocations. +- +- -- : BFD_RELOC_V850_CODE +- start code. +- +- -- : BFD_RELOC_V850_DATA +- start data in text. +- +- -- : BFD_RELOC_TIC30_LDP +- This is a 8bit DP reloc for the tms320c30, where the most +- significant 8 bits of a 24 bit word are placed into the least +- significant 8 bits of the opcode. +- +- -- : BFD_RELOC_TIC54X_PARTLS7 +- This is a 7bit reloc for the tms320c54x, where the least +- significant 7 bits of a 16 bit word are placed into the least +- significant 7 bits of the opcode. +- +- -- : BFD_RELOC_TIC54X_PARTMS9 +- This is a 9bit DP reloc for the tms320c54x, where the most +- significant 9 bits of a 16 bit word are placed into the least +- significant 9 bits of the opcode. +- +- -- : BFD_RELOC_TIC54X_23 +- This is an extended address 23-bit reloc for the tms320c54x. +- +- -- : BFD_RELOC_TIC54X_16_OF_23 +- This is a 16-bit reloc for the tms320c54x, where the least +- significant 16 bits of a 23-bit extended address are placed into +- the opcode. +- +- -- : BFD_RELOC_TIC54X_MS7_OF_23 +- This is a reloc for the tms320c54x, where the most significant 7 +- bits of a 23-bit extended address are placed into the opcode. +- +- -- : BFD_RELOC_C6000_PCR_S21 +- -- : BFD_RELOC_C6000_PCR_S12 +- -- : BFD_RELOC_C6000_PCR_S10 +- -- : BFD_RELOC_C6000_PCR_S7 +- -- : BFD_RELOC_C6000_ABS_S16 +- -- : BFD_RELOC_C6000_ABS_L16 +- -- : BFD_RELOC_C6000_ABS_H16 +- -- : BFD_RELOC_C6000_SBR_U15_B +- -- : BFD_RELOC_C6000_SBR_U15_H +- -- : BFD_RELOC_C6000_SBR_U15_W +- -- : BFD_RELOC_C6000_SBR_S16 +- -- : BFD_RELOC_C6000_SBR_L16_B +- -- : BFD_RELOC_C6000_SBR_L16_H +- -- : BFD_RELOC_C6000_SBR_L16_W +- -- : BFD_RELOC_C6000_SBR_H16_B +- -- : BFD_RELOC_C6000_SBR_H16_H +- -- : BFD_RELOC_C6000_SBR_H16_W +- -- : BFD_RELOC_C6000_SBR_GOT_U15_W +- -- : BFD_RELOC_C6000_SBR_GOT_L16_W +- -- : BFD_RELOC_C6000_SBR_GOT_H16_W +- -- : BFD_RELOC_C6000_DSBT_INDEX +- -- : BFD_RELOC_C6000_PREL31 +- -- : BFD_RELOC_C6000_COPY +- -- : BFD_RELOC_C6000_JUMP_SLOT +- -- : BFD_RELOC_C6000_EHTYPE +- -- : BFD_RELOC_C6000_PCR_H16 +- -- : BFD_RELOC_C6000_PCR_L16 +- -- : BFD_RELOC_C6000_ALIGN +- -- : BFD_RELOC_C6000_FPHEAD +- -- : BFD_RELOC_C6000_NOCMP +- TMS320C6000 relocations. +- +- -- : BFD_RELOC_FR30_48 +- This is a 48 bit reloc for the FR30 that stores 32 bits. +- +- -- : BFD_RELOC_FR30_20 +- This is a 32 bit reloc for the FR30 that stores 20 bits split up +- into two sections. +- +- -- : BFD_RELOC_FR30_6_IN_4 +- This is a 16 bit reloc for the FR30 that stores a 6 bit word +- offset in 4 bits. +- +- -- : BFD_RELOC_FR30_8_IN_8 +- This is a 16 bit reloc for the FR30 that stores an 8 bit byte +- offset into 8 bits. +- +- -- : BFD_RELOC_FR30_9_IN_8 +- This is a 16 bit reloc for the FR30 that stores a 9 bit short +- offset into 8 bits. +- +- -- : BFD_RELOC_FR30_10_IN_8 +- This is a 16 bit reloc for the FR30 that stores a 10 bit word +- offset into 8 bits. +- +- -- : BFD_RELOC_FR30_9_PCREL +- This is a 16 bit reloc for the FR30 that stores a 9 bit pc relative +- short offset into 8 bits. +- +- -- : BFD_RELOC_FR30_12_PCREL +- This is a 16 bit reloc for the FR30 that stores a 12 bit pc +- relative short offset into 11 bits. +- +- -- : BFD_RELOC_MCORE_PCREL_IMM8BY4 +- -- : BFD_RELOC_MCORE_PCREL_IMM11BY2 +- -- : BFD_RELOC_MCORE_PCREL_IMM4BY2 +- -- : BFD_RELOC_MCORE_PCREL_32 +- -- : BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2 +- -- : BFD_RELOC_MCORE_RVA +- Motorola Mcore relocations. +- +- -- : BFD_RELOC_MEP_8 +- -- : BFD_RELOC_MEP_16 +- -- : BFD_RELOC_MEP_32 +- -- : BFD_RELOC_MEP_PCREL8A2 +- -- : BFD_RELOC_MEP_PCREL12A2 +- -- : BFD_RELOC_MEP_PCREL17A2 +- -- : BFD_RELOC_MEP_PCREL24A2 +- -- : BFD_RELOC_MEP_PCABS24A2 +- -- : BFD_RELOC_MEP_LOW16 +- -- : BFD_RELOC_MEP_HI16U +- -- : BFD_RELOC_MEP_HI16S +- -- : BFD_RELOC_MEP_GPREL +- -- : BFD_RELOC_MEP_TPREL +- -- : BFD_RELOC_MEP_TPREL7 +- -- : BFD_RELOC_MEP_TPREL7A2 +- -- : BFD_RELOC_MEP_TPREL7A4 +- -- : BFD_RELOC_MEP_UIMM24 +- -- : BFD_RELOC_MEP_ADDR24A4 +- -- : BFD_RELOC_MEP_GNU_VTINHERIT +- -- : BFD_RELOC_MEP_GNU_VTENTRY +- Toshiba Media Processor Relocations. +- +- -- : BFD_RELOC_METAG_HIADDR16 +- -- : BFD_RELOC_METAG_LOADDR16 +- -- : BFD_RELOC_METAG_RELBRANCH +- -- : BFD_RELOC_METAG_GETSETOFF +- -- : BFD_RELOC_METAG_HIOG +- -- : BFD_RELOC_METAG_LOOG +- -- : BFD_RELOC_METAG_REL8 +- -- : BFD_RELOC_METAG_REL16 +- -- : BFD_RELOC_METAG_HI16_GOTOFF +- -- : BFD_RELOC_METAG_LO16_GOTOFF +- -- : BFD_RELOC_METAG_GETSET_GOTOFF +- -- : BFD_RELOC_METAG_GETSET_GOT +- -- : BFD_RELOC_METAG_HI16_GOTPC +- -- : BFD_RELOC_METAG_LO16_GOTPC +- -- : BFD_RELOC_METAG_HI16_PLT +- -- : BFD_RELOC_METAG_LO16_PLT +- -- : BFD_RELOC_METAG_RELBRANCH_PLT +- -- : BFD_RELOC_METAG_GOTOFF +- -- : BFD_RELOC_METAG_PLT +- -- : BFD_RELOC_METAG_COPY +- -- : BFD_RELOC_METAG_JMP_SLOT +- -- : BFD_RELOC_METAG_RELATIVE +- -- : BFD_RELOC_METAG_GLOB_DAT +- -- : BFD_RELOC_METAG_TLS_GD +- -- : BFD_RELOC_METAG_TLS_LDM +- -- : BFD_RELOC_METAG_TLS_LDO_HI16 +- -- : BFD_RELOC_METAG_TLS_LDO_LO16 +- -- : BFD_RELOC_METAG_TLS_LDO +- -- : BFD_RELOC_METAG_TLS_IE +- -- : BFD_RELOC_METAG_TLS_IENONPIC +- -- : BFD_RELOC_METAG_TLS_IENONPIC_HI16 +- -- : BFD_RELOC_METAG_TLS_IENONPIC_LO16 +- -- : BFD_RELOC_METAG_TLS_TPOFF +- -- : BFD_RELOC_METAG_TLS_DTPMOD +- -- : BFD_RELOC_METAG_TLS_DTPOFF +- -- : BFD_RELOC_METAG_TLS_LE +- -- : BFD_RELOC_METAG_TLS_LE_HI16 +- -- : BFD_RELOC_METAG_TLS_LE_LO16 +- Imagination Technologies Meta relocations. +- +- -- : BFD_RELOC_MMIX_GETA +- -- : BFD_RELOC_MMIX_GETA_1 +- -- : BFD_RELOC_MMIX_GETA_2 +- -- : BFD_RELOC_MMIX_GETA_3 +- These are relocations for the GETA instruction. +- +- -- : BFD_RELOC_MMIX_CBRANCH +- -- : BFD_RELOC_MMIX_CBRANCH_J +- -- : BFD_RELOC_MMIX_CBRANCH_1 +- -- : BFD_RELOC_MMIX_CBRANCH_2 +- -- : BFD_RELOC_MMIX_CBRANCH_3 +- These are relocations for a conditional branch instruction. +- +- -- : BFD_RELOC_MMIX_PUSHJ +- -- : BFD_RELOC_MMIX_PUSHJ_1 +- -- : BFD_RELOC_MMIX_PUSHJ_2 +- -- : BFD_RELOC_MMIX_PUSHJ_3 +- -- : BFD_RELOC_MMIX_PUSHJ_STUBBABLE +- These are relocations for the PUSHJ instruction. +- +- -- : BFD_RELOC_MMIX_JMP +- -- : BFD_RELOC_MMIX_JMP_1 +- -- : BFD_RELOC_MMIX_JMP_2 +- -- : BFD_RELOC_MMIX_JMP_3 +- These are relocations for the JMP instruction. +- +- -- : BFD_RELOC_MMIX_ADDR19 +- This is a relocation for a relative address as in a GETA +- instruction or a branch. +- +- -- : BFD_RELOC_MMIX_ADDR27 +- This is a relocation for a relative address as in a JMP +- instruction. +- +- -- : BFD_RELOC_MMIX_REG_OR_BYTE +- This is a relocation for an instruction field that may be a general +- register or a value 0..255. +- +- -- : BFD_RELOC_MMIX_REG +- This is a relocation for an instruction field that may be a general +- register. +- +- -- : BFD_RELOC_MMIX_BASE_PLUS_OFFSET +- This is a relocation for two instruction fields holding a register +- and an offset, the equivalent of the relocation. +- +- -- : BFD_RELOC_MMIX_LOCAL +- This relocation is an assertion that the expression is not +- allocated as a global register. It does not modify contents. +- +- -- : BFD_RELOC_AVR_7_PCREL +- This is a 16 bit reloc for the AVR that stores 8 bit pc relative +- short offset into 7 bits. +- +- -- : BFD_RELOC_AVR_13_PCREL +- This is a 16 bit reloc for the AVR that stores 13 bit pc relative +- short offset into 12 bits. +- +- -- : BFD_RELOC_AVR_16_PM +- This is a 16 bit reloc for the AVR that stores 17 bit value +- (usually program memory address) into 16 bits. +- +- -- : BFD_RELOC_AVR_LO8_LDI +- This is a 16 bit reloc for the AVR that stores 8 bit value (usually +- data memory address) into 8 bit immediate value of LDI insn. +- +- -- : BFD_RELOC_AVR_HI8_LDI +- This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 +- bit of data memory address) into 8 bit immediate value of LDI insn. +- +- -- : BFD_RELOC_AVR_HH8_LDI +- This is a 16 bit reloc for the AVR that stores 8 bit value (most +- high 8 bit of program memory address) into 8 bit immediate value +- of LDI insn. +- +- -- : BFD_RELOC_AVR_MS8_LDI +- This is a 16 bit reloc for the AVR that stores 8 bit value (most +- high 8 bit of 32 bit value) into 8 bit immediate value of LDI insn. +- +- -- : BFD_RELOC_AVR_LO8_LDI_NEG +- This is a 16 bit reloc for the AVR that stores negated 8 bit value +- (usually data memory address) into 8 bit immediate value of SUBI +- insn. +- +- -- : BFD_RELOC_AVR_HI8_LDI_NEG +- This is a 16 bit reloc for the AVR that stores negated 8 bit value +- (high 8 bit of data memory address) into 8 bit immediate value of +- SUBI insn. +- +- -- : BFD_RELOC_AVR_HH8_LDI_NEG +- This is a 16 bit reloc for the AVR that stores negated 8 bit value +- (most high 8 bit of program memory address) into 8 bit immediate +- value of LDI or SUBI insn. +- +- -- : BFD_RELOC_AVR_MS8_LDI_NEG +- This is a 16 bit reloc for the AVR that stores negated 8 bit value +- (msb of 32 bit value) into 8 bit immediate value of LDI insn. +- +- -- : BFD_RELOC_AVR_LO8_LDI_PM +- This is a 16 bit reloc for the AVR that stores 8 bit value (usually +- command address) into 8 bit immediate value of LDI insn. +- +- -- : BFD_RELOC_AVR_LO8_LDI_GS +- This is a 16 bit reloc for the AVR that stores 8 bit value +- (command address) into 8 bit immediate value of LDI insn. If the +- address is beyond the 128k boundary, the linker inserts a jump +- stub for this reloc in the lower 128k. +- +- -- : BFD_RELOC_AVR_HI8_LDI_PM +- This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 +- bit of command address) into 8 bit immediate value of LDI insn. +- +- -- : BFD_RELOC_AVR_HI8_LDI_GS +- This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 +- bit of command address) into 8 bit immediate value of LDI insn. +- If the address is beyond the 128k boundary, the linker inserts a +- jump stub for this reloc below 128k. +- +- -- : BFD_RELOC_AVR_HH8_LDI_PM +- This is a 16 bit reloc for the AVR that stores 8 bit value (most +- high 8 bit of command address) into 8 bit immediate value of LDI +- insn. +- +- -- : BFD_RELOC_AVR_LO8_LDI_PM_NEG +- This is a 16 bit reloc for the AVR that stores negated 8 bit value +- (usually command address) into 8 bit immediate value of SUBI insn. +- +- -- : BFD_RELOC_AVR_HI8_LDI_PM_NEG +- This is a 16 bit reloc for the AVR that stores negated 8 bit value +- (high 8 bit of 16 bit command address) into 8 bit immediate value +- of SUBI insn. +- +- -- : BFD_RELOC_AVR_HH8_LDI_PM_NEG +- This is a 16 bit reloc for the AVR that stores negated 8 bit value +- (high 6 bit of 22 bit command address) into 8 bit immediate value +- of SUBI insn. +- +- -- : BFD_RELOC_AVR_CALL +- This is a 32 bit reloc for the AVR that stores 23 bit value into +- 22 bits. +- +- -- : BFD_RELOC_AVR_LDI +- This is a 16 bit reloc for the AVR that stores all needed bits for +- absolute addressing with ldi with overflow check to linktime +- +- -- : BFD_RELOC_AVR_6 +- This is a 6 bit reloc for the AVR that stores offset for ldd/std +- instructions +- +- -- : BFD_RELOC_AVR_6_ADIW +- This is a 6 bit reloc for the AVR that stores offset for adiw/sbiw +- instructions +- +- -- : BFD_RELOC_AVR_8_LO +- This is a 8 bit reloc for the AVR that stores bits 0..7 of a symbol +- in .byte lo8(symbol) +- +- -- : BFD_RELOC_AVR_8_HI +- This is a 8 bit reloc for the AVR that stores bits 8..15 of a +- symbol in .byte hi8(symbol) +- +- -- : BFD_RELOC_AVR_8_HLO +- This is a 8 bit reloc for the AVR that stores bits 16..23 of a +- symbol in .byte hlo8(symbol) +- +- -- : BFD_RELOC_RL78_NEG8 +- -- : BFD_RELOC_RL78_NEG16 +- -- : BFD_RELOC_RL78_NEG24 +- -- : BFD_RELOC_RL78_NEG32 +- -- : BFD_RELOC_RL78_16_OP +- -- : BFD_RELOC_RL78_24_OP +- -- : BFD_RELOC_RL78_32_OP +- -- : BFD_RELOC_RL78_8U +- -- : BFD_RELOC_RL78_16U +- -- : BFD_RELOC_RL78_24U +- -- : BFD_RELOC_RL78_DIR3U_PCREL +- -- : BFD_RELOC_RL78_DIFF +- -- : BFD_RELOC_RL78_GPRELB +- -- : BFD_RELOC_RL78_GPRELW +- -- : BFD_RELOC_RL78_GPRELL +- -- : BFD_RELOC_RL78_SYM +- -- : BFD_RELOC_RL78_OP_SUBTRACT +- -- : BFD_RELOC_RL78_OP_NEG +- -- : BFD_RELOC_RL78_OP_AND +- -- : BFD_RELOC_RL78_OP_SHRA +- -- : BFD_RELOC_RL78_ABS8 +- -- : BFD_RELOC_RL78_ABS16 +- -- : BFD_RELOC_RL78_ABS16_REV +- -- : BFD_RELOC_RL78_ABS32 +- -- : BFD_RELOC_RL78_ABS32_REV +- -- : BFD_RELOC_RL78_ABS16U +- -- : BFD_RELOC_RL78_ABS16UW +- -- : BFD_RELOC_RL78_ABS16UL +- -- : BFD_RELOC_RL78_RELAX +- -- : BFD_RELOC_RL78_HI16 +- -- : BFD_RELOC_RL78_HI8 +- -- : BFD_RELOC_RL78_LO16 +- -- : BFD_RELOC_RL78_CODE +- Renesas RL78 Relocations. +- +- -- : BFD_RELOC_RX_NEG8 +- -- : BFD_RELOC_RX_NEG16 +- -- : BFD_RELOC_RX_NEG24 +- -- : BFD_RELOC_RX_NEG32 +- -- : BFD_RELOC_RX_16_OP +- -- : BFD_RELOC_RX_24_OP +- -- : BFD_RELOC_RX_32_OP +- -- : BFD_RELOC_RX_8U +- -- : BFD_RELOC_RX_16U +- -- : BFD_RELOC_RX_24U +- -- : BFD_RELOC_RX_DIR3U_PCREL +- -- : BFD_RELOC_RX_DIFF +- -- : BFD_RELOC_RX_GPRELB +- -- : BFD_RELOC_RX_GPRELW +- -- : BFD_RELOC_RX_GPRELL +- -- : BFD_RELOC_RX_SYM +- -- : BFD_RELOC_RX_OP_SUBTRACT +- -- : BFD_RELOC_RX_OP_NEG +- -- : BFD_RELOC_RX_ABS8 +- -- : BFD_RELOC_RX_ABS16 +- -- : BFD_RELOC_RX_ABS16_REV +- -- : BFD_RELOC_RX_ABS32 +- -- : BFD_RELOC_RX_ABS32_REV +- -- : BFD_RELOC_RX_ABS16U +- -- : BFD_RELOC_RX_ABS16UW +- -- : BFD_RELOC_RX_ABS16UL +- -- : BFD_RELOC_RX_RELAX +- Renesas RX Relocations. +- +- -- : BFD_RELOC_390_12 +- Direct 12 bit. +- +- -- : BFD_RELOC_390_GOT12 +- 12 bit GOT offset. +- +- -- : BFD_RELOC_390_PLT32 +- 32 bit PC relative PLT address. +- +- -- : BFD_RELOC_390_COPY +- Copy symbol at runtime. +- +- -- : BFD_RELOC_390_GLOB_DAT +- Create GOT entry. +- +- -- : BFD_RELOC_390_JMP_SLOT +- Create PLT entry. +- +- -- : BFD_RELOC_390_RELATIVE +- Adjust by program base. +- +- -- : BFD_RELOC_390_GOTPC +- 32 bit PC relative offset to GOT. +- +- -- : BFD_RELOC_390_GOT16 +- 16 bit GOT offset. +- +- -- : BFD_RELOC_390_PC12DBL +- PC relative 12 bit shifted by 1. +- +- -- : BFD_RELOC_390_PLT12DBL +- 12 bit PC rel. PLT shifted by 1. +- +- -- : BFD_RELOC_390_PC16DBL +- PC relative 16 bit shifted by 1. +- +- -- : BFD_RELOC_390_PLT16DBL +- 16 bit PC rel. PLT shifted by 1. +- +- -- : BFD_RELOC_390_PC24DBL +- PC relative 24 bit shifted by 1. +- +- -- : BFD_RELOC_390_PLT24DBL +- 24 bit PC rel. PLT shifted by 1. +- +- -- : BFD_RELOC_390_PC32DBL +- PC relative 32 bit shifted by 1. +- +- -- : BFD_RELOC_390_PLT32DBL +- 32 bit PC rel. PLT shifted by 1. +- +- -- : BFD_RELOC_390_GOTPCDBL +- 32 bit PC rel. GOT shifted by 1. +- +- -- : BFD_RELOC_390_GOT64 +- 64 bit GOT offset. +- +- -- : BFD_RELOC_390_PLT64 +- 64 bit PC relative PLT address. +- +- -- : BFD_RELOC_390_GOTENT +- 32 bit rel. offset to GOT entry. +- +- -- : BFD_RELOC_390_GOTOFF64 +- 64 bit offset to GOT. +- +- -- : BFD_RELOC_390_GOTPLT12 +- 12-bit offset to symbol-entry within GOT, with PLT handling. +- +- -- : BFD_RELOC_390_GOTPLT16 +- 16-bit offset to symbol-entry within GOT, with PLT handling. +- +- -- : BFD_RELOC_390_GOTPLT32 +- 32-bit offset to symbol-entry within GOT, with PLT handling. +- +- -- : BFD_RELOC_390_GOTPLT64 +- 64-bit offset to symbol-entry within GOT, with PLT handling. +- +- -- : BFD_RELOC_390_GOTPLTENT +- 32-bit rel. offset to symbol-entry within GOT, with PLT handling. +- +- -- : BFD_RELOC_390_PLTOFF16 +- 16-bit rel. offset from the GOT to a PLT entry. +- +- -- : BFD_RELOC_390_PLTOFF32 +- 32-bit rel. offset from the GOT to a PLT entry. +- +- -- : BFD_RELOC_390_PLTOFF64 +- 64-bit rel. offset from the GOT to a PLT entry. +- +- -- : BFD_RELOC_390_TLS_LOAD +- -- : BFD_RELOC_390_TLS_GDCALL +- -- : BFD_RELOC_390_TLS_LDCALL +- -- : BFD_RELOC_390_TLS_GD32 +- -- : BFD_RELOC_390_TLS_GD64 +- -- : BFD_RELOC_390_TLS_GOTIE12 +- -- : BFD_RELOC_390_TLS_GOTIE32 +- -- : BFD_RELOC_390_TLS_GOTIE64 +- -- : BFD_RELOC_390_TLS_LDM32 +- -- : BFD_RELOC_390_TLS_LDM64 +- -- : BFD_RELOC_390_TLS_IE32 +- -- : BFD_RELOC_390_TLS_IE64 +- -- : BFD_RELOC_390_TLS_IEENT +- -- : BFD_RELOC_390_TLS_LE32 +- -- : BFD_RELOC_390_TLS_LE64 +- -- : BFD_RELOC_390_TLS_LDO32 +- -- : BFD_RELOC_390_TLS_LDO64 +- -- : BFD_RELOC_390_TLS_DTPMOD +- -- : BFD_RELOC_390_TLS_DTPOFF +- -- : BFD_RELOC_390_TLS_TPOFF +- s390 tls relocations. +- +- -- : BFD_RELOC_390_20 +- -- : BFD_RELOC_390_GOT20 +- -- : BFD_RELOC_390_GOTPLT20 +- -- : BFD_RELOC_390_TLS_GOTIE20 +- Long displacement extension. +- +- -- : BFD_RELOC_390_IRELATIVE +- STT_GNU_IFUNC relocation. +- +- -- : BFD_RELOC_SCORE_GPREL15 +- Score relocations Low 16 bit for load/store +- +- -- : BFD_RELOC_SCORE_DUMMY2 +- -- : BFD_RELOC_SCORE_JMP +- This is a 24-bit reloc with the right 1 bit assumed to be 0 +- +- -- : BFD_RELOC_SCORE_BRANCH +- This is a 19-bit reloc with the right 1 bit assumed to be 0 +- +- -- : BFD_RELOC_SCORE_IMM30 +- This is a 32-bit reloc for 48-bit instructions. +- +- -- : BFD_RELOC_SCORE_IMM32 +- This is a 32-bit reloc for 48-bit instructions. +- +- -- : BFD_RELOC_SCORE16_JMP +- This is a 11-bit reloc with the right 1 bit assumed to be 0 +- +- -- : BFD_RELOC_SCORE16_BRANCH +- This is a 8-bit reloc with the right 1 bit assumed to be 0 +- +- -- : BFD_RELOC_SCORE_BCMP +- This is a 9-bit reloc with the right 1 bit assumed to be 0 +- +- -- : BFD_RELOC_SCORE_GOT15 +- -- : BFD_RELOC_SCORE_GOT_LO16 +- -- : BFD_RELOC_SCORE_CALL15 +- -- : BFD_RELOC_SCORE_DUMMY_HI16 +- Undocumented Score relocs +- +- -- : BFD_RELOC_IP2K_FR9 +- Scenix IP2K - 9-bit register number / data address +- +- -- : BFD_RELOC_IP2K_BANK +- Scenix IP2K - 4-bit register/data bank number +- +- -- : BFD_RELOC_IP2K_ADDR16CJP +- Scenix IP2K - low 13 bits of instruction word address +- +- -- : BFD_RELOC_IP2K_PAGE3 +- Scenix IP2K - high 3 bits of instruction word address +- +- -- : BFD_RELOC_IP2K_LO8DATA +- -- : BFD_RELOC_IP2K_HI8DATA +- -- : BFD_RELOC_IP2K_EX8DATA +- Scenix IP2K - ext/low/high 8 bits of data address +- +- -- : BFD_RELOC_IP2K_LO8INSN +- -- : BFD_RELOC_IP2K_HI8INSN +- Scenix IP2K - low/high 8 bits of instruction word address +- +- -- : BFD_RELOC_IP2K_PC_SKIP +- Scenix IP2K - even/odd PC modifier to modify snb pcl.0 +- +- -- : BFD_RELOC_IP2K_TEXT +- Scenix IP2K - 16 bit word address in text section. +- +- -- : BFD_RELOC_IP2K_FR_OFFSET +- Scenix IP2K - 7-bit sp or dp offset +- +- -- : BFD_RELOC_VPE4KMATH_DATA +- -- : BFD_RELOC_VPE4KMATH_INSN +- Scenix VPE4K coprocessor - data/insn-space addressing +- +- -- : BFD_RELOC_VTABLE_INHERIT +- -- : BFD_RELOC_VTABLE_ENTRY +- These two relocations are used by the linker to determine which of +- the entries in a C++ virtual function table are actually used. +- When the -gc-sections option is given, the linker will zero out +- the entries that are not used, so that the code for those +- functions need not be included in the output. +- +- VTABLE_INHERIT is a zero-space relocation used to describe to the +- linker the inheritance tree of a C++ virtual function table. The +- relocation's symbol should be the parent class' vtable, and the +- relocation should be located at the child vtable. +- +- VTABLE_ENTRY is a zero-space relocation that describes the use of a +- virtual function table entry. The reloc's symbol should refer to +- the table of the class mentioned in the code. Off of that base, +- an offset describes the entry that is being used. For Rela hosts, +- this offset is stored in the reloc's addend. For Rel hosts, we +- are forced to put this offset in the reloc's section offset. +- +- -- : BFD_RELOC_IA64_IMM14 +- -- : BFD_RELOC_IA64_IMM22 +- -- : BFD_RELOC_IA64_IMM64 +- -- : BFD_RELOC_IA64_DIR32MSB +- -- : BFD_RELOC_IA64_DIR32LSB +- -- : BFD_RELOC_IA64_DIR64MSB +- -- : BFD_RELOC_IA64_DIR64LSB +- -- : BFD_RELOC_IA64_GPREL22 +- -- : BFD_RELOC_IA64_GPREL64I +- -- : BFD_RELOC_IA64_GPREL32MSB +- -- : BFD_RELOC_IA64_GPREL32LSB +- -- : BFD_RELOC_IA64_GPREL64MSB +- -- : BFD_RELOC_IA64_GPREL64LSB +- -- : BFD_RELOC_IA64_LTOFF22 +- -- : BFD_RELOC_IA64_LTOFF64I +- -- : BFD_RELOC_IA64_PLTOFF22 +- -- : BFD_RELOC_IA64_PLTOFF64I +- -- : BFD_RELOC_IA64_PLTOFF64MSB +- -- : BFD_RELOC_IA64_PLTOFF64LSB +- -- : BFD_RELOC_IA64_FPTR64I +- -- : BFD_RELOC_IA64_FPTR32MSB +- -- : BFD_RELOC_IA64_FPTR32LSB +- -- : BFD_RELOC_IA64_FPTR64MSB +- -- : BFD_RELOC_IA64_FPTR64LSB +- -- : BFD_RELOC_IA64_PCREL21B +- -- : BFD_RELOC_IA64_PCREL21BI +- -- : BFD_RELOC_IA64_PCREL21M +- -- : BFD_RELOC_IA64_PCREL21F +- -- : BFD_RELOC_IA64_PCREL22 +- -- : BFD_RELOC_IA64_PCREL60B +- -- : BFD_RELOC_IA64_PCREL64I +- -- : BFD_RELOC_IA64_PCREL32MSB +- -- : BFD_RELOC_IA64_PCREL32LSB +- -- : BFD_RELOC_IA64_PCREL64MSB +- -- : BFD_RELOC_IA64_PCREL64LSB +- -- : BFD_RELOC_IA64_LTOFF_FPTR22 +- -- : BFD_RELOC_IA64_LTOFF_FPTR64I +- -- : BFD_RELOC_IA64_LTOFF_FPTR32MSB +- -- : BFD_RELOC_IA64_LTOFF_FPTR32LSB +- -- : BFD_RELOC_IA64_LTOFF_FPTR64MSB +- -- : BFD_RELOC_IA64_LTOFF_FPTR64LSB +- -- : BFD_RELOC_IA64_SEGREL32MSB +- -- : BFD_RELOC_IA64_SEGREL32LSB +- -- : BFD_RELOC_IA64_SEGREL64MSB +- -- : BFD_RELOC_IA64_SEGREL64LSB +- -- : BFD_RELOC_IA64_SECREL32MSB +- -- : BFD_RELOC_IA64_SECREL32LSB +- -- : BFD_RELOC_IA64_SECREL64MSB +- -- : BFD_RELOC_IA64_SECREL64LSB +- -- : BFD_RELOC_IA64_REL32MSB +- -- : BFD_RELOC_IA64_REL32LSB +- -- : BFD_RELOC_IA64_REL64MSB +- -- : BFD_RELOC_IA64_REL64LSB +- -- : BFD_RELOC_IA64_LTV32MSB +- -- : BFD_RELOC_IA64_LTV32LSB +- -- : BFD_RELOC_IA64_LTV64MSB +- -- : BFD_RELOC_IA64_LTV64LSB +- -- : BFD_RELOC_IA64_IPLTMSB +- -- : BFD_RELOC_IA64_IPLTLSB +- -- : BFD_RELOC_IA64_COPY +- -- : BFD_RELOC_IA64_LTOFF22X +- -- : BFD_RELOC_IA64_LDXMOV +- -- : BFD_RELOC_IA64_TPREL14 +- -- : BFD_RELOC_IA64_TPREL22 +- -- : BFD_RELOC_IA64_TPREL64I +- -- : BFD_RELOC_IA64_TPREL64MSB +- -- : BFD_RELOC_IA64_TPREL64LSB +- -- : BFD_RELOC_IA64_LTOFF_TPREL22 +- -- : BFD_RELOC_IA64_DTPMOD64MSB +- -- : BFD_RELOC_IA64_DTPMOD64LSB +- -- : BFD_RELOC_IA64_LTOFF_DTPMOD22 +- -- : BFD_RELOC_IA64_DTPREL14 +- -- : BFD_RELOC_IA64_DTPREL22 +- -- : BFD_RELOC_IA64_DTPREL64I +- -- : BFD_RELOC_IA64_DTPREL32MSB +- -- : BFD_RELOC_IA64_DTPREL32LSB +- -- : BFD_RELOC_IA64_DTPREL64MSB +- -- : BFD_RELOC_IA64_DTPREL64LSB +- -- : BFD_RELOC_IA64_LTOFF_DTPREL22 +- Intel IA64 Relocations. +- +- -- : BFD_RELOC_M68HC11_HI8 +- Motorola 68HC11 reloc. This is the 8 bit high part of an absolute +- address. +- +- -- : BFD_RELOC_M68HC11_LO8 +- Motorola 68HC11 reloc. This is the 8 bit low part of an absolute +- address. +- +- -- : BFD_RELOC_M68HC11_3B +- Motorola 68HC11 reloc. This is the 3 bit of a value. +- +- -- : BFD_RELOC_M68HC11_RL_JUMP +- Motorola 68HC11 reloc. This reloc marks the beginning of a +- jump/call instruction. It is used for linker relaxation to +- correctly identify beginning of instruction and change some +- branches to use PC-relative addressing mode. +- +- -- : BFD_RELOC_M68HC11_RL_GROUP +- Motorola 68HC11 reloc. This reloc marks a group of several +- instructions that gcc generates and for which the linker +- relaxation pass can modify and/or remove some of them. +- +- -- : BFD_RELOC_M68HC11_LO16 +- Motorola 68HC11 reloc. This is the 16-bit lower part of an +- address. It is used for 'call' instruction to specify the symbol +- address without any special transformation (due to memory bank +- window). +- +- -- : BFD_RELOC_M68HC11_PAGE +- Motorola 68HC11 reloc. This is a 8-bit reloc that specifies the +- page number of an address. It is used by 'call' instruction to +- specify the page number of the symbol. +- +- -- : BFD_RELOC_M68HC11_24 +- Motorola 68HC11 reloc. This is a 24-bit reloc that represents the +- address with a 16-bit value and a 8-bit page number. The symbol +- address is transformed to follow the 16K memory bank of 68HC12 +- (seen as mapped in the window). +- +- -- : BFD_RELOC_M68HC12_5B +- Motorola 68HC12 reloc. This is the 5 bits of a value. +- +- -- : BFD_RELOC_XGATE_RL_JUMP +- Freescale XGATE reloc. This reloc marks the beginning of a +- bra/jal instruction. +- +- -- : BFD_RELOC_XGATE_RL_GROUP +- Freescale XGATE reloc. This reloc marks a group of several +- instructions that gcc generates and for which the linker +- relaxation pass can modify and/or remove some of them. +- +- -- : BFD_RELOC_XGATE_LO16 +- Freescale XGATE reloc. This is the 16-bit lower part of an +- address. It is used for the '16-bit' instructions. +- +- -- : BFD_RELOC_XGATE_GPAGE +- Freescale XGATE reloc. +- +- -- : BFD_RELOC_XGATE_24 +- Freescale XGATE reloc. +- +- -- : BFD_RELOC_XGATE_PCREL_9 +- Freescale XGATE reloc. This is a 9-bit pc-relative reloc. +- +- -- : BFD_RELOC_XGATE_PCREL_10 +- Freescale XGATE reloc. This is a 10-bit pc-relative reloc. +- +- -- : BFD_RELOC_XGATE_IMM8_LO +- Freescale XGATE reloc. This is the 16-bit lower part of an +- address. It is used for the '16-bit' instructions. +- +- -- : BFD_RELOC_XGATE_IMM8_HI +- Freescale XGATE reloc. This is the 16-bit higher part of an +- address. It is used for the '16-bit' instructions. +- +- -- : BFD_RELOC_XGATE_IMM3 +- Freescale XGATE reloc. This is a 3-bit pc-relative reloc. +- +- -- : BFD_RELOC_XGATE_IMM4 +- Freescale XGATE reloc. This is a 4-bit pc-relative reloc. +- +- -- : BFD_RELOC_XGATE_IMM5 +- Freescale XGATE reloc. This is a 5-bit pc-relative reloc. +- +- -- : BFD_RELOC_M68HC12_9B +- Motorola 68HC12 reloc. This is the 9 bits of a value. +- +- -- : BFD_RELOC_M68HC12_16B +- Motorola 68HC12 reloc. This is the 16 bits of a value. +- +- -- : BFD_RELOC_M68HC12_9_PCREL +- Motorola 68HC12/XGATE reloc. This is a PCREL9 branch. +- +- -- : BFD_RELOC_M68HC12_10_PCREL +- Motorola 68HC12/XGATE reloc. This is a PCREL10 branch. +- +- -- : BFD_RELOC_M68HC12_LO8XG +- Motorola 68HC12/XGATE reloc. This is the 8 bit low part of an +- absolute address and immediately precedes a matching HI8XG part. +- +- -- : BFD_RELOC_M68HC12_HI8XG +- Motorola 68HC12/XGATE reloc. This is the 8 bit high part of an +- absolute address and immediately follows a matching LO8XG part. +- +- -- : BFD_RELOC_16C_NUM08 +- -- : BFD_RELOC_16C_NUM08_C +- -- : BFD_RELOC_16C_NUM16 +- -- : BFD_RELOC_16C_NUM16_C +- -- : BFD_RELOC_16C_NUM32 +- -- : BFD_RELOC_16C_NUM32_C +- -- : BFD_RELOC_16C_DISP04 +- -- : BFD_RELOC_16C_DISP04_C +- -- : BFD_RELOC_16C_DISP08 +- -- : BFD_RELOC_16C_DISP08_C +- -- : BFD_RELOC_16C_DISP16 +- -- : BFD_RELOC_16C_DISP16_C +- -- : BFD_RELOC_16C_DISP24 +- -- : BFD_RELOC_16C_DISP24_C +- -- : BFD_RELOC_16C_DISP24a +- -- : BFD_RELOC_16C_DISP24a_C +- -- : BFD_RELOC_16C_REG04 +- -- : BFD_RELOC_16C_REG04_C +- -- : BFD_RELOC_16C_REG04a +- -- : BFD_RELOC_16C_REG04a_C +- -- : BFD_RELOC_16C_REG14 +- -- : BFD_RELOC_16C_REG14_C +- -- : BFD_RELOC_16C_REG16 +- -- : BFD_RELOC_16C_REG16_C +- -- : BFD_RELOC_16C_REG20 +- -- : BFD_RELOC_16C_REG20_C +- -- : BFD_RELOC_16C_ABS20 +- -- : BFD_RELOC_16C_ABS20_C +- -- : BFD_RELOC_16C_ABS24 +- -- : BFD_RELOC_16C_ABS24_C +- -- : BFD_RELOC_16C_IMM04 +- -- : BFD_RELOC_16C_IMM04_C +- -- : BFD_RELOC_16C_IMM16 +- -- : BFD_RELOC_16C_IMM16_C +- -- : BFD_RELOC_16C_IMM20 +- -- : BFD_RELOC_16C_IMM20_C +- -- : BFD_RELOC_16C_IMM24 +- -- : BFD_RELOC_16C_IMM24_C +- -- : BFD_RELOC_16C_IMM32 +- -- : BFD_RELOC_16C_IMM32_C +- NS CR16C Relocations. +- +- -- : BFD_RELOC_CR16_NUM8 +- -- : BFD_RELOC_CR16_NUM16 +- -- : BFD_RELOC_CR16_NUM32 +- -- : BFD_RELOC_CR16_NUM32a +- -- : BFD_RELOC_CR16_REGREL0 +- -- : BFD_RELOC_CR16_REGREL4 +- -- : BFD_RELOC_CR16_REGREL4a +- -- : BFD_RELOC_CR16_REGREL14 +- -- : BFD_RELOC_CR16_REGREL14a +- -- : BFD_RELOC_CR16_REGREL16 +- -- : BFD_RELOC_CR16_REGREL20 +- -- : BFD_RELOC_CR16_REGREL20a +- -- : BFD_RELOC_CR16_ABS20 +- -- : BFD_RELOC_CR16_ABS24 +- -- : BFD_RELOC_CR16_IMM4 +- -- : BFD_RELOC_CR16_IMM8 +- -- : BFD_RELOC_CR16_IMM16 +- -- : BFD_RELOC_CR16_IMM20 +- -- : BFD_RELOC_CR16_IMM24 +- -- : BFD_RELOC_CR16_IMM32 +- -- : BFD_RELOC_CR16_IMM32a +- -- : BFD_RELOC_CR16_DISP4 +- -- : BFD_RELOC_CR16_DISP8 +- -- : BFD_RELOC_CR16_DISP16 +- -- : BFD_RELOC_CR16_DISP20 +- -- : BFD_RELOC_CR16_DISP24 +- -- : BFD_RELOC_CR16_DISP24a +- -- : BFD_RELOC_CR16_SWITCH8 +- -- : BFD_RELOC_CR16_SWITCH16 +- -- : BFD_RELOC_CR16_SWITCH32 +- -- : BFD_RELOC_CR16_GOT_REGREL20 +- -- : BFD_RELOC_CR16_GOTC_REGREL20 +- -- : BFD_RELOC_CR16_GLOB_DAT +- NS CR16 Relocations. +- +- -- : BFD_RELOC_CRX_REL4 +- -- : BFD_RELOC_CRX_REL8 +- -- : BFD_RELOC_CRX_REL8_CMP +- -- : BFD_RELOC_CRX_REL16 +- -- : BFD_RELOC_CRX_REL24 +- -- : BFD_RELOC_CRX_REL32 +- -- : BFD_RELOC_CRX_REGREL12 +- -- : BFD_RELOC_CRX_REGREL22 +- -- : BFD_RELOC_CRX_REGREL28 +- -- : BFD_RELOC_CRX_REGREL32 +- -- : BFD_RELOC_CRX_ABS16 +- -- : BFD_RELOC_CRX_ABS32 +- -- : BFD_RELOC_CRX_NUM8 +- -- : BFD_RELOC_CRX_NUM16 +- -- : BFD_RELOC_CRX_NUM32 +- -- : BFD_RELOC_CRX_IMM16 +- -- : BFD_RELOC_CRX_IMM32 +- -- : BFD_RELOC_CRX_SWITCH8 +- -- : BFD_RELOC_CRX_SWITCH16 +- -- : BFD_RELOC_CRX_SWITCH32 +- NS CRX Relocations. +- +- -- : BFD_RELOC_CRIS_BDISP8 +- -- : BFD_RELOC_CRIS_UNSIGNED_5 +- -- : BFD_RELOC_CRIS_SIGNED_6 +- -- : BFD_RELOC_CRIS_UNSIGNED_6 +- -- : BFD_RELOC_CRIS_SIGNED_8 +- -- : BFD_RELOC_CRIS_UNSIGNED_8 +- -- : BFD_RELOC_CRIS_SIGNED_16 +- -- : BFD_RELOC_CRIS_UNSIGNED_16 +- -- : BFD_RELOC_CRIS_LAPCQ_OFFSET +- -- : BFD_RELOC_CRIS_UNSIGNED_4 +- These relocs are only used within the CRIS assembler. They are not +- (at present) written to any object files. +- +- -- : BFD_RELOC_CRIS_COPY +- -- : BFD_RELOC_CRIS_GLOB_DAT +- -- : BFD_RELOC_CRIS_JUMP_SLOT +- -- : BFD_RELOC_CRIS_RELATIVE +- Relocs used in ELF shared libraries for CRIS. +- +- -- : BFD_RELOC_CRIS_32_GOT +- 32-bit offset to symbol-entry within GOT. +- +- -- : BFD_RELOC_CRIS_16_GOT +- 16-bit offset to symbol-entry within GOT. +- +- -- : BFD_RELOC_CRIS_32_GOTPLT +- 32-bit offset to symbol-entry within GOT, with PLT handling. +- +- -- : BFD_RELOC_CRIS_16_GOTPLT +- 16-bit offset to symbol-entry within GOT, with PLT handling. +- +- -- : BFD_RELOC_CRIS_32_GOTREL +- 32-bit offset to symbol, relative to GOT. +- +- -- : BFD_RELOC_CRIS_32_PLT_GOTREL +- 32-bit offset to symbol with PLT entry, relative to GOT. +- +- -- : BFD_RELOC_CRIS_32_PLT_PCREL +- 32-bit offset to symbol with PLT entry, relative to this +- relocation. +- +- -- : BFD_RELOC_CRIS_32_GOT_GD +- -- : BFD_RELOC_CRIS_16_GOT_GD +- -- : BFD_RELOC_CRIS_32_GD +- -- : BFD_RELOC_CRIS_DTP +- -- : BFD_RELOC_CRIS_32_DTPREL +- -- : BFD_RELOC_CRIS_16_DTPREL +- -- : BFD_RELOC_CRIS_32_GOT_TPREL +- -- : BFD_RELOC_CRIS_16_GOT_TPREL +- -- : BFD_RELOC_CRIS_32_TPREL +- -- : BFD_RELOC_CRIS_16_TPREL +- -- : BFD_RELOC_CRIS_DTPMOD +- -- : BFD_RELOC_CRIS_32_IE +- Relocs used in TLS code for CRIS. +- +- -- : BFD_RELOC_860_COPY +- -- : BFD_RELOC_860_GLOB_DAT +- -- : BFD_RELOC_860_JUMP_SLOT +- -- : BFD_RELOC_860_RELATIVE +- -- : BFD_RELOC_860_PC26 +- -- : BFD_RELOC_860_PLT26 +- -- : BFD_RELOC_860_PC16 +- -- : BFD_RELOC_860_LOW0 +- -- : BFD_RELOC_860_SPLIT0 +- -- : BFD_RELOC_860_LOW1 +- -- : BFD_RELOC_860_SPLIT1 +- -- : BFD_RELOC_860_LOW2 +- -- : BFD_RELOC_860_SPLIT2 +- -- : BFD_RELOC_860_LOW3 +- -- : BFD_RELOC_860_LOGOT0 +- -- : BFD_RELOC_860_SPGOT0 +- -- : BFD_RELOC_860_LOGOT1 +- -- : BFD_RELOC_860_SPGOT1 +- -- : BFD_RELOC_860_LOGOTOFF0 +- -- : BFD_RELOC_860_SPGOTOFF0 +- -- : BFD_RELOC_860_LOGOTOFF1 +- -- : BFD_RELOC_860_SPGOTOFF1 +- -- : BFD_RELOC_860_LOGOTOFF2 +- -- : BFD_RELOC_860_LOGOTOFF3 +- -- : BFD_RELOC_860_LOPC +- -- : BFD_RELOC_860_HIGHADJ +- -- : BFD_RELOC_860_HAGOT +- -- : BFD_RELOC_860_HAGOTOFF +- -- : BFD_RELOC_860_HAPC +- -- : BFD_RELOC_860_HIGH +- -- : BFD_RELOC_860_HIGOT +- -- : BFD_RELOC_860_HIGOTOFF +- Intel i860 Relocations. +- +- -- : BFD_RELOC_OPENRISC_ABS_26 +- -- : BFD_RELOC_OPENRISC_REL_26 +- OpenRISC Relocations. +- +- -- : BFD_RELOC_H8_DIR16A8 +- -- : BFD_RELOC_H8_DIR16R8 +- -- : BFD_RELOC_H8_DIR24A8 +- -- : BFD_RELOC_H8_DIR24R8 +- -- : BFD_RELOC_H8_DIR32A16 +- -- : BFD_RELOC_H8_DISP32A16 +- H8 elf Relocations. +- +- -- : BFD_RELOC_XSTORMY16_REL_12 +- -- : BFD_RELOC_XSTORMY16_12 +- -- : BFD_RELOC_XSTORMY16_24 +- -- : BFD_RELOC_XSTORMY16_FPTR16 +- Sony Xstormy16 Relocations. +- +- -- : BFD_RELOC_RELC +- Self-describing complex relocations. +- +- -- : BFD_RELOC_XC16X_PAG +- -- : BFD_RELOC_XC16X_POF +- -- : BFD_RELOC_XC16X_SEG +- -- : BFD_RELOC_XC16X_SOF +- Infineon Relocations. +- +- -- : BFD_RELOC_VAX_GLOB_DAT +- -- : BFD_RELOC_VAX_JMP_SLOT +- -- : BFD_RELOC_VAX_RELATIVE +- Relocations used by VAX ELF. +- +- -- : BFD_RELOC_MT_PC16 +- Morpho MT - 16 bit immediate relocation. +- +- -- : BFD_RELOC_MT_HI16 +- Morpho MT - Hi 16 bits of an address. +- +- -- : BFD_RELOC_MT_LO16 +- Morpho MT - Low 16 bits of an address. +- +- -- : BFD_RELOC_MT_GNU_VTINHERIT +- Morpho MT - Used to tell the linker which vtable entries are used. +- +- -- : BFD_RELOC_MT_GNU_VTENTRY +- Morpho MT - Used to tell the linker which vtable entries are used. +- +- -- : BFD_RELOC_MT_PCINSN8 +- Morpho MT - 8 bit immediate relocation. +- +- -- : BFD_RELOC_MSP430_10_PCREL +- -- : BFD_RELOC_MSP430_16_PCREL +- -- : BFD_RELOC_MSP430_16 +- -- : BFD_RELOC_MSP430_16_PCREL_BYTE +- -- : BFD_RELOC_MSP430_16_BYTE +- -- : BFD_RELOC_MSP430_2X_PCREL +- -- : BFD_RELOC_MSP430_RL_PCREL +- -- : BFD_RELOC_MSP430_ABS8 +- -- : BFD_RELOC_MSP430X_PCR20_EXT_SRC +- -- : BFD_RELOC_MSP430X_PCR20_EXT_DST +- -- : BFD_RELOC_MSP430X_PCR20_EXT_ODST +- -- : BFD_RELOC_MSP430X_ABS20_EXT_SRC +- -- : BFD_RELOC_MSP430X_ABS20_EXT_DST +- -- : BFD_RELOC_MSP430X_ABS20_EXT_ODST +- -- : BFD_RELOC_MSP430X_ABS20_ADR_SRC +- -- : BFD_RELOC_MSP430X_ABS20_ADR_DST +- -- : BFD_RELOC_MSP430X_PCR16 +- -- : BFD_RELOC_MSP430X_PCR20_CALL +- -- : BFD_RELOC_MSP430X_ABS16 +- -- : BFD_RELOC_MSP430_ABS_HI16 +- -- : BFD_RELOC_MSP430_PREL31 +- -- : BFD_RELOC_MSP430_SYM_DIFF +- msp430 specific relocation codes +- +- -- : BFD_RELOC_NIOS2_S16 +- -- : BFD_RELOC_NIOS2_U16 +- -- : BFD_RELOC_NIOS2_CALL26 +- -- : BFD_RELOC_NIOS2_IMM5 +- -- : BFD_RELOC_NIOS2_CACHE_OPX +- -- : BFD_RELOC_NIOS2_IMM6 +- -- : BFD_RELOC_NIOS2_IMM8 +- -- : BFD_RELOC_NIOS2_HI16 +- -- : BFD_RELOC_NIOS2_LO16 +- -- : BFD_RELOC_NIOS2_HIADJ16 +- -- : BFD_RELOC_NIOS2_GPREL +- -- : BFD_RELOC_NIOS2_UJMP +- -- : BFD_RELOC_NIOS2_CJMP +- -- : BFD_RELOC_NIOS2_CALLR +- -- : BFD_RELOC_NIOS2_ALIGN +- -- : BFD_RELOC_NIOS2_GOT16 +- -- : BFD_RELOC_NIOS2_CALL16 +- -- : BFD_RELOC_NIOS2_GOTOFF_LO +- -- : BFD_RELOC_NIOS2_GOTOFF_HA +- -- : BFD_RELOC_NIOS2_PCREL_LO +- -- : BFD_RELOC_NIOS2_PCREL_HA +- -- : BFD_RELOC_NIOS2_TLS_GD16 +- -- : BFD_RELOC_NIOS2_TLS_LDM16 +- -- : BFD_RELOC_NIOS2_TLS_LDO16 +- -- : BFD_RELOC_NIOS2_TLS_IE16 +- -- : BFD_RELOC_NIOS2_TLS_LE16 +- -- : BFD_RELOC_NIOS2_TLS_DTPMOD +- -- : BFD_RELOC_NIOS2_TLS_DTPREL +- -- : BFD_RELOC_NIOS2_TLS_TPREL +- -- : BFD_RELOC_NIOS2_COPY +- -- : BFD_RELOC_NIOS2_GLOB_DAT +- -- : BFD_RELOC_NIOS2_JUMP_SLOT +- -- : BFD_RELOC_NIOS2_RELATIVE +- -- : BFD_RELOC_NIOS2_GOTOFF +- Relocations used by the Altera Nios II core. +- +- -- : BFD_RELOC_IQ2000_OFFSET_16 +- -- : BFD_RELOC_IQ2000_OFFSET_21 +- -- : BFD_RELOC_IQ2000_UHI16 +- IQ2000 Relocations. +- +- -- : BFD_RELOC_XTENSA_RTLD +- Special Xtensa relocation used only by PLT entries in ELF shared +- objects to indicate that the runtime linker should set the value +- to one of its own internal functions or data structures. +- +- -- : BFD_RELOC_XTENSA_GLOB_DAT +- -- : BFD_RELOC_XTENSA_JMP_SLOT +- -- : BFD_RELOC_XTENSA_RELATIVE +- Xtensa relocations for ELF shared objects. +- +- -- : BFD_RELOC_XTENSA_PLT +- Xtensa relocation used in ELF object files for symbols that may +- require PLT entries. Otherwise, this is just a generic 32-bit +- relocation. +- +- -- : BFD_RELOC_XTENSA_DIFF8 +- -- : BFD_RELOC_XTENSA_DIFF16 +- -- : BFD_RELOC_XTENSA_DIFF32 +- Xtensa relocations to mark the difference of two local symbols. +- These are only needed to support linker relaxation and can be +- ignored when not relaxing. The field is set to the value of the +- difference assuming no relaxation. The relocation encodes the +- position of the first symbol so the linker can determine whether +- to adjust the field value. +- +- -- : BFD_RELOC_XTENSA_SLOT0_OP +- -- : BFD_RELOC_XTENSA_SLOT1_OP +- -- : BFD_RELOC_XTENSA_SLOT2_OP +- -- : BFD_RELOC_XTENSA_SLOT3_OP +- -- : BFD_RELOC_XTENSA_SLOT4_OP +- -- : BFD_RELOC_XTENSA_SLOT5_OP +- -- : BFD_RELOC_XTENSA_SLOT6_OP +- -- : BFD_RELOC_XTENSA_SLOT7_OP +- -- : BFD_RELOC_XTENSA_SLOT8_OP +- -- : BFD_RELOC_XTENSA_SLOT9_OP +- -- : BFD_RELOC_XTENSA_SLOT10_OP +- -- : BFD_RELOC_XTENSA_SLOT11_OP +- -- : BFD_RELOC_XTENSA_SLOT12_OP +- -- : BFD_RELOC_XTENSA_SLOT13_OP +- -- : BFD_RELOC_XTENSA_SLOT14_OP +- Generic Xtensa relocations for instruction operands. Only the slot +- number is encoded in the relocation. The relocation applies to the +- last PC-relative immediate operand, or if there are no PC-relative +- immediates, to the last immediate operand. +- +- -- : BFD_RELOC_XTENSA_SLOT0_ALT +- -- : BFD_RELOC_XTENSA_SLOT1_ALT +- -- : BFD_RELOC_XTENSA_SLOT2_ALT +- -- : BFD_RELOC_XTENSA_SLOT3_ALT +- -- : BFD_RELOC_XTENSA_SLOT4_ALT +- -- : BFD_RELOC_XTENSA_SLOT5_ALT +- -- : BFD_RELOC_XTENSA_SLOT6_ALT +- -- : BFD_RELOC_XTENSA_SLOT7_ALT +- -- : BFD_RELOC_XTENSA_SLOT8_ALT +- -- : BFD_RELOC_XTENSA_SLOT9_ALT +- -- : BFD_RELOC_XTENSA_SLOT10_ALT +- -- : BFD_RELOC_XTENSA_SLOT11_ALT +- -- : BFD_RELOC_XTENSA_SLOT12_ALT +- -- : BFD_RELOC_XTENSA_SLOT13_ALT +- -- : BFD_RELOC_XTENSA_SLOT14_ALT +- Alternate Xtensa relocations. Only the slot is encoded in the +- relocation. The meaning of these relocations is opcode-specific. +- +- -- : BFD_RELOC_XTENSA_OP0 +- -- : BFD_RELOC_XTENSA_OP1 +- -- : BFD_RELOC_XTENSA_OP2 +- Xtensa relocations for backward compatibility. These have all been +- replaced by BFD_RELOC_XTENSA_SLOT0_OP. +- +- -- : BFD_RELOC_XTENSA_ASM_EXPAND +- Xtensa relocation to mark that the assembler expanded the +- instructions from an original target. The expansion size is +- encoded in the reloc size. +- +- -- : BFD_RELOC_XTENSA_ASM_SIMPLIFY +- Xtensa relocation to mark that the linker should simplify +- assembler-expanded instructions. This is commonly used internally +- by the linker after analysis of a BFD_RELOC_XTENSA_ASM_EXPAND. +- +- -- : BFD_RELOC_XTENSA_TLSDESC_FN +- -- : BFD_RELOC_XTENSA_TLSDESC_ARG +- -- : BFD_RELOC_XTENSA_TLS_DTPOFF +- -- : BFD_RELOC_XTENSA_TLS_TPOFF +- -- : BFD_RELOC_XTENSA_TLS_FUNC +- -- : BFD_RELOC_XTENSA_TLS_ARG +- -- : BFD_RELOC_XTENSA_TLS_CALL +- Xtensa TLS relocations. +- +- -- : BFD_RELOC_Z80_DISP8 +- 8 bit signed offset in (ix+d) or (iy+d). +- +- -- : BFD_RELOC_Z8K_DISP7 +- DJNZ offset. +- +- -- : BFD_RELOC_Z8K_CALLR +- CALR offset. +- +- -- : BFD_RELOC_Z8K_IMM4L +- 4 bit value. +- +- -- : BFD_RELOC_LM32_CALL +- -- : BFD_RELOC_LM32_BRANCH +- -- : BFD_RELOC_LM32_16_GOT +- -- : BFD_RELOC_LM32_GOTOFF_HI16 +- -- : BFD_RELOC_LM32_GOTOFF_LO16 +- -- : BFD_RELOC_LM32_COPY +- -- : BFD_RELOC_LM32_GLOB_DAT +- -- : BFD_RELOC_LM32_JMP_SLOT +- -- : BFD_RELOC_LM32_RELATIVE +- Lattice Mico32 relocations. +- +- -- : BFD_RELOC_MACH_O_SECTDIFF +- Difference between two section addreses. Must be followed by a +- BFD_RELOC_MACH_O_PAIR. +- +- -- : BFD_RELOC_MACH_O_LOCAL_SECTDIFF +- Like BFD_RELOC_MACH_O_SECTDIFF but with a local symbol. +- +- -- : BFD_RELOC_MACH_O_PAIR +- Pair of relocation. Contains the first symbol. +- +- -- : BFD_RELOC_MACH_O_X86_64_BRANCH32 +- -- : BFD_RELOC_MACH_O_X86_64_BRANCH8 +- PCREL relocations. They are marked as branch to create PLT entry +- if required. +- +- -- : BFD_RELOC_MACH_O_X86_64_GOT +- Used when referencing a GOT entry. +- +- -- : BFD_RELOC_MACH_O_X86_64_GOT_LOAD +- Used when loading a GOT entry with movq. It is specially marked +- so that the linker could optimize the movq to a leaq if possible. +- +- -- : BFD_RELOC_MACH_O_X86_64_SUBTRACTOR32 +- Symbol will be substracted. Must be followed by a BFD_RELOC_64. +- +- -- : BFD_RELOC_MACH_O_X86_64_SUBTRACTOR64 +- Symbol will be substracted. Must be followed by a BFD_RELOC_64. +- +- -- : BFD_RELOC_MACH_O_X86_64_PCREL32_1 +- Same as BFD_RELOC_32_PCREL but with an implicit -1 addend. +- +- -- : BFD_RELOC_MACH_O_X86_64_PCREL32_2 +- Same as BFD_RELOC_32_PCREL but with an implicit -2 addend. +- +- -- : BFD_RELOC_MACH_O_X86_64_PCREL32_4 +- Same as BFD_RELOC_32_PCREL but with an implicit -4 addend. +- +- -- : BFD_RELOC_MICROBLAZE_32_LO +- This is a 32 bit reloc for the microblaze that stores the low 16 +- bits of a value +- +- -- : BFD_RELOC_MICROBLAZE_32_LO_PCREL +- This is a 32 bit pc-relative reloc for the microblaze that stores +- the low 16 bits of a value +- +- -- : BFD_RELOC_MICROBLAZE_32_ROSDA +- This is a 32 bit reloc for the microblaze that stores a value +- relative to the read-only small data area anchor +- +- -- : BFD_RELOC_MICROBLAZE_32_RWSDA +- This is a 32 bit reloc for the microblaze that stores a value +- relative to the read-write small data area anchor +- +- -- : BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM +- This is a 32 bit reloc for the microblaze to handle expressions of +- the form "Symbol Op Symbol" +- +- -- : BFD_RELOC_MICROBLAZE_64_NONE +- This is a 64 bit reloc that stores the 32 bit pc relative value in +- two words (with an imm instruction). No relocation is done here - +- only used for relaxing +- +- -- : BFD_RELOC_MICROBLAZE_64_GOTPC +- This is a 64 bit reloc that stores the 32 bit pc relative value in +- two words (with an imm instruction). The relocation is +- PC-relative GOT offset +- +- -- : BFD_RELOC_MICROBLAZE_64_GOT +- This is a 64 bit reloc that stores the 32 bit pc relative value in +- two words (with an imm instruction). The relocation is GOT offset +- +- -- : BFD_RELOC_MICROBLAZE_64_PLT +- This is a 64 bit reloc that stores the 32 bit pc relative value in +- two words (with an imm instruction). The relocation is +- PC-relative offset into PLT +- +- -- : BFD_RELOC_MICROBLAZE_64_GOTOFF +- This is a 64 bit reloc that stores the 32 bit GOT relative value +- in two words (with an imm instruction). The relocation is +- relative offset from _GLOBAL_OFFSET_TABLE_ +- +- -- : BFD_RELOC_MICROBLAZE_32_GOTOFF +- This is a 32 bit reloc that stores the 32 bit GOT relative value +- in a word. The relocation is relative offset from +- +- -- : BFD_RELOC_MICROBLAZE_COPY +- This is used to tell the dynamic linker to copy the value out of +- the dynamic object into the runtime process image. +- +- -- : BFD_RELOC_MICROBLAZE_64_TLS +- Unused Reloc +- +- -- : BFD_RELOC_MICROBLAZE_64_TLSGD +- This is a 64 bit reloc that stores the 32 bit GOT relative value +- of the GOT TLS GD info entry in two words (with an imm +- instruction). The relocation is GOT offset. +- +- -- : BFD_RELOC_MICROBLAZE_64_TLSLD +- This is a 64 bit reloc that stores the 32 bit GOT relative value +- of the GOT TLS LD info entry in two words (with an imm +- instruction). The relocation is GOT offset. +- +- -- : BFD_RELOC_MICROBLAZE_32_TLSDTPMOD +- This is a 32 bit reloc that stores the Module ID to GOT(n). +- +- -- : BFD_RELOC_MICROBLAZE_32_TLSDTPREL +- This is a 32 bit reloc that stores TLS offset to GOT(n+1). +- +- -- : BFD_RELOC_MICROBLAZE_64_TLSDTPREL +- This is a 32 bit reloc for storing TLS offset to two words (uses +- imm instruction) +- +- -- : BFD_RELOC_MICROBLAZE_64_TLSGOTTPREL +- This is a 64 bit reloc that stores 32-bit thread pointer relative +- offset to two words (uses imm instruction). +- +- -- : BFD_RELOC_MICROBLAZE_64_TLSTPREL +- This is a 64 bit reloc that stores 32-bit thread pointer relative +- offset to two words (uses imm instruction). +- +- -- : BFD_RELOC_AARCH64_RELOC_START +- AArch64 pseudo relocation code to mark the start of the AArch64 +- relocation enumerators. N.B. the order of the enumerators is +- important as several tables in the AArch64 bfd backend are indexed +- by these enumerators; make sure they are all synced. +- +- -- : BFD_RELOC_AARCH64_NONE +- AArch64 null relocation code. +- +- -- : BFD_RELOC_AARCH64_64 +- -- : BFD_RELOC_AARCH64_32 +- -- : BFD_RELOC_AARCH64_16 +- Basic absolute relocations of N bits. These are equivalent to +- BFD_RELOC_N and they were added to assist the indexing of the howto +- table. +- +- -- : BFD_RELOC_AARCH64_64_PCREL +- -- : BFD_RELOC_AARCH64_32_PCREL +- -- : BFD_RELOC_AARCH64_16_PCREL +- PC-relative relocations. These are equivalent to BFD_RELOC_N_PCREL +- and they were added to assist the indexing of the howto table. +- +- -- : BFD_RELOC_AARCH64_MOVW_G0 +- AArch64 MOV[NZK] instruction with most significant bits 0 to 15 of +- an unsigned address/value. +- +- -- : BFD_RELOC_AARCH64_MOVW_G0_NC +- AArch64 MOV[NZK] instruction with less significant bits 0 to 15 of +- an address/value. No overflow checking. +- +- -- : BFD_RELOC_AARCH64_MOVW_G1 +- AArch64 MOV[NZK] instruction with most significant bits 16 to 31 +- of an unsigned address/value. +- +- -- : BFD_RELOC_AARCH64_MOVW_G1_NC +- AArch64 MOV[NZK] instruction with less significant bits 16 to 31 +- of an address/value. No overflow checking. +- +- -- : BFD_RELOC_AARCH64_MOVW_G2 +- AArch64 MOV[NZK] instruction with most significant bits 32 to 47 +- of an unsigned address/value. +- +- -- : BFD_RELOC_AARCH64_MOVW_G2_NC +- AArch64 MOV[NZK] instruction with less significant bits 32 to 47 +- of an address/value. No overflow checking. +- +- -- : BFD_RELOC_AARCH64_MOVW_G3 +- AArch64 MOV[NZK] instruction with most signficant bits 48 to 64 of +- a signed or unsigned address/value. +- +- -- : BFD_RELOC_AARCH64_MOVW_G0_S +- AArch64 MOV[NZ] instruction with most significant bits 0 to 15 of +- a signed value. Changes instruction to MOVZ or MOVN depending on +- the value's sign. +- +- -- : BFD_RELOC_AARCH64_MOVW_G1_S +- AArch64 MOV[NZ] instruction with most significant bits 16 to 31 of +- a signed value. Changes instruction to MOVZ or MOVN depending on +- the value's sign. +- +- -- : BFD_RELOC_AARCH64_MOVW_G2_S +- AArch64 MOV[NZ] instruction with most significant bits 32 to 47 of +- a signed value. Changes instruction to MOVZ or MOVN depending on +- the value's sign. +- +- -- : BFD_RELOC_AARCH64_LD_LO19_PCREL +- AArch64 Load Literal instruction, holding a 19 bit pc-relative word +- offset. The lowest two bits must be zero and are not stored in the +- instruction, giving a 21 bit signed byte offset. +- +- -- : BFD_RELOC_AARCH64_ADR_LO21_PCREL +- AArch64 ADR instruction, holding a simple 21 bit pc-relative byte +- offset. +- +- -- : BFD_RELOC_AARCH64_ADR_HI21_PCREL +- AArch64 ADRP instruction, with bits 12 to 32 of a pc-relative page +- offset, giving a 4KB aligned page base address. +- +- -- : BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL +- AArch64 ADRP instruction, with bits 12 to 32 of a pc-relative page +- offset, giving a 4KB aligned page base address, but with no +- overflow checking. +- +- -- : BFD_RELOC_AARCH64_ADD_LO12 +- AArch64 ADD immediate instruction, holding bits 0 to 11 of the +- address. Used in conjunction with +- BFD_RELOC_AARCH64_ADR_HI21_PCREL. +- +- -- : BFD_RELOC_AARCH64_LDST8_LO12 +- AArch64 8-bit load/store instruction, holding bits 0 to 11 of the +- address. Used in conjunction with +- BFD_RELOC_AARCH64_ADR_HI21_PCREL. +- +- -- : BFD_RELOC_AARCH64_TSTBR14 +- AArch64 14 bit pc-relative test bit and branch. The lowest two +- bits must be zero and are not stored in the instruction, giving a +- 16 bit signed byte offset. +- +- -- : BFD_RELOC_AARCH64_BRANCH19 +- AArch64 19 bit pc-relative conditional branch and compare & branch. +- The lowest two bits must be zero and are not stored in the +- instruction, giving a 21 bit signed byte offset. +- +- -- : BFD_RELOC_AARCH64_JUMP26 +- AArch64 26 bit pc-relative unconditional branch. The lowest two +- bits must be zero and are not stored in the instruction, giving a +- 28 bit signed byte offset. +- +- -- : BFD_RELOC_AARCH64_CALL26 +- AArch64 26 bit pc-relative unconditional branch and link. The +- lowest two bits must be zero and are not stored in the instruction, +- giving a 28 bit signed byte offset. +- +- -- : BFD_RELOC_AARCH64_LDST16_LO12 +- AArch64 16-bit load/store instruction, holding bits 0 to 11 of the +- address. Used in conjunction with +- BFD_RELOC_AARCH64_ADR_HI21_PCREL. +- +- -- : BFD_RELOC_AARCH64_LDST32_LO12 +- AArch64 32-bit load/store instruction, holding bits 0 to 11 of the +- address. Used in conjunction with +- BFD_RELOC_AARCH64_ADR_HI21_PCREL. +- +- -- : BFD_RELOC_AARCH64_LDST64_LO12 +- AArch64 64-bit load/store instruction, holding bits 0 to 11 of the +- address. Used in conjunction with +- BFD_RELOC_AARCH64_ADR_HI21_PCREL. +- +- -- : BFD_RELOC_AARCH64_LDST128_LO12 +- AArch64 128-bit load/store instruction, holding bits 0 to 11 of the +- address. Used in conjunction with +- BFD_RELOC_AARCH64_ADR_HI21_PCREL. +- +- -- : BFD_RELOC_AARCH64_GOT_LD_PREL19 +- AArch64 Load Literal instruction, holding a 19 bit PC relative word +- offset of the global offset table entry for a symbol. The lowest +- two bits must be zero and are not stored in the instruction, +- giving a 21 bit signed byte offset. This relocation type requires +- signed overflow checking. +- +- -- : BFD_RELOC_AARCH64_ADR_GOT_PAGE +- Get to the page base of the global offset table entry for a symbol +- as part of an ADRP instruction using a 21 bit PC relative +- value.Used in conjunction with BFD_RELOC_AARCH64_LD64_GOT_LO12_NC. +- +- -- : BFD_RELOC_AARCH64_LD64_GOT_LO12_NC +- Unsigned 12 bit byte offset for 64 bit load/store from the page of +- the GOT entry for this symbol. Used in conjunction with +- BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in LP64 ABI only. +- +- -- : BFD_RELOC_AARCH64_LD32_GOT_LO12_NC +- Unsigned 12 bit byte offset for 32 bit load/store from the page of +- the GOT entry for this symbol. Used in conjunction with +- BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in ILP32 ABI only. +- +- -- : BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21 +- Get to the page base of the global offset table entry for a symbols +- tls_index structure as part of an adrp instruction using a 21 bit +- PC relative value. Used in conjunction with +- BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC. +- +- -- : BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC +- Unsigned 12 bit byte offset to global offset table entry for a +- symbols tls_index structure. Used in conjunction with +- BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21. +- +- -- : BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1 +- AArch64 TLS INITIAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC +- AArch64 TLS INITIAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 +- AArch64 TLS INITIAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC +- AArch64 TLS INITIAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC +- AArch64 TLS INITIAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19 +- AArch64 TLS INITIAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2 +- AArch64 TLS LOCAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1 +- AArch64 TLS LOCAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC +- AArch64 TLS LOCAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0 +- AArch64 TLS LOCAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC +- AArch64 TLS LOCAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12 +- AArch64 TLS LOCAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12 +- AArch64 TLS LOCAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC +- AArch64 TLS LOCAL EXEC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSDESC_LD_PREL19 +- AArch64 TLS DESC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21 +- AArch64 TLS DESC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21 +- AArch64 TLS DESC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC +- AArch64 TLS DESC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC +- AArch64 TLS DESC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC +- AArch64 TLS DESC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSDESC_OFF_G1 +- AArch64 TLS DESC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC +- AArch64 TLS DESC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSDESC_LDR +- AArch64 TLS DESC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSDESC_ADD +- AArch64 TLS DESC relocation. +- +- -- : BFD_RELOC_AARCH64_TLSDESC_CALL +- AArch64 TLS DESC relocation. +- +- -- : BFD_RELOC_AARCH64_COPY +- AArch64 TLS relocation. +- +- -- : BFD_RELOC_AARCH64_GLOB_DAT +- AArch64 TLS relocation. +- +- -- : BFD_RELOC_AARCH64_JUMP_SLOT +- AArch64 TLS relocation. +- +- -- : BFD_RELOC_AARCH64_RELATIVE +- AArch64 TLS relocation. +- +- -- : BFD_RELOC_AARCH64_TLS_DTPMOD +- AArch64 TLS relocation. +- +- -- : BFD_RELOC_AARCH64_TLS_DTPREL +- AArch64 TLS relocation. +- +- -- : BFD_RELOC_AARCH64_TLS_TPREL +- AArch64 TLS relocation. +- +- -- : BFD_RELOC_AARCH64_TLSDESC +- AArch64 TLS relocation. +- +- -- : BFD_RELOC_AARCH64_IRELATIVE +- AArch64 support for STT_GNU_IFUNC. +- +- -- : BFD_RELOC_AARCH64_RELOC_END +- AArch64 pseudo relocation code to mark the end of the AArch64 +- relocation enumerators that have direct mapping to ELF reloc codes. +- There are a few more enumerators after this one; those are mainly +- used by the AArch64 assembler for the internal fixup or to select +- one of the above enumerators. +- +- -- : BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP +- AArch64 pseudo relocation code to be used internally by the AArch64 +- assembler and not (currently) written to any object files. +- +- -- : BFD_RELOC_AARCH64_LDST_LO12 +- AArch64 unspecified load/store instruction, holding bits 0 to 11 +- of the address. Used in conjunction with +- BFD_RELOC_AARCH64_ADR_HI21_PCREL. +- +- -- : BFD_RELOC_AARCH64_LD_GOT_LO12_NC +- AArch64 pseudo relocation code to be used internally by the AArch64 +- assembler and not (currently) written to any object files. +- +- -- : BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC +- AArch64 pseudo relocation code to be used internally by the AArch64 +- assembler and not (currently) written to any object files. +- +- -- : BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC +- AArch64 pseudo relocation code to be used internally by the AArch64 +- assembler and not (currently) written to any object files. +- +- -- : BFD_RELOC_TILEPRO_COPY +- -- : BFD_RELOC_TILEPRO_GLOB_DAT +- -- : BFD_RELOC_TILEPRO_JMP_SLOT +- -- : BFD_RELOC_TILEPRO_RELATIVE +- -- : BFD_RELOC_TILEPRO_BROFF_X1 +- -- : BFD_RELOC_TILEPRO_JOFFLONG_X1 +- -- : BFD_RELOC_TILEPRO_JOFFLONG_X1_PLT +- -- : BFD_RELOC_TILEPRO_IMM8_X0 +- -- : BFD_RELOC_TILEPRO_IMM8_Y0 +- -- : BFD_RELOC_TILEPRO_IMM8_X1 +- -- : BFD_RELOC_TILEPRO_IMM8_Y1 +- -- : BFD_RELOC_TILEPRO_DEST_IMM8_X1 +- -- : BFD_RELOC_TILEPRO_MT_IMM15_X1 +- -- : BFD_RELOC_TILEPRO_MF_IMM15_X1 +- -- : BFD_RELOC_TILEPRO_IMM16_X0 +- -- : BFD_RELOC_TILEPRO_IMM16_X1 +- -- : BFD_RELOC_TILEPRO_IMM16_X0_LO +- -- : BFD_RELOC_TILEPRO_IMM16_X1_LO +- -- : BFD_RELOC_TILEPRO_IMM16_X0_HI +- -- : BFD_RELOC_TILEPRO_IMM16_X1_HI +- -- : BFD_RELOC_TILEPRO_IMM16_X0_HA +- -- : BFD_RELOC_TILEPRO_IMM16_X1_HA +- -- : BFD_RELOC_TILEPRO_IMM16_X0_PCREL +- -- : BFD_RELOC_TILEPRO_IMM16_X1_PCREL +- -- : BFD_RELOC_TILEPRO_IMM16_X0_LO_PCREL +- -- : BFD_RELOC_TILEPRO_IMM16_X1_LO_PCREL +- -- : BFD_RELOC_TILEPRO_IMM16_X0_HI_PCREL +- -- : BFD_RELOC_TILEPRO_IMM16_X1_HI_PCREL +- -- : BFD_RELOC_TILEPRO_IMM16_X0_HA_PCREL +- -- : BFD_RELOC_TILEPRO_IMM16_X1_HA_PCREL +- -- : BFD_RELOC_TILEPRO_IMM16_X0_GOT +- -- : BFD_RELOC_TILEPRO_IMM16_X1_GOT +- -- : BFD_RELOC_TILEPRO_IMM16_X0_GOT_LO +- -- : BFD_RELOC_TILEPRO_IMM16_X1_GOT_LO +- -- : BFD_RELOC_TILEPRO_IMM16_X0_GOT_HI +- -- : BFD_RELOC_TILEPRO_IMM16_X1_GOT_HI +- -- : BFD_RELOC_TILEPRO_IMM16_X0_GOT_HA +- -- : BFD_RELOC_TILEPRO_IMM16_X1_GOT_HA +- -- : BFD_RELOC_TILEPRO_MMSTART_X0 +- -- : BFD_RELOC_TILEPRO_MMEND_X0 +- -- : BFD_RELOC_TILEPRO_MMSTART_X1 +- -- : BFD_RELOC_TILEPRO_MMEND_X1 +- -- : BFD_RELOC_TILEPRO_SHAMT_X0 +- -- : BFD_RELOC_TILEPRO_SHAMT_X1 +- -- : BFD_RELOC_TILEPRO_SHAMT_Y0 +- -- : BFD_RELOC_TILEPRO_SHAMT_Y1 +- -- : BFD_RELOC_TILEPRO_TLS_GD_CALL +- -- : BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD +- -- : BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD +- -- : BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD +- -- : BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD +- -- : BFD_RELOC_TILEPRO_TLS_IE_LOAD +- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD +- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD +- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO +- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO +- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI +- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI +- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA +- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA +- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE +- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE +- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO +- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO +- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI +- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI +- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA +- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA +- -- : BFD_RELOC_TILEPRO_TLS_DTPMOD32 +- -- : BFD_RELOC_TILEPRO_TLS_DTPOFF32 +- -- : BFD_RELOC_TILEPRO_TLS_TPOFF32 +- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE +- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE +- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO +- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO +- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI +- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI +- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA +- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA +- Tilera TILEPro Relocations. +- +- -- : BFD_RELOC_TILEGX_HW0 +- -- : BFD_RELOC_TILEGX_HW1 +- -- : BFD_RELOC_TILEGX_HW2 +- -- : BFD_RELOC_TILEGX_HW3 +- -- : BFD_RELOC_TILEGX_HW0_LAST +- -- : BFD_RELOC_TILEGX_HW1_LAST +- -- : BFD_RELOC_TILEGX_HW2_LAST +- -- : BFD_RELOC_TILEGX_COPY +- -- : BFD_RELOC_TILEGX_GLOB_DAT +- -- : BFD_RELOC_TILEGX_JMP_SLOT +- -- : BFD_RELOC_TILEGX_RELATIVE +- -- : BFD_RELOC_TILEGX_BROFF_X1 +- -- : BFD_RELOC_TILEGX_JUMPOFF_X1 +- -- : BFD_RELOC_TILEGX_JUMPOFF_X1_PLT +- -- : BFD_RELOC_TILEGX_IMM8_X0 +- -- : BFD_RELOC_TILEGX_IMM8_Y0 +- -- : BFD_RELOC_TILEGX_IMM8_X1 +- -- : BFD_RELOC_TILEGX_IMM8_Y1 +- -- : BFD_RELOC_TILEGX_DEST_IMM8_X1 +- -- : BFD_RELOC_TILEGX_MT_IMM14_X1 +- -- : BFD_RELOC_TILEGX_MF_IMM14_X1 +- -- : BFD_RELOC_TILEGX_MMSTART_X0 +- -- : BFD_RELOC_TILEGX_MMEND_X0 +- -- : BFD_RELOC_TILEGX_SHAMT_X0 +- -- : BFD_RELOC_TILEGX_SHAMT_X1 +- -- : BFD_RELOC_TILEGX_SHAMT_Y0 +- -- : BFD_RELOC_TILEGX_SHAMT_Y1 +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0 +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0 +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1 +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1 +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW2 +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW2 +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW3 +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW3 +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW2_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW2_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW3_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW3_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_GOT +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_GOT +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW2_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW2_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_GOT +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_GOT +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_GOT +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_GOT +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW3_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW3_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE +- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE +- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE +- -- : BFD_RELOC_TILEGX_TLS_DTPMOD64 +- -- : BFD_RELOC_TILEGX_TLS_DTPOFF64 +- -- : BFD_RELOC_TILEGX_TLS_TPOFF64 +- -- : BFD_RELOC_TILEGX_TLS_DTPMOD32 +- -- : BFD_RELOC_TILEGX_TLS_DTPOFF32 +- -- : BFD_RELOC_TILEGX_TLS_TPOFF32 +- -- : BFD_RELOC_TILEGX_TLS_GD_CALL +- -- : BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD +- -- : BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD +- -- : BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD +- -- : BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD +- -- : BFD_RELOC_TILEGX_TLS_IE_LOAD +- -- : BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD +- -- : BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD +- -- : BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD +- -- : BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD +- Tilera TILE-Gx Relocations. +- +- -- : BFD_RELOC_EPIPHANY_SIMM8 +- Adapteva EPIPHANY - 8 bit signed pc-relative displacement +- +- -- : BFD_RELOC_EPIPHANY_SIMM24 +- Adapteva EPIPHANY - 24 bit signed pc-relative displacement +- +- -- : BFD_RELOC_EPIPHANY_HIGH +- Adapteva EPIPHANY - 16 most-significant bits of absolute address +- +- -- : BFD_RELOC_EPIPHANY_LOW +- Adapteva EPIPHANY - 16 least-significant bits of absolute address +- +- -- : BFD_RELOC_EPIPHANY_SIMM11 +- Adapteva EPIPHANY - 11 bit signed number - add/sub immediate +- +- -- : BFD_RELOC_EPIPHANY_IMM11 +- Adapteva EPIPHANY - 11 bit sign-magnitude number (ld/st +- displacement) +- +- -- : BFD_RELOC_EPIPHANY_IMM8 +- Adapteva EPIPHANY - 8 bit immediate for 16 bit mov instruction. +- +- +- typedef enum bfd_reloc_code_real bfd_reloc_code_real_type; +- +-2.10.2.2 `bfd_reloc_type_lookup' +-................................ +- +-*Synopsis* +- reloc_howto_type *bfd_reloc_type_lookup +- (bfd *abfd, bfd_reloc_code_real_type code); +- reloc_howto_type *bfd_reloc_name_lookup +- (bfd *abfd, const char *reloc_name); +- *Description* +-Return a pointer to a howto structure which, when invoked, will perform +-the relocation CODE on data from the architecture noted. +- +-2.10.2.3 `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. +- +-2.10.2.4 `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. +- +-2.10.2.5 `bfd_generic_relax_section' +-.................................... +- +-*Synopsis* +- bfd_boolean bfd_generic_relax_section +- (bfd *abfd, +- asection *section, +- struct bfd_link_info *, +- bfd_boolean *); +- *Description* +-Provides default handling for relaxing for back ends which don't do +-relaxing. +- +-2.10.2.6 `bfd_generic_gc_sections' +-.................................. +- +-*Synopsis* +- bfd_boolean bfd_generic_gc_sections +- (bfd *, struct bfd_link_info *); +- *Description* +-Provides default handling for relaxing for back ends which don't do +-section gc - i.e., does nothing. +- +-2.10.2.7 `bfd_generic_lookup_section_flags' +-........................................... +- +-*Synopsis* +- bfd_boolean bfd_generic_lookup_section_flags +- (struct bfd_link_info *, struct flag_info *, asection *); +- *Description* +-Provides default handling for section flags lookup - i.e., does nothing. +-Returns FALSE if the section should be omitted, otherwise TRUE. +- +-2.10.2.8 `bfd_generic_merge_sections' +-..................................... +- +-*Synopsis* +- bfd_boolean bfd_generic_merge_sections +- (bfd *, struct bfd_link_info *); +- *Description* +-Provides default handling for SEC_MERGE section merging for back ends +-which don't have SEC_MERGE support - i.e., does nothing. +- +-2.10.2.9 `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, +- bfd_boolean relocatable, +- asymbol **symbols); +- *Description* +-Provides default handling of relocation effort for back ends which +-can't be bothered to do it efficiently. +- +- +-File: bfd.info, Node: Core Files, Next: Targets, Prev: Relocations, Up: BFD front end +- +-2.11 Core files +-=============== +- +-2.11.1 Core file functions +--------------------------- +- +-*Description* +-These are functions pertaining to core files. +- +-2.11.1.1 `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 ABFD. +- +-2.11.1.2 `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 ABFD is attached to. +- +-2.11.1.3 `bfd_core_file_pid' +-............................ +- +-*Synopsis* +- int bfd_core_file_pid (bfd *abfd); +- *Description* +-Returns the PID of the process the core dump the BFD ABFD is attached +-to was generated from. +- +-2.11.1.4 `core_file_matches_executable_p' +-......................................... +- +-*Synopsis* +- bfd_boolean core_file_matches_executable_p +- (bfd *core_bfd, bfd *exec_bfd); +- *Description* +-Return `TRUE' if the core file attached to CORE_BFD was generated by a +-run of the executable file attached to EXEC_BFD, `FALSE' otherwise. +- +-2.11.1.5 `generic_core_file_matches_executable_p' +-................................................. +- +-*Synopsis* +- bfd_boolean generic_core_file_matches_executable_p +- (bfd *core_bfd, bfd *exec_bfd); +- *Description* +-Return TRUE if the core file attached to CORE_BFD was generated by a +-run of the executable file attached to EXEC_BFD. The match is based on +-executable basenames only. +- +- Note: When not able to determine the core file failing command or +-the executable name, we still return TRUE even though we're not sure +-that core file and executable match. This is to avoid generating a +-false warning in situations where we really don't know whether they +-match or not. +- +- +-File: bfd.info, Node: Targets, Next: Architectures, Prev: Core Files, Up: BFD front end +- +-2.12 Targets +-============ +- +-*Description* +-Each port of BFD to a different machine requires 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: +- +- * 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. +- +- * If a null target string was provided to `bfd_find_target', look up +- the environment variable `GNUTARGET' and use that as the target +- string. +- +- * 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. *Note +- bfd_target::. *Note Formats::. +- +- * Otherwise, inspect the elements in the target vector one by one, +- until a match on target name is found. When found, use it. +- +- * Otherwise return the error `bfd_error_invalid_target' to +- `bfd_openr'. +- +- * `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:: +- +- +-File: bfd.info, Node: bfd_target, Prev: Targets, Up: Targets +- +-2.12.1 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 `bfd.h', and are also used when calling various routines by hand +-inside the BFD implementation. The 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_xcoff_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_verilog_flavour, +- bfd_target_ihex_flavour, +- bfd_target_som_flavour, +- bfd_target_os9k_flavour, +- bfd_target_versados_flavour, +- bfd_target_msdos_flavour, +- bfd_target_ovax_flavour, +- bfd_target_evax_flavour, +- bfd_target_mmo_flavour, +- bfd_target_mach_o_flavour, +- bfd_target_pef_flavour, +- bfd_target_pef_xlib_flavour, +- bfd_target_sym_flavour +- }; +- +- enum bfd_endian { BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN }; +- +- /* Forward declaration. */ +- typedef struct bfd_link_info _bfd_link_info; +- +- /* Forward declaration. */ +- typedef struct flag_info flag_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 `BFD_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 char ar_max_namelen; +- +- /* How well this target matches, used to select between various +- possible targets when more than one target matches. */ +- unsigned char match_priority; +- +- /* Entries for byte swapping for data. These are different from the +- other entry points, since they don't take a BFD as the first argument. +- Certain other handlers could do the same. */ +- bfd_uint64_t (*bfd_getx64) (const void *); +- bfd_int64_t (*bfd_getx_signed_64) (const void *); +- void (*bfd_putx64) (bfd_uint64_t, void *); +- bfd_vma (*bfd_getx32) (const void *); +- bfd_signed_vma (*bfd_getx_signed_32) (const void *); +- void (*bfd_putx32) (bfd_vma, void *); +- bfd_vma (*bfd_getx16) (const void *); +- bfd_signed_vma (*bfd_getx_signed_16) (const void *); +- void (*bfd_putx16) (bfd_vma, void *); +- +- /* Byte swapping for the headers. */ +- bfd_uint64_t (*bfd_h_getx64) (const void *); +- bfd_int64_t (*bfd_h_getx_signed_64) (const void *); +- void (*bfd_h_putx64) (bfd_uint64_t, void *); +- bfd_vma (*bfd_h_getx32) (const void *); +- bfd_signed_vma (*bfd_h_getx_signed_32) (const void *); +- void (*bfd_h_putx32) (bfd_vma, void *); +- bfd_vma (*bfd_h_getx16) (const void *); +- bfd_signed_vma (*bfd_h_getx_signed_16) (const void *); +- void (*bfd_h_putx16) (bfd_vma, void *); +- +- /* 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]) (bfd *); +- +- /* Set the format of a file being written. */ +- bfd_boolean (*_bfd_set_format[bfd_type_end]) (bfd *); +- +- /* Write cached information into a file being written, at `bfd_close'. */ +- bfd_boolean (*_bfd_write_contents[bfd_type_end]) (bfd *); +- The general target vector. These vectors are initialized using the +-BFD_JUMP_TABLE macros. +- +- /* Generic entry points. */ +- #define BFD_JUMP_TABLE_GENERIC(NAME) \ +- NAME##_close_and_cleanup, \ +- NAME##_bfd_free_cached_info, \ +- NAME##_new_section_hook, \ +- NAME##_get_section_contents, \ +- NAME##_get_section_contents_in_window +- +- /* Called when the BFD is being closed to do any necessary cleanup. */ +- bfd_boolean (*_close_and_cleanup) (bfd *); +- /* Ask the BFD to free all cached information. */ +- bfd_boolean (*_bfd_free_cached_info) (bfd *); +- /* Called when a new section is created. */ +- bfd_boolean (*_new_section_hook) (bfd *, sec_ptr); +- /* Read the contents of a section. */ +- bfd_boolean (*_bfd_get_section_contents) +- (bfd *, sec_ptr, void *, file_ptr, bfd_size_type); +- bfd_boolean (*_bfd_get_section_contents_in_window) +- (bfd *, sec_ptr, bfd_window *, file_ptr, bfd_size_type); +- +- /* Entry points to copy private data. */ +- #define BFD_JUMP_TABLE_COPY(NAME) \ +- NAME##_bfd_copy_private_bfd_data, \ +- NAME##_bfd_merge_private_bfd_data, \ +- _bfd_generic_init_private_section_data, \ +- NAME##_bfd_copy_private_section_data, \ +- NAME##_bfd_copy_private_symbol_data, \ +- NAME##_bfd_copy_private_header_data, \ +- NAME##_bfd_set_private_flags, \ +- NAME##_bfd_print_private_bfd_data +- +- /* Called to copy BFD general private data from one object file +- to another. */ +- bfd_boolean (*_bfd_copy_private_bfd_data) (bfd *, bfd *); +- /* Called to merge BFD general private data from one object file +- to a common output file when linking. */ +- bfd_boolean (*_bfd_merge_private_bfd_data) (bfd *, bfd *); +- /* Called to initialize BFD private section data from one object file +- to another. */ +- #define bfd_init_private_section_data(ibfd, isec, obfd, osec, link_info) \ +- BFD_SEND (obfd, _bfd_init_private_section_data, (ibfd, isec, obfd, osec, link_info)) +- bfd_boolean (*_bfd_init_private_section_data) +- (bfd *, sec_ptr, bfd *, sec_ptr, struct bfd_link_info *); +- /* Called to copy BFD private section data from one object file +- to another. */ +- bfd_boolean (*_bfd_copy_private_section_data) +- (bfd *, sec_ptr, bfd *, sec_ptr); +- /* Called to copy BFD private symbol data from one symbol +- to another. */ +- bfd_boolean (*_bfd_copy_private_symbol_data) +- (bfd *, asymbol *, bfd *, asymbol *); +- /* Called to copy BFD private header data from one object file +- to another. */ +- bfd_boolean (*_bfd_copy_private_header_data) +- (bfd *, bfd *); +- /* Called to set private backend flags. */ +- bfd_boolean (*_bfd_set_private_flags) (bfd *, flagword); +- +- /* Called to print private BFD data. */ +- bfd_boolean (*_bfd_print_private_bfd_data) (bfd *, void *); +- +- /* Core file entry points. */ +- #define BFD_JUMP_TABLE_CORE(NAME) \ +- NAME##_core_file_failing_command, \ +- NAME##_core_file_failing_signal, \ +- NAME##_core_file_matches_executable_p, \ +- NAME##_core_file_pid +- +- char * (*_core_file_failing_command) (bfd *); +- int (*_core_file_failing_signal) (bfd *); +- bfd_boolean (*_core_file_matches_executable_p) (bfd *, bfd *); +- int (*_core_file_pid) (bfd *); +- +- /* Archive entry points. */ +- #define BFD_JUMP_TABLE_ARCHIVE(NAME) \ +- NAME##_slurp_armap, \ +- NAME##_slurp_extended_name_table, \ +- NAME##_construct_extended_name_table, \ +- NAME##_truncate_arname, \ +- NAME##_write_armap, \ +- NAME##_read_ar_hdr, \ +- NAME##_write_ar_hdr, \ +- NAME##_openr_next_archived_file, \ +- NAME##_get_elt_at_index, \ +- NAME##_generic_stat_arch_elt, \ +- NAME##_update_armap_timestamp +- +- bfd_boolean (*_bfd_slurp_armap) (bfd *); +- bfd_boolean (*_bfd_slurp_extended_name_table) (bfd *); +- bfd_boolean (*_bfd_construct_extended_name_table) +- (bfd *, char **, bfd_size_type *, const char **); +- void (*_bfd_truncate_arname) (bfd *, const char *, char *); +- bfd_boolean (*write_armap) +- (bfd *, unsigned int, struct orl *, unsigned int, int); +- void * (*_bfd_read_ar_hdr_fn) (bfd *); +- bfd_boolean (*_bfd_write_ar_hdr_fn) (bfd *, bfd *); +- bfd * (*openr_next_archived_file) (bfd *, bfd *); +- #define bfd_get_elt_at_index(b,i) BFD_SEND (b, _bfd_get_elt_at_index, (b,i)) +- bfd * (*_bfd_get_elt_at_index) (bfd *, symindex); +- int (*_bfd_stat_arch_elt) (bfd *, struct stat *); +- bfd_boolean (*_bfd_update_armap_timestamp) (bfd *); +- +- /* Entry points used for symbols. */ +- #define BFD_JUMP_TABLE_SYMBOLS(NAME) \ +- NAME##_get_symtab_upper_bound, \ +- NAME##_canonicalize_symtab, \ +- NAME##_make_empty_symbol, \ +- NAME##_print_symbol, \ +- NAME##_get_symbol_info, \ +- NAME##_bfd_is_local_label_name, \ +- NAME##_bfd_is_target_special_symbol, \ +- NAME##_get_lineno, \ +- NAME##_find_nearest_line, \ +- _bfd_generic_find_nearest_line_discriminator, \ +- _bfd_generic_find_line, \ +- NAME##_find_inliner_info, \ +- NAME##_bfd_make_debug_symbol, \ +- NAME##_read_minisymbols, \ +- NAME##_minisymbol_to_symbol +- +- long (*_bfd_get_symtab_upper_bound) (bfd *); +- long (*_bfd_canonicalize_symtab) +- (bfd *, struct bfd_symbol **); +- struct bfd_symbol * +- (*_bfd_make_empty_symbol) (bfd *); +- void (*_bfd_print_symbol) +- (bfd *, void *, struct bfd_symbol *, 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) +- (bfd *, struct bfd_symbol *, symbol_info *); +- #define bfd_get_symbol_info(b,p,e) BFD_SEND (b, _bfd_get_symbol_info, (b,p,e)) +- bfd_boolean (*_bfd_is_local_label_name) (bfd *, const char *); +- bfd_boolean (*_bfd_is_target_special_symbol) (bfd *, asymbol *); +- alent * (*_get_lineno) (bfd *, struct bfd_symbol *); +- bfd_boolean (*_bfd_find_nearest_line) +- (bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma, +- const char **, const char **, unsigned int *); +- bfd_boolean (*_bfd_find_nearest_line_discriminator) +- (bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma, +- const char **, const char **, unsigned int *, unsigned int *); +- bfd_boolean (*_bfd_find_line) +- (bfd *, struct bfd_symbol **, struct bfd_symbol *, +- const char **, unsigned int *); +- bfd_boolean (*_bfd_find_inliner_info) +- (bfd *, const char **, const char **, unsigned int *); +- /* 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) +- (bfd *, void *, unsigned long size); +- #define bfd_read_minisymbols(b, d, m, s) \ +- BFD_SEND (b, _read_minisymbols, (b, d, m, s)) +- long (*_read_minisymbols) +- (bfd *, bfd_boolean, void **, 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) +- (bfd *, bfd_boolean, const void *, asymbol *); +- +- /* Routines for relocs. */ +- #define BFD_JUMP_TABLE_RELOCS(NAME) \ +- NAME##_get_reloc_upper_bound, \ +- NAME##_canonicalize_reloc, \ +- NAME##_bfd_reloc_type_lookup, \ +- NAME##_bfd_reloc_name_lookup +- +- long (*_get_reloc_upper_bound) (bfd *, sec_ptr); +- long (*_bfd_canonicalize_reloc) +- (bfd *, sec_ptr, arelent **, struct bfd_symbol **); +- /* See documentation on reloc types. */ +- reloc_howto_type * +- (*reloc_type_lookup) (bfd *, bfd_reloc_code_real_type); +- reloc_howto_type * +- (*reloc_name_lookup) (bfd *, const char *); +- +- +- /* Routines used when writing an object file. */ +- #define BFD_JUMP_TABLE_WRITE(NAME) \ +- NAME##_set_arch_mach, \ +- NAME##_set_section_contents +- +- bfd_boolean (*_bfd_set_arch_mach) +- (bfd *, enum bfd_architecture, unsigned long); +- bfd_boolean (*_bfd_set_section_contents) +- (bfd *, sec_ptr, const void *, file_ptr, bfd_size_type); +- +- /* Routines used by the linker. */ +- #define BFD_JUMP_TABLE_LINK(NAME) \ +- NAME##_sizeof_headers, \ +- NAME##_bfd_get_relocated_section_contents, \ +- NAME##_bfd_relax_section, \ +- NAME##_bfd_link_hash_table_create, \ +- NAME##_bfd_link_hash_table_free, \ +- NAME##_bfd_link_add_symbols, \ +- NAME##_bfd_link_just_syms, \ +- NAME##_bfd_copy_link_hash_symbol_type, \ +- NAME##_bfd_final_link, \ +- NAME##_bfd_link_split_section, \ +- NAME##_bfd_gc_sections, \ +- NAME##_bfd_lookup_section_flags, \ +- NAME##_bfd_merge_sections, \ +- NAME##_bfd_is_group_section, \ +- NAME##_bfd_discard_group, \ +- NAME##_section_already_linked, \ +- NAME##_bfd_define_common_symbol +- +- int (*_bfd_sizeof_headers) (bfd *, struct bfd_link_info *); +- bfd_byte * (*_bfd_get_relocated_section_contents) +- (bfd *, struct bfd_link_info *, struct bfd_link_order *, +- bfd_byte *, bfd_boolean, struct bfd_symbol **); +- +- bfd_boolean (*_bfd_relax_section) +- (bfd *, struct bfd_section *, struct bfd_link_info *, bfd_boolean *); +- +- /* 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) (bfd *); +- +- /* Release the memory associated with the linker hash table. */ +- void (*_bfd_link_hash_table_free) (struct bfd_link_hash_table *); +- +- /* Add symbols from this object file into the hash table. */ +- bfd_boolean (*_bfd_link_add_symbols) (bfd *, struct bfd_link_info *); +- +- /* Indicate that we are only retrieving symbol values from this section. */ +- void (*_bfd_link_just_syms) (asection *, struct bfd_link_info *); +- +- /* Copy the symbol type of a linker hash table entry. */ +- #define bfd_copy_link_hash_symbol_type(b, t, f) \ +- BFD_SEND (b, _bfd_copy_link_hash_symbol_type, (b, t, f)) +- void (*_bfd_copy_link_hash_symbol_type) +- (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); +- +- /* Do a link based on the link_order structures attached to each +- section of the BFD. */ +- bfd_boolean (*_bfd_final_link) (bfd *, struct bfd_link_info *); +- +- /* Should this section be split up into smaller pieces during linking. */ +- bfd_boolean (*_bfd_link_split_section) (bfd *, struct bfd_section *); +- +- /* Remove sections that are not referenced from the output. */ +- bfd_boolean (*_bfd_gc_sections) (bfd *, struct bfd_link_info *); +- +- /* Sets the bitmask of allowed and disallowed section flags. */ +- bfd_boolean (*_bfd_lookup_section_flags) (struct bfd_link_info *, +- struct flag_info *, +- asection *); +- +- /* Attempt to merge SEC_MERGE sections. */ +- bfd_boolean (*_bfd_merge_sections) (bfd *, struct bfd_link_info *); +- +- /* Is this section a member of a group? */ +- bfd_boolean (*_bfd_is_group_section) (bfd *, const struct bfd_section *); +- +- /* Discard members of a group. */ +- bfd_boolean (*_bfd_discard_group) (bfd *, struct bfd_section *); +- +- /* Check if SEC has been already linked during a reloceatable or +- final link. */ +- bfd_boolean (*_section_already_linked) (bfd *, asection *, +- struct bfd_link_info *); +- +- /* Define a common symbol. */ +- bfd_boolean (*_bfd_define_common_symbol) (bfd *, struct bfd_link_info *, +- struct bfd_link_hash_entry *); +- +- /* Routines to handle dynamic symbols and relocs. */ +- #define BFD_JUMP_TABLE_DYNAMIC(NAME) \ +- NAME##_get_dynamic_symtab_upper_bound, \ +- NAME##_canonicalize_dynamic_symtab, \ +- NAME##_get_synthetic_symtab, \ +- NAME##_get_dynamic_reloc_upper_bound, \ +- NAME##_canonicalize_dynamic_reloc +- +- /* Get the amount of memory required to hold the dynamic symbols. */ +- long (*_bfd_get_dynamic_symtab_upper_bound) (bfd *); +- /* Read in the dynamic symbols. */ +- long (*_bfd_canonicalize_dynamic_symtab) +- (bfd *, struct bfd_symbol **); +- /* Create synthetized symbols. */ +- long (*_bfd_get_synthetic_symtab) +- (bfd *, long, struct bfd_symbol **, long, struct bfd_symbol **, +- struct bfd_symbol **); +- /* Get the amount of memory required to hold the dynamic relocs. */ +- long (*_bfd_get_dynamic_reloc_upper_bound) (bfd *); +- /* Read in the dynamic relocs. */ +- long (*_bfd_canonicalize_dynamic_reloc) +- (bfd *, arelent **, struct bfd_symbol **); +- A pointer to an alternative bfd_target in case the current one is not +-satisfactory. This can happen when the target cpu supports both big +-and little endian code, and target chosen by the linker has the wrong +-endianness. The function open_output() in ld/ldlang.c uses this field +-to find an alternative output format that is suitable. +- /* Opposite endian version of this target. */ +- const struct bfd_target * alternative_target; +- +- /* Data for use by back-end routines, which isn't +- generic enough to belong in this structure. */ +- const void *backend_data; +- +- } bfd_target; +- +-2.12.1.1 `bfd_set_default_target' +-................................. +- +-*Synopsis* +- bfd_boolean bfd_set_default_target (const char *name); +- *Description* +-Set the default target vector to use when recognizing a BFD. This +-takes the name of the target, which may be a BFD target name or a +-configuration triplet. +- +-2.12.1.2 `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 +-TARGET_NAME. If 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 if ABFD isn't `NULL'. This +-causes `bfd_check_format' to loop over all the targets to find the one +-that matches the file being read. +- +-2.12.1.3 `bfd_get_target_info' +-.............................. +- +-*Synopsis* +- const bfd_target *bfd_get_target_info (const char *target_name, +- bfd *abfd, +- bfd_boolean *is_bigendian, +- int *underscoring, +- const char **def_target_arch); +- *Description* +-Return a pointer to the transfer vector for the object target named +-TARGET_NAME. If 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 if ABFD isn't `NULL'. This +-causes `bfd_check_format' to loop over all the targets to find the one +-that matches the file being read. If IS_BIGENDIAN is not `NULL', then +-set this value to target's endian mode. True for big-endian, FALSE for +-little-endian or for invalid target. If UNDERSCORING is not `NULL', +-then set this value to target's underscoring mode. Zero for +-none-underscoring, -1 for invalid target, else the value of target +-vector's symbol underscoring. If DEF_TARGET_ARCH is not `NULL', then +-set it to the architecture string specified by the target_name. +- +-2.12.1.4 `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. +- +-2.12.1.5 `bfd_seach_for_target' +-............................... +- +-*Synopsis* +- const bfd_target *bfd_search_for_target +- (int (*search_func) (const bfd_target *, void *), +- void *); +- *Description* +-Return a pointer to the first transfer vector in the list of transfer +-vectors maintained by BFD that produces a non-zero result when passed +-to the function SEARCH_FUNC. The parameter DATA is passed, unexamined, +-to the search function. +- +- +-File: bfd.info, Node: Architectures, Next: Opening and Closing, Prev: Targets, Up: BFD front end +- +-2.13 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 +-`config/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 `archures.c'. +- +-2.13.1 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 */ +- #define bfd_mach_m68000 1 +- #define bfd_mach_m68008 2 +- #define bfd_mach_m68010 3 +- #define bfd_mach_m68020 4 +- #define bfd_mach_m68030 5 +- #define bfd_mach_m68040 6 +- #define bfd_mach_m68060 7 +- #define bfd_mach_cpu32 8 +- #define bfd_mach_fido 9 +- #define bfd_mach_mcf_isa_a_nodiv 10 +- #define bfd_mach_mcf_isa_a 11 +- #define bfd_mach_mcf_isa_a_mac 12 +- #define bfd_mach_mcf_isa_a_emac 13 +- #define bfd_mach_mcf_isa_aplus 14 +- #define bfd_mach_mcf_isa_aplus_mac 15 +- #define bfd_mach_mcf_isa_aplus_emac 16 +- #define bfd_mach_mcf_isa_b_nousp 17 +- #define bfd_mach_mcf_isa_b_nousp_mac 18 +- #define bfd_mach_mcf_isa_b_nousp_emac 19 +- #define bfd_mach_mcf_isa_b 20 +- #define bfd_mach_mcf_isa_b_mac 21 +- #define bfd_mach_mcf_isa_b_emac 22 +- #define bfd_mach_mcf_isa_b_float 23 +- #define bfd_mach_mcf_isa_b_float_mac 24 +- #define bfd_mach_mcf_isa_b_float_emac 25 +- #define bfd_mach_mcf_isa_c 26 +- #define bfd_mach_mcf_isa_c_mac 27 +- #define bfd_mach_mcf_isa_c_emac 28 +- #define bfd_mach_mcf_isa_c_nodiv 29 +- #define bfd_mach_mcf_isa_c_nodiv_mac 30 +- #define bfd_mach_mcf_isa_c_nodiv_emac 31 +- 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_or32, /* OpenRISC 32 */ +- +- 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_sparclet 2 +- #define bfd_mach_sparc_sparclite 3 +- #define bfd_mach_sparc_v8plus 4 +- #define bfd_mach_sparc_v8plusa 5 /* with ultrasparc add'ns. */ +- #define bfd_mach_sparc_sparclite_le 6 +- #define bfd_mach_sparc_v9 7 +- #define bfd_mach_sparc_v9a 8 /* with ultrasparc add'ns. */ +- #define bfd_mach_sparc_v8plusb 9 /* with cheetah add'ns. */ +- #define bfd_mach_sparc_v9b 10 /* with cheetah add'ns. */ +- /* Nonzero if MACH has the v9 instruction set. */ +- #define bfd_mach_sparc_v9_p(mach) \ +- ((mach) >= bfd_mach_sparc_v8plus && (mach) <= bfd_mach_sparc_v9b \ +- && (mach) != bfd_mach_sparc_sparclite_le) +- /* Nonzero if MACH is a 64 bit sparc architecture. */ +- #define bfd_mach_sparc_64bit_p(mach) \ +- ((mach) >= bfd_mach_sparc_v9 && (mach) != bfd_mach_sparc_v8plusb) +- bfd_arch_spu, /* PowerPC SPU */ +- #define bfd_mach_spu 256 +- bfd_arch_mips, /* MIPS Rxxxx */ +- #define bfd_mach_mips3000 3000 +- #define bfd_mach_mips3900 3900 +- #define bfd_mach_mips4000 4000 +- #define bfd_mach_mips4010 4010 +- #define bfd_mach_mips4100 4100 +- #define bfd_mach_mips4111 4111 +- #define bfd_mach_mips4120 4120 +- #define bfd_mach_mips4300 4300 +- #define bfd_mach_mips4400 4400 +- #define bfd_mach_mips4600 4600 +- #define bfd_mach_mips4650 4650 +- #define bfd_mach_mips5000 5000 +- #define bfd_mach_mips5400 5400 +- #define bfd_mach_mips5500 5500 +- #define bfd_mach_mips5900 5900 +- #define bfd_mach_mips6000 6000 +- #define bfd_mach_mips7000 7000 +- #define bfd_mach_mips8000 8000 +- #define bfd_mach_mips9000 9000 +- #define bfd_mach_mips10000 10000 +- #define bfd_mach_mips12000 12000 +- #define bfd_mach_mips14000 14000 +- #define bfd_mach_mips16000 16000 +- #define bfd_mach_mips16 16 +- #define bfd_mach_mips5 5 +- #define bfd_mach_mips_loongson_2e 3001 +- #define bfd_mach_mips_loongson_2f 3002 +- #define bfd_mach_mips_loongson_3a 3003 +- #define bfd_mach_mips_sb1 12310201 /* octal 'SB', 01 */ +- #define bfd_mach_mips_octeon 6501 +- #define bfd_mach_mips_octeonp 6601 +- #define bfd_mach_mips_octeon2 6502 +- #define bfd_mach_mips_xlr 887682 /* decimal 'XLR' */ +- #define bfd_mach_mipsisa32 32 +- #define bfd_mach_mipsisa32r2 33 +- #define bfd_mach_mipsisa64 64 +- #define bfd_mach_mipsisa64r2 65 +- #define bfd_mach_mips_micromips 96 +- bfd_arch_i386, /* Intel 386 */ +- #define bfd_mach_i386_intel_syntax (1 << 0) +- #define bfd_mach_i386_i8086 (1 << 1) +- #define bfd_mach_i386_i386 (1 << 2) +- #define bfd_mach_x86_64 (1 << 3) +- #define bfd_mach_x64_32 (1 << 4) +- #define bfd_mach_i386_i386_intel_syntax (bfd_mach_i386_i386 | bfd_mach_i386_intel_syntax) +- #define bfd_mach_x86_64_intel_syntax (bfd_mach_x86_64 | bfd_mach_i386_intel_syntax) +- #define bfd_mach_x64_32_intel_syntax (bfd_mach_x64_32 | bfd_mach_i386_intel_syntax) +- bfd_arch_l1om, /* Intel L1OM */ +- #define bfd_mach_l1om (1 << 5) +- #define bfd_mach_l1om_intel_syntax (bfd_mach_l1om | bfd_mach_i386_intel_syntax) +- bfd_arch_k1om, /* Intel K1OM */ +- #define bfd_mach_k1om (1 << 6) +- #define bfd_mach_k1om_intel_syntax (bfd_mach_k1om | bfd_mach_i386_intel_syntax) +- #define bfd_mach_i386_nacl (1 << 7) +- #define bfd_mach_i386_i386_nacl (bfd_mach_i386_i386 | bfd_mach_i386_nacl) +- #define bfd_mach_x86_64_nacl (bfd_mach_x86_64 | bfd_mach_i386_nacl) +- #define bfd_mach_x64_32_nacl (bfd_mach_x64_32 | bfd_mach_i386_nacl) +- bfd_arch_we32k, /* AT&T WE32xxx */ +- bfd_arch_tahoe, /* CCI/Harris Tahoe */ +- bfd_arch_i860, /* Intel 860 */ +- bfd_arch_i370, /* IBM 360/370 Mainframes */ +- bfd_arch_romp, /* IBM ROMP PC/RT */ +- bfd_arch_convex, /* Convex */ +- bfd_arch_m88k, /* Motorola 88xxx */ +- bfd_arch_m98k, /* Motorola 98xxx */ +- bfd_arch_pyramid, /* Pyramid Technology */ +- bfd_arch_h8300, /* Renesas H8/300 (formerly Hitachi H8/300) */ +- #define bfd_mach_h8300 1 +- #define bfd_mach_h8300h 2 +- #define bfd_mach_h8300s 3 +- #define bfd_mach_h8300hn 4 +- #define bfd_mach_h8300sn 5 +- #define bfd_mach_h8300sx 6 +- #define bfd_mach_h8300sxn 7 +- bfd_arch_pdp11, /* DEC PDP-11 */ +- bfd_arch_plugin, +- bfd_arch_powerpc, /* PowerPC */ +- #define bfd_mach_ppc 32 +- #define bfd_mach_ppc64 64 +- #define bfd_mach_ppc_403 403 +- #define bfd_mach_ppc_403gc 4030 +- #define bfd_mach_ppc_405 405 +- #define bfd_mach_ppc_505 505 +- #define bfd_mach_ppc_601 601 +- #define bfd_mach_ppc_602 602 +- #define bfd_mach_ppc_603 603 +- #define bfd_mach_ppc_ec603e 6031 +- #define bfd_mach_ppc_604 604 +- #define bfd_mach_ppc_620 620 +- #define bfd_mach_ppc_630 630 +- #define bfd_mach_ppc_750 750 +- #define bfd_mach_ppc_860 860 +- #define bfd_mach_ppc_a35 35 +- #define bfd_mach_ppc_rs64ii 642 +- #define bfd_mach_ppc_rs64iii 643 +- #define bfd_mach_ppc_7400 7400 +- #define bfd_mach_ppc_e500 500 +- #define bfd_mach_ppc_e500mc 5001 +- #define bfd_mach_ppc_e500mc64 5005 +- #define bfd_mach_ppc_e5500 5006 +- #define bfd_mach_ppc_e6500 5007 +- #define bfd_mach_ppc_titan 83 +- #define bfd_mach_ppc_vle 84 +- bfd_arch_rs6000, /* IBM RS/6000 */ +- #define bfd_mach_rs6k 6000 +- #define bfd_mach_rs6k_rs1 6001 +- #define bfd_mach_rs6k_rsc 6003 +- #define bfd_mach_rs6k_rs2 6002 +- bfd_arch_hppa, /* HP PA RISC */ +- #define bfd_mach_hppa10 10 +- #define bfd_mach_hppa11 11 +- #define bfd_mach_hppa20 20 +- #define bfd_mach_hppa20w 25 +- bfd_arch_d10v, /* Mitsubishi D10V */ +- #define bfd_mach_d10v 1 +- #define bfd_mach_d10v_ts2 2 +- #define bfd_mach_d10v_ts3 3 +- bfd_arch_d30v, /* Mitsubishi D30V */ +- bfd_arch_dlx, /* DLX */ +- bfd_arch_m68hc11, /* Motorola 68HC11 */ +- bfd_arch_m68hc12, /* Motorola 68HC12 */ +- #define bfd_mach_m6812_default 0 +- #define bfd_mach_m6812 1 +- #define bfd_mach_m6812s 2 +- bfd_arch_m9s12x, /* Freescale S12X */ +- bfd_arch_m9s12xg, /* Freescale XGATE */ +- bfd_arch_z8k, /* Zilog Z8000 */ +- #define bfd_mach_z8001 1 +- #define bfd_mach_z8002 2 +- bfd_arch_h8500, /* Renesas H8/500 (formerly Hitachi H8/500) */ +- bfd_arch_sh, /* Renesas / SuperH SH (formerly Hitachi SH) */ +- #define bfd_mach_sh 1 +- #define bfd_mach_sh2 0x20 +- #define bfd_mach_sh_dsp 0x2d +- #define bfd_mach_sh2a 0x2a +- #define bfd_mach_sh2a_nofpu 0x2b +- #define bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu 0x2a1 +- #define bfd_mach_sh2a_nofpu_or_sh3_nommu 0x2a2 +- #define bfd_mach_sh2a_or_sh4 0x2a3 +- #define bfd_mach_sh2a_or_sh3e 0x2a4 +- #define bfd_mach_sh2e 0x2e +- #define bfd_mach_sh3 0x30 +- #define bfd_mach_sh3_nommu 0x31 +- #define bfd_mach_sh3_dsp 0x3d +- #define bfd_mach_sh3e 0x3e +- #define bfd_mach_sh4 0x40 +- #define bfd_mach_sh4_nofpu 0x41 +- #define bfd_mach_sh4_nommu_nofpu 0x42 +- #define bfd_mach_sh4a 0x4a +- #define bfd_mach_sh4a_nofpu 0x4b +- #define bfd_mach_sh4al_dsp 0x4d +- #define bfd_mach_sh5 0x50 +- bfd_arch_alpha, /* Dec Alpha */ +- #define bfd_mach_alpha_ev4 0x10 +- #define bfd_mach_alpha_ev5 0x20 +- #define bfd_mach_alpha_ev6 0x30 +- bfd_arch_arm, /* Advanced Risc Machines ARM. */ +- #define bfd_mach_arm_unknown 0 +- #define bfd_mach_arm_2 1 +- #define bfd_mach_arm_2a 2 +- #define bfd_mach_arm_3 3 +- #define bfd_mach_arm_3M 4 +- #define bfd_mach_arm_4 5 +- #define bfd_mach_arm_4T 6 +- #define bfd_mach_arm_5 7 +- #define bfd_mach_arm_5T 8 +- #define bfd_mach_arm_5TE 9 +- #define bfd_mach_arm_XScale 10 +- #define bfd_mach_arm_ep9312 11 +- #define bfd_mach_arm_iWMMXt 12 +- #define bfd_mach_arm_iWMMXt2 13 +- bfd_arch_ns32k, /* National Semiconductors ns32000 */ +- bfd_arch_w65, /* WDC 65816 */ +- bfd_arch_tic30, /* Texas Instruments TMS320C30 */ +- bfd_arch_tic4x, /* Texas Instruments TMS320C3X/4X */ +- #define bfd_mach_tic3x 30 +- #define bfd_mach_tic4x 40 +- bfd_arch_tic54x, /* Texas Instruments TMS320C54X */ +- bfd_arch_tic6x, /* Texas Instruments TMS320C6X */ +- bfd_arch_tic80, /* TI TMS320c80 (MVP) */ +- bfd_arch_v850, /* NEC V850 */ +- bfd_arch_v850_rh850,/* NEC V850 (using RH850 ABI) */ +- #define bfd_mach_v850 1 +- #define bfd_mach_v850e 'E' +- #define bfd_mach_v850e1 '1' +- #define bfd_mach_v850e2 0x4532 +- #define bfd_mach_v850e2v3 0x45325633 +- #define bfd_mach_v850e3v5 0x45335635 /* ('E'|'3'|'V'|'5') */ +- bfd_arch_arc, /* ARC Cores */ +- #define bfd_mach_arc_5 5 +- #define bfd_mach_arc_6 6 +- #define bfd_mach_arc_7 7 +- #define bfd_mach_arc_8 8 +- bfd_arch_m32c, /* Renesas M16C/M32C. */ +- #define bfd_mach_m16c 0x75 +- #define bfd_mach_m32c 0x78 +- bfd_arch_m32r, /* Renesas M32R (formerly Mitsubishi M32R/D) */ +- #define bfd_mach_m32r 1 /* For backwards compatibility. */ +- #define bfd_mach_m32rx 'x' +- #define bfd_mach_m32r2 '2' +- bfd_arch_mn10200, /* Matsushita MN10200 */ +- bfd_arch_mn10300, /* Matsushita MN10300 */ +- #define bfd_mach_mn10300 300 +- #define bfd_mach_am33 330 +- #define bfd_mach_am33_2 332 +- bfd_arch_fr30, +- #define bfd_mach_fr30 0x46523330 +- bfd_arch_frv, +- #define bfd_mach_frv 1 +- #define bfd_mach_frvsimple 2 +- #define bfd_mach_fr300 300 +- #define bfd_mach_fr400 400 +- #define bfd_mach_fr450 450 +- #define bfd_mach_frvtomcat 499 /* fr500 prototype */ +- #define bfd_mach_fr500 500 +- #define bfd_mach_fr550 550 +- bfd_arch_moxie, /* The moxie processor */ +- #define bfd_mach_moxie 1 +- bfd_arch_mcore, +- bfd_arch_mep, +- #define bfd_mach_mep 1 +- #define bfd_mach_mep_h1 0x6831 +- #define bfd_mach_mep_c5 0x6335 +- bfd_arch_metag, +- #define bfd_mach_metag 1 +- bfd_arch_ia64, /* HP/Intel ia64 */ +- #define bfd_mach_ia64_elf64 64 +- #define bfd_mach_ia64_elf32 32 +- bfd_arch_ip2k, /* Ubicom IP2K microcontrollers. */ +- #define bfd_mach_ip2022 1 +- #define bfd_mach_ip2022ext 2 +- bfd_arch_iq2000, /* Vitesse IQ2000. */ +- #define bfd_mach_iq2000 1 +- #define bfd_mach_iq10 2 +- bfd_arch_epiphany, /* Adapteva EPIPHANY */ +- #define bfd_mach_epiphany16 1 +- #define bfd_mach_epiphany32 2 +- bfd_arch_mt, +- #define bfd_mach_ms1 1 +- #define bfd_mach_mrisc2 2 +- #define bfd_mach_ms2 3 +- bfd_arch_pj, +- bfd_arch_avr, /* Atmel AVR microcontrollers. */ +- #define bfd_mach_avr1 1 +- #define bfd_mach_avr2 2 +- #define bfd_mach_avr25 25 +- #define bfd_mach_avr3 3 +- #define bfd_mach_avr31 31 +- #define bfd_mach_avr35 35 +- #define bfd_mach_avr4 4 +- #define bfd_mach_avr5 5 +- #define bfd_mach_avr51 51 +- #define bfd_mach_avr6 6 +- #define bfd_mach_avrxmega1 101 +- #define bfd_mach_avrxmega2 102 +- #define bfd_mach_avrxmega3 103 +- #define bfd_mach_avrxmega4 104 +- #define bfd_mach_avrxmega5 105 +- #define bfd_mach_avrxmega6 106 +- #define bfd_mach_avrxmega7 107 +- bfd_arch_bfin, /* ADI Blackfin */ +- #define bfd_mach_bfin 1 +- bfd_arch_cr16, /* National Semiconductor CompactRISC (ie CR16). */ +- #define bfd_mach_cr16 1 +- bfd_arch_cr16c, /* National Semiconductor CompactRISC. */ +- #define bfd_mach_cr16c 1 +- bfd_arch_crx, /* National Semiconductor CRX. */ +- #define bfd_mach_crx 1 +- bfd_arch_cris, /* Axis CRIS */ +- #define bfd_mach_cris_v0_v10 255 +- #define bfd_mach_cris_v32 32 +- #define bfd_mach_cris_v10_v32 1032 +- bfd_arch_rl78, +- #define bfd_mach_rl78 0x75 +- bfd_arch_rx, /* Renesas RX. */ +- #define bfd_mach_rx 0x75 +- bfd_arch_s390, /* IBM s390 */ +- #define bfd_mach_s390_31 31 +- #define bfd_mach_s390_64 64 +- bfd_arch_score, /* Sunplus score */ +- #define bfd_mach_score3 3 +- #define bfd_mach_score7 7 +- bfd_arch_openrisc, /* OpenRISC */ +- bfd_arch_mmix, /* Donald Knuth's educational processor. */ +- bfd_arch_xstormy16, +- #define bfd_mach_xstormy16 1 +- bfd_arch_msp430, /* Texas Instruments MSP430 architecture. */ +- #define bfd_mach_msp11 11 +- #define bfd_mach_msp110 110 +- #define bfd_mach_msp12 12 +- #define bfd_mach_msp13 13 +- #define bfd_mach_msp14 14 +- #define bfd_mach_msp15 15 +- #define bfd_mach_msp16 16 +- #define bfd_mach_msp20 20 +- #define bfd_mach_msp21 21 +- #define bfd_mach_msp22 22 +- #define bfd_mach_msp23 23 +- #define bfd_mach_msp24 24 +- #define bfd_mach_msp26 26 +- #define bfd_mach_msp31 31 +- #define bfd_mach_msp32 32 +- #define bfd_mach_msp33 33 +- #define bfd_mach_msp41 41 +- #define bfd_mach_msp42 42 +- #define bfd_mach_msp43 43 +- #define bfd_mach_msp44 44 +- #define bfd_mach_msp430x 45 +- #define bfd_mach_msp46 46 +- #define bfd_mach_msp47 47 +- #define bfd_mach_msp54 54 +- bfd_arch_xc16x, /* Infineon's XC16X Series. */ +- #define bfd_mach_xc16x 1 +- #define bfd_mach_xc16xl 2 +- #define bfd_mach_xc16xs 3 +- bfd_arch_xgate, /* Freescale XGATE */ +- #define bfd_mach_xgate 1 +- bfd_arch_xtensa, /* Tensilica's Xtensa cores. */ +- #define bfd_mach_xtensa 1 +- bfd_arch_z80, +- #define bfd_mach_z80strict 1 /* No undocumented opcodes. */ +- #define bfd_mach_z80 3 /* With ixl, ixh, iyl, and iyh. */ +- #define bfd_mach_z80full 7 /* All undocumented instructions. */ +- #define bfd_mach_r800 11 /* R800: successor with multiplication. */ +- bfd_arch_lm32, /* Lattice Mico32 */ +- #define bfd_mach_lm32 1 +- bfd_arch_microblaze,/* Xilinx MicroBlaze. */ +- bfd_arch_tilepro, /* Tilera TILEPro */ +- bfd_arch_tilegx, /* Tilera TILE-Gx */ +- #define bfd_mach_tilepro 1 +- #define bfd_mach_tilegx 1 +- #define bfd_mach_tilegx32 2 +- bfd_arch_aarch64, /* AArch64 */ +- #define bfd_mach_aarch64 0 +- #define bfd_mach_aarch64_ilp32 32 +- bfd_arch_nios2, +- #define bfd_mach_nios2 0 +- bfd_arch_last +- }; +- +-2.13.2 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. +- The default arch should be the first entry for an arch so that +- all the entries for that arch can be accessed via `next'. */ +- bfd_boolean the_default; +- const struct bfd_arch_info * (*compatible) +- (const struct bfd_arch_info *a, const struct bfd_arch_info *b); +- +- bfd_boolean (*scan) (const struct bfd_arch_info *, const char *); +- +- /* Allocate via bfd_malloc and return a fill buffer of size COUNT. If +- IS_BIGENDIAN is TRUE, the order of bytes is big endian. If CODE is +- TRUE, the buffer contains code. */ +- void *(*fill) (bfd_size_type count, bfd_boolean is_bigendian, +- bfd_boolean code); +- +- const struct bfd_arch_info *next; +- } +- bfd_arch_info_type; +- +-2.13.2.1 `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. +- +-2.13.2.2 `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 STRING. Return a pointer to an `arch_info' structure if a machine +-is found, otherwise NULL. +- +-2.13.2.3 `bfd_arch_list' +-........................ +- +-*Synopsis* +- const char **bfd_arch_list (void); +- *Description* +-Return a freshly malloced NULL-terminated vector of the names of all +-the valid BFD architectures. Do not modify the names. +- +-2.13.2.4 `bfd_arch_get_compatible' +-.................................. +- +-*Synopsis* +- const bfd_arch_info_type *bfd_arch_get_compatible +- (const bfd *abfd, const bfd *bbfd, bfd_boolean accept_unknowns); +- *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. +- +-2.13.2.5 `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; +- +-2.13.2.6 `bfd_set_arch_info' +-............................ +- +-*Synopsis* +- void bfd_set_arch_info (bfd *abfd, const bfd_arch_info_type *arg); +- *Description* +-Set the architecture info of ABFD to ARG. +- +-2.13.2.7 `bfd_default_set_arch_mach' +-.................................... +- +-*Synopsis* +- bfd_boolean bfd_default_set_arch_mach +- (bfd *abfd, enum bfd_architecture arch, unsigned long mach); +- *Description* +-Set the architecture and machine type in BFD ABFD to ARCH and MACH. +-Find the correct pointer to a structure and insert it into the +-`arch_info' pointer. +- +-2.13.2.8 `bfd_get_arch' +-....................... +- +-*Synopsis* +- enum bfd_architecture bfd_get_arch (bfd *abfd); +- *Description* +-Return the enumerated type which describes the BFD ABFD's architecture. +- +-2.13.2.9 `bfd_get_mach' +-....................... +- +-*Synopsis* +- unsigned long bfd_get_mach (bfd *abfd); +- *Description* +-Return the long type which describes the BFD ABFD's machine. +- +-2.13.2.10 `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 ABFD's architecture's bytes. +- +-2.13.2.11 `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 ABFD's architecture's +-addresses. +- +-2.13.2.12 `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. +- +-2.13.2.13 `bfd_default_scan' +-............................ +- +-*Synopsis* +- bfd_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. +- +-2.13.2.14 `bfd_get_arch_info' +-............................. +- +-*Synopsis* +- const bfd_arch_info_type *bfd_get_arch_info (bfd *abfd); +- *Description* +-Return the architecture info struct in ABFD. +- +-2.13.2.15 `bfd_lookup_arch' +-........................... +- +-*Synopsis* +- const bfd_arch_info_type *bfd_lookup_arch +- (enum bfd_architecture arch, unsigned long machine); +- *Description* +-Look for the architecture info structure which matches the arguments +-ARCH and MACHINE. A machine of 0 matches the machine/architecture +-structure which marks itself as the default. +- +-2.13.2.16 `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. +- +-2.13.2.17 `bfd_octets_per_byte' +-............................... +- +-*Synopsis* +- unsigned int bfd_octets_per_byte (bfd *abfd); +- *Description* +-Return the number of octets (8-bit quantities) per target byte (minimum +-addressable unit). In most cases, this will be one, but some DSP +-targets have 16, 32, or even 48 bits per byte. +- +-2.13.2.18 `bfd_arch_mach_octets_per_byte' +-......................................... +- +-*Synopsis* +- unsigned int bfd_arch_mach_octets_per_byte +- (enum bfd_architecture arch, unsigned long machine); +- *Description* +-See bfd_octets_per_byte. +- +- This routine is provided for those cases where a bfd * is not +-available +- +-2.13.2.19 `bfd_arch_default_fill' +-................................. +- +-*Synopsis* +- void *bfd_arch_default_fill (bfd_size_type count, +- bfd_boolean is_bigendian, +- bfd_boolean code); +- *Description* +-Allocate via bfd_malloc and return a fill buffer of size COUNT. If +-IS_BIGENDIAN is TRUE, the order of bytes is big endian. If CODE is +-TRUE, the buffer contains code. +- +- +-File: bfd.info, Node: Opening and Closing, Next: Internal, Prev: Architectures, Up: BFD front end +- +- /* Set to N to open the next N BFDs using an alternate id space. */ +- extern unsigned int bfd_use_reserved_id; +- +-2.14 Opening and closing BFDs +-============================= +- +-2.14.1 Functions for opening and closing +----------------------------------------- +- +-2.14.1.1 `bfd_fopen' +-.................... +- +-*Synopsis* +- bfd *bfd_fopen (const char *filename, const char *target, +- const char *mode, int fd); +- *Description* +-Open the file FILENAME with the target TARGET. Return a pointer to the +-created BFD. If FD is not -1, then `fdopen' is used to open the file; +-otherwise, `fopen' is used. MODE is passed directly to `fopen' or +-`fdopen'. +- +- Calls `bfd_find_target', so TARGET is interpreted as by that +-function. +- +- The new BFD is marked as cacheable iff FD is -1. +- +- If `NULL' is returned then an error has occured. Possible errors +-are `bfd_error_no_memory', `bfd_error_invalid_target' or `system_call' +-error. +- +- On error, FD is always closed. +- +-2.14.1.2 `bfd_openr' +-.................... +- +-*Synopsis* +- bfd *bfd_openr (const char *filename, const char *target); +- *Description* +-Open the file FILENAME (using `fopen') with the target TARGET. Return +-a pointer to the created BFD. +- +- Calls `bfd_find_target', so 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. +- +-2.14.1.3 `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 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 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 caching; 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'. +- +- On error, FD is closed. +- +-2.14.1.4 `bfd_openstreamr' +-.......................... +- +-*Synopsis* +- bfd *bfd_openstreamr (const char *, const char *, void *); +- *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. +- +-2.14.1.5 `bfd_openr_iovec' +-.......................... +- +-*Synopsis* +- bfd *bfd_openr_iovec (const char *filename, const char *target, +- void *(*open_func) (struct bfd *nbfd, +- void *open_closure), +- void *open_closure, +- file_ptr (*pread_func) (struct bfd *nbfd, +- void *stream, +- void *buf, +- file_ptr nbytes, +- file_ptr offset), +- int (*close_func) (struct bfd *nbfd, +- void *stream), +- int (*stat_func) (struct bfd *abfd, +- void *stream, +- struct stat *sb)); +- *Description* +-Create and return a BFD backed by a read-only STREAM. The STREAM is +-created using OPEN_FUNC, accessed using PREAD_FUNC and destroyed using +-CLOSE_FUNC. +- +- Calls `bfd_find_target', so TARGET is interpreted as by that +-function. +- +- Calls OPEN_FUNC (which can call `bfd_zalloc' and `bfd_get_filename') +-to obtain the read-only stream backing the BFD. OPEN_FUNC either +-succeeds returning the non-`NULL' STREAM, or fails returning `NULL' +-(setting `bfd_error'). +- +- Calls PREAD_FUNC to request NBYTES of data from STREAM starting at +-OFFSET (e.g., via a call to `bfd_read'). PREAD_FUNC either succeeds +-returning the number of bytes read (which can be less than NBYTES when +-end-of-file), or fails returning -1 (setting `bfd_error'). +- +- Calls CLOSE_FUNC when the BFD is later closed using `bfd_close'. +-CLOSE_FUNC either succeeds returning 0, or fails returning -1 (setting +-`bfd_error'). +- +- Calls STAT_FUNC to fill in a stat structure for bfd_stat, +-bfd_get_size, and bfd_get_mtime calls. STAT_FUNC returns 0 on success, +-or returns -1 on failure (setting `bfd_error'). +- +- If `bfd_openr_iovec' returns `NULL' then an error has occurred. +-Possible errors are `bfd_error_no_memory', `bfd_error_invalid_target' +-and `bfd_error_system_call'. +- +-2.14.1.6 `bfd_openw' +-.................... +- +-*Synopsis* +- bfd *bfd_openw (const char *filename, const char *target); +- *Description* +-Create a BFD, associated with file FILENAME, using the file format +-TARGET, and return a pointer to it. +- +- Possible errors are `bfd_error_system_call', `bfd_error_no_memory', +-`bfd_error_invalid_target'. +- +-2.14.1.7 `bfd_close' +-.................... +- +-*Synopsis* +- bfd_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 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'. +- +-2.14.1.8 `bfd_close_all_done' +-............................. +- +-*Synopsis* +- bfd_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 is released. +- +- *Returns* +-`TRUE' is returned if all is ok, otherwise `FALSE'. +- +-2.14.1.9 `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 TEMPL. The +-format is always set to `bfd_object'. +- +-2.14.1.10 `bfd_make_writable' +-............................. +- +-*Synopsis* +- bfd_boolean bfd_make_writable (bfd *abfd); +- *Description* +-Takes a BFD as created by `bfd_create' and converts it into one like as +-returned by `bfd_openw'. It does this by converting the BFD to +-BFD_IN_MEMORY. It's assumed that you will call `bfd_make_readable' on +-this bfd later. +- +- *Returns* +-`TRUE' is returned if all is ok, otherwise `FALSE'. +- +-2.14.1.11 `bfd_make_readable' +-............................. +- +-*Synopsis* +- bfd_boolean bfd_make_readable (bfd *abfd); +- *Description* +-Takes a BFD as created by `bfd_create' and `bfd_make_writable' and +-converts it into one like as returned by `bfd_openr'. It does this by +-writing the contents out to the memory buffer, then reversing the +-direction. +- +- *Returns* +-`TRUE' is returned if all is ok, otherwise `FALSE'. +- +-2.14.1.12 `bfd_alloc' +-..................... +- +-*Synopsis* +- void *bfd_alloc (bfd *abfd, bfd_size_type wanted); +- *Description* +-Allocate a block of WANTED bytes of memory attached to `abfd' and +-return a pointer to it. +- +-2.14.1.13 `bfd_alloc2' +-...................... +- +-*Synopsis* +- void *bfd_alloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size); +- *Description* +-Allocate a block of NMEMB elements of SIZE bytes each of memory +-attached to `abfd' and return a pointer to it. +- +-2.14.1.14 `bfd_zalloc' +-...................... +- +-*Synopsis* +- void *bfd_zalloc (bfd *abfd, bfd_size_type wanted); +- *Description* +-Allocate a block of WANTED bytes of zeroed memory attached to `abfd' +-and return a pointer to it. +- +-2.14.1.15 `bfd_zalloc2' +-....................... +- +-*Synopsis* +- void *bfd_zalloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size); +- *Description* +-Allocate a block of NMEMB elements of SIZE bytes each of zeroed memory +-attached to `abfd' and return a pointer to it. +- +-2.14.1.16 `bfd_calc_gnu_debuglink_crc32' +-........................................ +- +-*Synopsis* +- unsigned long bfd_calc_gnu_debuglink_crc32 +- (unsigned long crc, const unsigned char *buf, bfd_size_type len); +- *Description* +-Computes a CRC value as used in the .gnu_debuglink section. Advances +-the previously computed CRC value by computing and adding in the crc32 +-for LEN bytes of BUF. +- +- *Returns* +-Return the updated CRC32 value. +- +-2.14.1.17 `bfd_get_debug_link_info' +-................................... +- +-*Synopsis* +- char *bfd_get_debug_link_info (bfd *abfd, unsigned long *crc32_out); +- *Description* +-fetch the filename and CRC32 value for any separate debuginfo +-associated with ABFD. Return NULL if no such info found, otherwise +-return filename and update CRC32_OUT. The returned filename is +-allocated with `malloc'; freeing it is the responsibility of the caller. +- +-2.14.1.18 `bfd_get_alt_debug_link_info' +-....................................... +- +-*Synopsis* +- char *bfd_get_alt_debug_link_info (bfd *abfd, unsigned long *crc32_out); +- *Description* +-Fetch the filename and BuildID value for any alternate debuginfo +-associated with ABFD. Return NULL if no such info found, otherwise +-return filename and update BUILDID_OUT. The returned filename is +-allocated with `malloc'; freeing it is the responsibility of the caller. +- +-2.14.1.19 `separate_debug_file_exists' +-...................................... +- +-*Synopsis* +- bfd_boolean separate_debug_file_exists +- (char *name, unsigned long crc32); +- *Description* +-Checks to see if NAME is a file and if its contents match CRC32. +- +-2.14.1.20 `separate_alt_debug_file_exists' +-.......................................... +- +-*Synopsis* +- bfd_boolean separate_alt_debug_file_exists +- (char *name, unsigned long crc32); +- *Description* +-Checks to see if NAME is a file and if its BuildID matches BUILDID. +- +-2.14.1.21 `find_separate_debug_file' +-.................................... +- +-*Synopsis* +- char *find_separate_debug_file (bfd *abfd); +- *Description* +-Searches ABFD for a section called SECTION_NAME which is expected to +-contain a reference to a file containing separate debugging +-information. The function scans various locations in the filesystem, +-including the file tree rooted at DEBUG_FILE_DIRECTORY, and returns the +-first matching filename that it finds. If CHECK_CRC is TRUE then the +-contents of the file must also match the CRC value contained in +-SECTION_NAME. Returns NULL if no valid file could be found. +- +-2.14.1.22 `bfd_follow_gnu_debuglink' +-.................................... +- +-*Synopsis* +- char *bfd_follow_gnu_debuglink (bfd *abfd, const char *dir); +- *Description* +-Takes a BFD and searches it for a .gnu_debuglink section. If this +-section is found, it examines the section for the name and checksum of +-a '.debug' file containing auxiliary debugging information. It then +-searches the filesystem for this .debug file in some standard +-locations, including the directory tree rooted at DIR, and if found +-returns the full filename. +- +- If DIR is NULL, it will search a default path configured into libbfd +-at build time. [XXX this feature is not currently implemented]. +- +- *Returns* +-`NULL' on any errors or failure to locate the .debug file, otherwise a +-pointer to a heap-allocated string containing the filename. The caller +-is responsible for freeing this string. +- +-2.14.1.23 `bfd_follow_gnu_debugaltlink' +-....................................... +- +-*Synopsis* +- char *bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir); +- *Description* +-Takes a BFD and searches it for a .gnu_debugaltlink section. If this +-section is found, it examines the section for the name of a file +-containing auxiliary debugging information. It then searches the +-filesystem for this file in a set of standard locations, including the +-directory tree rooted at DIR, and if found returns the full filename. +- +- If DIR is NULL, it will search a default path configured into libbfd +-at build time. [FIXME: This feature is not currently implemented]. +- +- *Returns* +-`NULL' on any errors or failure to locate the debug file, otherwise a +-pointer to a heap-allocated string containing the filename. The caller +-is responsible for freeing this string. +- +-2.14.1.24 `bfd_create_gnu_debuglink_section' +-............................................ +- +-*Synopsis* +- struct bfd_section *bfd_create_gnu_debuglink_section +- (bfd *abfd, const char *filename); +- *Description* +-Takes a BFD and adds a .gnu_debuglink section to it. The section is +-sized to be big enough to contain a link to the specified FILENAME. +- +- *Returns* +-A pointer to the new section is returned if all is ok. Otherwise +-`NULL' is returned and bfd_error is set. +- +-2.14.1.25 `bfd_fill_in_gnu_debuglink_section' +-............................................. +- +-*Synopsis* +- bfd_boolean bfd_fill_in_gnu_debuglink_section +- (bfd *abfd, struct bfd_section *sect, const char *filename); +- *Description* +-Takes a BFD and containing a .gnu_debuglink section SECT and fills in +-the contents of the section to contain a link to the specified +-FILENAME. The filename should be relative to the current directory. +- +- *Returns* +-`TRUE' is returned if all is ok. Otherwise `FALSE' is returned and +-bfd_error is set. +- +- +-File: bfd.info, Node: Internal, Next: File Caching, Prev: Opening and Closing, Up: BFD front end +- +-2.15 Implementation details +-=========================== +- +-2.15.1 Internal functions +-------------------------- +- +-*Description* +-These routines are used within BFD. They are not intended for export, +-but are documented here for completeness. +- +-2.15.1.1 `bfd_write_bigendian_4byte_int' +-........................................ +- +-*Synopsis* +- bfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int); +- *Description* +-Write a 4 byte integer I to the output BFD ABFD, in big endian order +-regardless of what else is going on. This is useful in archives. +- +-2.15.1.2 `bfd_put_size' +-....................... +- +-2.15.1.3 `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, `libaout.h' defines `GET_WORD' +-to either `bfd_get_32' or `bfd_get_64'. +- +- In the put routines, 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) \ +- ((void) (*((unsigned char *) (ptr)) = (val) & 0xff)) +- #define bfd_put_signed_8 \ +- bfd_put_8 +- #define bfd_get_8(abfd, ptr) \ +- (*(const unsigned char *) (ptr) & 0xff) +- #define bfd_get_signed_8(abfd, ptr) \ +- (((*(const unsigned char *) (ptr) & 0xff) ^ 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)) +- +- #define bfd_get(bits, abfd, ptr) \ +- ((bits) == 8 ? (bfd_vma) bfd_get_8 (abfd, ptr) \ +- : (bits) == 16 ? bfd_get_16 (abfd, ptr) \ +- : (bits) == 32 ? bfd_get_32 (abfd, ptr) \ +- : (bits) == 64 ? bfd_get_64 (abfd, ptr) \ +- : (abort (), (bfd_vma) - 1)) +- +- #define bfd_put(bits, abfd, val, ptr) \ +- ((bits) == 8 ? bfd_put_8 (abfd, val, ptr) \ +- : (bits) == 16 ? bfd_put_16 (abfd, val, ptr) \ +- : (bits) == 32 ? bfd_put_32 (abfd, val, ptr) \ +- : (bits) == 64 ? bfd_put_64 (abfd, val, ptr) \ +- : (abort (), (void) 0)) +- +-2.15.1.4 `bfd_h_put_size' +-......................... +- +-*Description* +-These macros have the same function as their `bfd_get_x' brethren, +-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)) +- +- /* Aliases for the above, which should eventually go away. */ +- +- #define H_PUT_64 bfd_h_put_64 +- #define H_PUT_32 bfd_h_put_32 +- #define H_PUT_16 bfd_h_put_16 +- #define H_PUT_8 bfd_h_put_8 +- #define H_PUT_S64 bfd_h_put_signed_64 +- #define H_PUT_S32 bfd_h_put_signed_32 +- #define H_PUT_S16 bfd_h_put_signed_16 +- #define H_PUT_S8 bfd_h_put_signed_8 +- #define H_GET_64 bfd_h_get_64 +- #define H_GET_32 bfd_h_get_32 +- #define H_GET_16 bfd_h_get_16 +- #define H_GET_8 bfd_h_get_8 +- #define H_GET_S64 bfd_h_get_signed_64 +- #define H_GET_S32 bfd_h_get_signed_32 +- #define H_GET_S16 bfd_h_get_signed_16 +- #define H_GET_S8 bfd_h_get_signed_8 +- +-2.15.1.5 `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 X of +-1025 returns 11. A X of 0 returns 0. +- +- +-File: bfd.info, Node: File Caching, Next: Linker Functions, Prev: Internal, Up: BFD front end +- +-2.16 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. +- +-2.16.1 Caching functions +------------------------- +- +-2.16.1.1 `bfd_cache_init' +-......................... +- +-*Synopsis* +- bfd_boolean bfd_cache_init (bfd *abfd); +- *Description* +-Add a newly opened BFD to the cache. +- +-2.16.1.2 `bfd_cache_close' +-.......................... +- +-*Synopsis* +- bfd_boolean bfd_cache_close (bfd *abfd); +- *Description* +-Remove the BFD 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. +- +-2.16.1.3 `bfd_cache_close_all' +-.............................. +- +-*Synopsis* +- bfd_boolean bfd_cache_close_all (void); +- *Description* +-Remove all BFDs from the cache. If the attached file is open, then +-close it too. +- +- *Returns* +-`FALSE' is returned if closing one of the file fails, `TRUE' is +-returned if all is well. +- +-2.16.1.4 `bfd_open_file' +-........................ +- +-*Synopsis* +- FILE* bfd_open_file (bfd *abfd); +- *Description* +-Call the OS to open a file for 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.info, Node: Linker Functions, Next: Hash Tables, Prev: File Caching, Up: BFD front end +- +-2.17 Linker Functions +-===================== +- +-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:: +- +- +-File: bfd.info, Node: Creating a Linker Hash Table, Next: Adding Symbols to the Hash Table, Prev: Linker Functions, Up: Linker Functions +- +-2.17.1 Creating a linker hash table +------------------------------------ +- +-The linker routines must create a hash table, which must be derived +-from `struct bfd_link_hash_table' described in `bfdlink.c'. *Note 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 relocatable 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. +- +- +-File: bfd.info, Node: Adding Symbols to the Hash Table, Next: Performing the Final Link, Prev: Creating a Linker Hash Table, Up: Linker Functions +- +-2.17.2 Adding symbols to the hash table +---------------------------------------- +- +-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:: +- +- +-File: bfd.info, Node: Differing file formats, Next: Adding symbols from an object file, Prev: Adding Symbols to the Hash Table, Up: Adding Symbols to the Hash Table +- +-2.17.2.1 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 output bfd xvec 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 +-output bfd before saving information (in this case, the ECOFF external +-symbol debugging information) in a hash table entry. +- +- +-File: bfd.info, Node: Adding symbols from an object file, Next: Adding symbols from an archive, Prev: Differing file formats, Up: Adding Symbols to the Hash Table +- +-2.17.2.2 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. +- +- `_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. +- +- +-File: bfd.info, Node: Adding symbols from an archive, Prev: Adding symbols from an object file, Up: Adding Symbols to the Hash Table +- +-2.17.2.3 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. +-(The callback may in fact indicate that a replacement BFD should be +-used, in which case the symbols from that BFD should be added to the +-linker hash table instead.) +- +- 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 element's 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. The +-`add_archive_element' callback has the option to indicate that it would +-like to replace the element archive with a substitute BFD, in which +-case it is the symbols of that substitute BFD that must be added to the +-linker hash table instead. +- +- 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 - possibly those of a +-substitute BFD, if the `add_archive_element' callback avails itself of +-that option. +- +- 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. +- +- +-File: bfd.info, Node: Performing the Final Link, Prev: Adding Symbols to the Hash Table, Up: Linker Functions +- +-2.17.3 Performing the 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 relocatable 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:: +- +- +-File: bfd.info, Node: Information provided by the linker, Next: Relocating the section contents, Prev: Performing the Final Link, Up: Performing the Final Link +- +-2.17.3.1 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 `map_head.link_order' 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 relocatable object file. +- +- +-File: bfd.info, Node: Relocating the section contents, Next: Writing the symbol table, Prev: Information provided by the linker, Up: Performing the Final Link +- +-2.17.3.2 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 relocatable link, the relocs themselves must also be +-modified and written out. +- +- 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'. +- +- +-File: bfd.info, Node: Writing the symbol table, Prev: Relocating the section contents, Up: Performing the Final Link +- +-2.17.3.3 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 is controlled by the +-`bfd_is_local_label_name' entry point. +- +- 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)'. +- +-2.17.3.4 `bfd_link_split_section' +-................................. +- +-*Synopsis* +- bfd_boolean bfd_link_split_section (bfd *abfd, asection *sec); +- *Description* +-Return nonzero if 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)) +- +-2.17.3.5 `bfd_section_already_linked' +-..................................... +- +-*Synopsis* +- bfd_boolean bfd_section_already_linked (bfd *abfd, +- asection *sec, +- struct bfd_link_info *info); +- *Description* +-Check if DATA has been already linked during a reloceatable or final +-link. Return TRUE if it has. +- #define bfd_section_already_linked(abfd, sec, info) \ +- BFD_SEND (abfd, _section_already_linked, (abfd, sec, info)) +- +-2.17.3.6 `bfd_generic_define_common_symbol' +-........................................... +- +-*Synopsis* +- bfd_boolean bfd_generic_define_common_symbol +- (bfd *output_bfd, struct bfd_link_info *info, +- struct bfd_link_hash_entry *h); +- *Description* +-Convert common symbol H into a defined symbol. Return TRUE on success +-and FALSE on failure. +- #define bfd_define_common_symbol(output_bfd, info, h) \ +- BFD_SEND (output_bfd, _bfd_define_common_symbol, (output_bfd, info, h)) +- +-2.17.3.7 `bfd_find_version_for_sym' +-................................... +- +-*Synopsis* +- struct bfd_elf_version_tree * bfd_find_version_for_sym +- (struct bfd_elf_version_tree *verdefs, +- const char *sym_name, bfd_boolean *hide); +- *Description* +-Search an elf version script tree for symbol versioning info and export +-/ don't-export status for a given symbol. Return non-NULL on success +-and NULL on failure; also sets the output `hide' boolean parameter. +- +-2.17.3.8 `bfd_hide_sym_by_version' +-.................................. +- +-*Synopsis* +- bfd_boolean bfd_hide_sym_by_version +- (struct bfd_elf_version_tree *verdefs, const char *sym_name); +- *Description* +-Search an elf version script tree for symbol versioning info for a +-given symbol. Return TRUE if the symbol is hidden. +- +- +-File: bfd.info, Node: Hash Tables, Prev: Linker Functions, Up: BFD front end +- +-2.18 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:: +- +- +-File: bfd.info, Node: Creating and Freeing a Hash Table, Next: Looking Up or Entering a String, Prev: Hash Tables, Up: Hash Tables +- +-2.18.1 Creating and freeing a hash table +----------------------------------------- +- +-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 SIZE argument, may be used). +-`bfd_hash_table_init' returns `FALSE' if some sort of error occurs. +- +- 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'. *Note Deriving a New Hash Table Type::, for why +-you would want to use a different value for this argument. +- +- `bfd_hash_table_init' will create an objalloc which will be used to +-allocate new entries. You may allocate memory on this objalloc using +-`bfd_hash_allocate'. +- +- 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. +- +- Use `bfd_hash_set_default_size' to set the default size of hash +-table to use. +- +- +-File: bfd.info, Node: Looking Up or Entering a String, Next: Traversing a Hash Table, Prev: Creating and Freeing a Hash Table, Up: Hash Tables +- +-2.18.2 Looking up or entering a string +--------------------------------------- +- +-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 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 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 CREATE argument is `TRUE', and a new entry is created, the +-COPY argument is used to decide whether to copy the string onto the +-hash table objalloc or not. If COPY is passed as `FALSE', you must be +-careful not to deallocate or modify the string as long as the hash table +-exists. +- +- +-File: bfd.info, Node: Traversing a Hash Table, Next: Deriving a New Hash Table Type, Prev: Looking Up or Entering a String, Up: Hash Tables +- +-2.18.3 Traversing a hash table +------------------------------- +- +-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. +- +- +-File: bfd.info, Node: Deriving a New Hash Table Type, Prev: Traversing a Hash Table, Up: Hash Tables +- +-2.18.4 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:: +- +- +-File: bfd.info, Node: Define the Derived Structures, Next: Write the Derived Creation Routine, Prev: Deriving a New Hash Table Type, Up: Deriving a New Hash Table Type +- +-2.18.4.1 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'. +- +- +-File: bfd.info, Node: Write the Derived Creation Routine, Next: Write Other Derived Routines, Prev: Define the Derived Structures, Up: Deriving a New Hash Table Type +- +-2.18.4.2 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. FUNCTION_NAME +-is the name of the routine. ENTRY_TYPE is the type of an entry in the +-hash table you are creating. BASE_NEWFUNC is the name of the creation +-routine of the hash table type your hash table is derived from. +- +- struct bfd_hash_entry * +- FUNCTION_NAME (struct bfd_hash_entry *entry, +- struct bfd_hash_table *table, +- const char *string) +- { +- struct ENTRY_TYPE *ret = (ENTRY_TYPE *) entry; +- +- /* Allocate the structure if it has not already been allocated by a +- derived class. */ +- if (ret == NULL) +- { +- ret = bfd_hash_allocate (table, sizeof (* ret)); +- if (ret == NULL) +- return NULL; +- } +- +- /* Call the allocation method of the base class. */ +- ret = ((ENTRY_TYPE *) +- 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. FUNCTION_NAME is +-`_bfd_link_hash_newfunc'. ENTRY_TYPE is `struct bfd_link_hash_entry'. +-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'. +- +- +-File: bfd.info, Node: Write Other Derived Routines, Prev: Write the Derived Creation Routine, Up: Deriving a New Hash Table Type +- +-2.18.4.3 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. +- +- +-File: bfd.info, Node: BFD back ends, Next: GNU Free Documentation License, Prev: BFD front end, Up: Top +- +-3 BFD back ends +-*************** +- +-* Menu: +- +-* What to Put Where:: +-* aout :: a.out backends +-* coff :: coff backends +-* elf :: elf backends +-* mmo :: mmo backend +- +- +-File: bfd.info, Node: What to Put Where, Next: aout, Prev: BFD back ends, Up: BFD back ends +- +-3.1 What to Put Where +-===================== +- +-All of BFD lives in one directory. +- +- +-File: bfd.info, Node: aout, Next: coff, Prev: What to Put Where, Up: BFD back ends +- +-3.2 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 `aoutx.h' and other +-files which derive functions from the base. One derivation file is +-`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 `sunos.c' for sun3 and sun4, `newsos3.c' for +-the Sony NEWS, and `demo64.c' for a demonstration of a 64 bit a.out +-format. +- +- The base 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 `aout32.c' and `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 `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 `sunos.c': +- +- #define TARGET_NAME "a.out-sunos-big" +- #define VECNAME sunos_big_vec +- #include "aoutf1.h" +- +- requires all the names from `aout32.c', and produces the jump vector +- +- sunos_big_vec +- +- The 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 `../include/sys/h-XXX.h' (for your host). These values, +-plus the structures and macros defined in `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 `host-aout.c', specify: +- +- TDEFAULTS = -DDEFAULT_VECTOR=host_aout_big_vec +- TDEPFILES= host-aout.o trad-core.o +- +- in the `config/XXX.mt' file, and modify `configure.in' to use the +-`XXX.mt' file (by setting "`bfd_target=XXX'") when your configuration +-is selected. +- +-3.2.1 Relocations +------------------ +- +-*Description* +-The file `aoutx.h' provides for both the _standard_ and _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. +- +-3.2.2 Internal entry points +---------------------------- +- +-*Description* +-`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). +- +-3.2.2.1 `aout_SIZE_swap_exec_header_in' +-....................................... +- +-*Synopsis* +- void aout_SIZE_swap_exec_header_in, +- (bfd *abfd, +- struct external_exec *bytes, +- struct internal_exec *execp); +- *Description* +-Swap the information in an executable header RAW_BYTES taken from a raw +-byte stream memory image into the internal exec header structure EXECP. +- +-3.2.2.2 `aout_SIZE_swap_exec_header_out' +-........................................ +- +-*Synopsis* +- void aout_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 EXECP into +-the buffer RAW_BYTES ready for writing to disk. +- +-3.2.2.3 `aout_SIZE_some_aout_object_p' +-...................................... +- +-*Synopsis* +- const bfd_target *aout_SIZE_some_aout_object_p +- (bfd *abfd, +- struct internal_exec *execp, +- const bfd_target *(*callback_to_real_object_p) (bfd *)); +- *Description* +-Some a.out variant thinks that the file open in 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. +- +-3.2.2.4 `aout_SIZE_mkobject' +-............................ +- +-*Synopsis* +- bfd_boolean aout_SIZE_mkobject, (bfd *abfd); +- *Description* +-Initialize BFD ABFD for use with a.out files. +- +-3.2.2.5 `aout_SIZE_machine_type' +-................................ +- +-*Synopsis* +- enum machine_type aout_SIZE_machine_type +- (enum bfd_architecture arch, +- unsigned long machine, +- bfd_boolean *unknown); +- *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. +- +-3.2.2.6 `aout_SIZE_set_arch_mach' +-................................. +- +-*Synopsis* +- bfd_boolean aout_SIZE_set_arch_mach, +- (bfd *, +- enum bfd_architecture arch, +- unsigned long machine); +- *Description* +-Set the architecture and the machine of the BFD ABFD to the values ARCH +-and MACHINE. Verify that ABFD's format can support the architecture +-required. +- +-3.2.2.7 `aout_SIZE_new_section_hook' +-.................................... +- +-*Synopsis* +- bfd_boolean aout_SIZE_new_section_hook, +- (bfd *abfd, +- asection *newsect); +- *Description* +-Called by the BFD in response to a `bfd_make_section' request. +- +- +-File: bfd.info, Node: coff, Next: elf, Prev: aout, Up: BFD back ends +- +-3.3 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 `coff-m88k.c'. This file +-`#include's `coff/m88k.h' which defines the external structure of the +-coff format for the 88k, and `coff/internal.h' which defines the +-internal structure. `coff-m88k.c' also defines the relocations used by +-the 88k format *Note Relocations::. +- +- The Intel i960 processor version of coff is implemented in +-`coff-i960.c'. This file has the same structure as `coff-m88k.c', +-except that it includes `coff/i960.h' rather than `coff-m88k.h'. +- +-3.3.1 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 `i386coff.c' to `foocoff.c', copy +-`../include/coff/i386.h' to `../include/coff/foo.h', and add the lines +-to `targets.c' and `Makefile.in' so that your new back end is used. +-Alter the shapes of the structures in `../include/coff/foo.h' so that +-they match what you need. You will probably also have to add `#ifdef's +-to the code in `coff/internal.h' and `coffcode.h' if your version of +-coff is too wild. +- +- You can verify that your new BFD backend works quite simply by +-building `objdump' from the `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 `att-dump' or +-just `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. +- +-3.3.2 How the coff backend works +--------------------------------- +- +-3.3.2.1 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 `coffgen.c'. These routines work for +-any Coff target. They use some hooks into the target specific code; +-the hooks are in a `bfd_coff_backend_data' structure, one of which +-exists for each target. +- +- The essentially similar target-specific routines are in +-`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 `coffcode.h'. +- +- Some of the Coff targets then also have additional routines in the +-target source file itself. +- +- For example, `coff-i960.c' includes `coff/internal.h' and +-`coff/i960.h'. It then defines a few constants, such as `I960', and +-includes `coffcode.h'. Since the i960 has complex relocation types, +-`coff-i960.c' also includes some code to manipulate the i960 relocs. +-This code is not in `coffcode.h' because it would not be used by any +-other target. +- +-3.3.2.2 Coff long section names +-............................... +- +-In the standard Coff object format, section names are limited to the +-eight bytes available in the `s_name' field of the `SCNHDR' section +-header structure. The format requires the field to be NUL-padded, but +-not necessarily NUL-terminated, so the longest section names permitted +-are a full eight characters. +- +- The Microsoft PE variants of the Coff object file format add an +-extension to support the use of long section names. This extension is +-defined in section 4 of the Microsoft PE/COFF specification (rev 8.1). +-If a section name is too long to fit into the section header's `s_name' +-field, it is instead placed into the string table, and the `s_name' +-field is filled with a slash ("/") followed by the ASCII decimal +-representation of the offset of the full name relative to the string +-table base. +- +- Note that this implies that the extension can only be used in object +-files, as executables do not contain a string table. The standard +-specifies that long section names from objects emitted into executable +-images are to be truncated. +- +- However, as a GNU extension, BFD can generate executable images that +-contain a string table and long section names. This would appear to be +-technically valid, as the standard only says that Coff debugging +-information is deprecated, not forbidden, and in practice it works, +-although some tools that parse PE files expecting the MS standard +-format may become confused; `PEview' is one known example. +- +- The functionality is supported in BFD by code implemented under the +-control of the macro `COFF_LONG_SECTION_NAMES'. If not defined, the +-format does not support long section names in any way. If defined, it +-is used to initialise a flag, `_bfd_coff_long_section_names', and a +-hook function pointer, `_bfd_coff_set_long_section_names', in the Coff +-backend data structure. The flag controls the generation of long +-section names in output BFDs at runtime; if it is false, as it will be +-by default when generating an executable image, long section names are +-truncated; if true, the long section names extension is employed. The +-hook points to a function that allows the value of the flag to be +-altered at runtime, on formats that support long section names at all; +-on other formats it points to a stub that returns an error indication. +- +- With input BFDs, the flag is set according to whether any long +-section names are detected while reading the section headers. For a +-completely new BFD, the flag is set to the default for the target +-format. This information can be used by a client of the BFD library +-when deciding what output format to generate, and means that a BFD that +-is opened for read and subsequently converted to a writeable BFD and +-modified in-place will retain whatever format it had on input. +- +- If `COFF_LONG_SECTION_NAMES' is simply defined (blank), or is +-defined to the value "1", then long section names are enabled by +-default; if it is defined to the value zero, they are disabled by +-default (but still accepted in input BFDs). The header `coffcode.h' +-defines a macro, `COFF_DEFAULT_LONG_SECTION_NAMES', which is used in +-the backends to initialise the backend data structure fields +-appropriately; see the comments for further detail. +- +-3.3.2.3 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 `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 `bfd_swap'_thing_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 `coffcode.h'. +-E.g., the size of line number entry in coff is sometimes 16 bits, and +-sometimes 32 bits. `#define'ing `PUT_LNSZ_LNNO' and `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 `#defines'. +-Three of the bit twiddling routines are exported to `gdb'; +-`coff_swap_aux_in', `coff_swap_sym_in' and `coff_swap_lineno_in'. `GDB' +-reads the symbol table on its own, but uses BFD to fix things up. More +-of the bit twiddlers are exported for `gas'; `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'. `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 `gas', which makes one avenue to disaster +-disappear. +- +-3.3.2.4 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 +-`bfd_canonicalize_symtab'), a request gets through to +-`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 (`".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 `sclass' field) about the +-various flags to set in the `asymbol'. *Note 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. +- +-3.3.2.5 Symbol writing +-...................... +- +-Writing a symbol to a coff file which didn't come from a coff file will +-lose any debugging information. The `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 (`C_FILE') to point to the +-next file place holder in the list. It also marks each `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 `asymbol''s `asection' *Note Sections::. +- +- * `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 hierarchy +-required by coff. It changes each pointer to a symbol into the index +-into the symbol table of the asymbol. +- +- * `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. +- +-3.3.2.6 `coff_symbol_type' +-.......................... +- +-*Description* +-The hidden information for an `asymbol' is described in a +-`combined_entry_type': +- +- +- 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 ? */ +- bfd_boolean done_lineno; +- } coff_symbol_type; +- +-3.3.2.7 `bfd_coff_backend_data' +-............................... +- +- /* COFF symbol classifications. */ +- +- enum coff_symbol_classification +- { +- /* Global symbol. */ +- COFF_SYMBOL_GLOBAL, +- /* Common symbol. */ +- COFF_SYMBOL_COMMON, +- /* Undefined symbol. */ +- COFF_SYMBOL_UNDEFINED, +- /* Local symbol. */ +- COFF_SYMBOL_LOCAL, +- /* PE section symbol. */ +- COFF_SYMBOL_PE_SECTION +- }; +-Special entry points for gdb to swap in coff symbol table parts: +- typedef struct +- { +- void (*_bfd_coff_swap_aux_in) +- (bfd *, void *, int, int, int, int, void *); +- +- void (*_bfd_coff_swap_sym_in) +- (bfd *, void *, void *); +- +- void (*_bfd_coff_swap_lineno_in) +- (bfd *, void *, void *); +- +- unsigned int (*_bfd_coff_swap_aux_out) +- (bfd *, void *, int, int, int, int, void *); +- +- unsigned int (*_bfd_coff_swap_sym_out) +- (bfd *, void *, void *); +- +- unsigned int (*_bfd_coff_swap_lineno_out) +- (bfd *, void *, void *); +- +- unsigned int (*_bfd_coff_swap_reloc_out) +- (bfd *, void *, void *); +- +- unsigned int (*_bfd_coff_swap_filehdr_out) +- (bfd *, void *, void *); +- +- unsigned int (*_bfd_coff_swap_aouthdr_out) +- (bfd *, void *, void *); +- +- unsigned int (*_bfd_coff_swap_scnhdr_out) +- (bfd *, void *, void *); +- +- 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; +- unsigned int _bfd_filnmlen; +- bfd_boolean _bfd_coff_long_filenames; +- +- bfd_boolean _bfd_coff_long_section_names; +- bfd_boolean (*_bfd_coff_set_long_section_names) +- (bfd *, int); +- +- unsigned int _bfd_coff_default_section_alignment_power; +- bfd_boolean _bfd_coff_force_symnames_in_strings; +- unsigned int _bfd_coff_debug_string_prefix_length; +- +- void (*_bfd_coff_swap_filehdr_in) +- (bfd *, void *, void *); +- +- void (*_bfd_coff_swap_aouthdr_in) +- (bfd *, void *, void *); +- +- void (*_bfd_coff_swap_scnhdr_in) +- (bfd *, void *, void *); +- +- void (*_bfd_coff_swap_reloc_in) +- (bfd *abfd, void *, void *); +- +- bfd_boolean (*_bfd_coff_bad_format_hook) +- (bfd *, void *); +- +- bfd_boolean (*_bfd_coff_set_arch_mach_hook) +- (bfd *, void *); +- +- void * (*_bfd_coff_mkobject_hook) +- (bfd *, void *, void *); +- +- bfd_boolean (*_bfd_styp_to_sec_flags_hook) +- (bfd *, void *, const char *, asection *, flagword *); +- +- void (*_bfd_set_alignment_hook) +- (bfd *, asection *, void *); +- +- bfd_boolean (*_bfd_coff_slurp_symbol_table) +- (bfd *); +- +- bfd_boolean (*_bfd_coff_symname_in_debug) +- (bfd *, struct internal_syment *); +- +- bfd_boolean (*_bfd_coff_pointerize_aux_hook) +- (bfd *, combined_entry_type *, combined_entry_type *, +- unsigned int, combined_entry_type *); +- +- bfd_boolean (*_bfd_coff_print_aux) +- (bfd *, FILE *, combined_entry_type *, combined_entry_type *, +- combined_entry_type *, unsigned int); +- +- void (*_bfd_coff_reloc16_extra_cases) +- (bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *, +- bfd_byte *, unsigned int *, unsigned int *); +- +- int (*_bfd_coff_reloc16_estimate) +- (bfd *, asection *, arelent *, unsigned int, +- struct bfd_link_info *); +- +- enum coff_symbol_classification (*_bfd_coff_classify_symbol) +- (bfd *, struct internal_syment *); +- +- bfd_boolean (*_bfd_coff_compute_section_file_positions) +- (bfd *); +- +- bfd_boolean (*_bfd_coff_start_final_link) +- (bfd *, struct bfd_link_info *); +- +- bfd_boolean (*_bfd_coff_relocate_section) +- (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, +- struct internal_reloc *, struct internal_syment *, asection **); +- +- reloc_howto_type *(*_bfd_coff_rtype_to_howto) +- (bfd *, asection *, struct internal_reloc *, +- struct coff_link_hash_entry *, struct internal_syment *, +- bfd_vma *); +- +- bfd_boolean (*_bfd_coff_adjust_symndx) +- (bfd *, struct bfd_link_info *, bfd *, asection *, +- struct internal_reloc *, bfd_boolean *); +- +- bfd_boolean (*_bfd_coff_link_add_one_symbol) +- (struct bfd_link_info *, bfd *, const char *, flagword, +- asection *, bfd_vma, const char *, bfd_boolean, bfd_boolean, +- struct bfd_link_hash_entry **); +- +- bfd_boolean (*_bfd_coff_link_output_has_begun) +- (bfd *, struct coff_final_link_info *); +- +- bfd_boolean (*_bfd_coff_final_link_postscript) +- (bfd *, struct coff_final_link_info *); +- +- bfd_boolean (*_bfd_coff_print_pdata) +- (bfd *, void *); +- +- } 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_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen) +- #define bfd_coff_long_filenames(abfd) \ +- (coff_backend_info (abfd)->_bfd_coff_long_filenames) +- #define bfd_coff_long_section_names(abfd) \ +- (coff_backend_info (abfd)->_bfd_coff_long_section_names) +- #define bfd_coff_set_long_section_names(abfd, enable) \ +- ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable)) +- #define bfd_coff_default_section_alignment_power(abfd) \ +- (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power) +- #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, section, flags_ptr)\ +- ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\ +- (abfd, scnhdr, name, section, flags_ptr)) +- +- #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_force_symnames_in_strings(abfd)\ +- (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings) +- +- #define bfd_coff_debug_string_prefix_length(abfd)\ +- (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length) +- +- #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_classify_symbol(abfd, sym)\ +- ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\ +- (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)) +- +- #define bfd_coff_link_output_has_begun(a,p) \ +- ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a, p)) +- #define bfd_coff_final_link_postscript(a,p) \ +- ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a, p)) +- +- #define bfd_coff_have_print_pdata(a) \ +- (coff_backend_info (a)->_bfd_coff_print_pdata) +- #define bfd_coff_print_pdata(a,p) \ +- ((coff_backend_info (a)->_bfd_coff_print_pdata) (a, p)) +- +- /* Macro: Returns true if the bfd is a PE executable as opposed to a +- PE object file. */ +- #define bfd_pei_p(abfd) \ +- (CONST_STRNEQ ((abfd)->xvec->name, "pei-")) +- +-3.3.2.8 Writing relocations +-........................... +- +-To write relocations, the back end steps though the canonical +-relocation table and create an `internal_reloc'. The symbol index to +-use is removed from the `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 `internal_reloc' is swapped into the shape of an +-`external_reloc' and written out to disk. +- +-3.3.2.9 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. +- +- Note: The PE format uses line number 0 for a flag indicating a new +-source file. +- +- 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 ? +- +-3.3.2.10 Reading relocations +-............................ +- +-Coff relocations are easily transformed into the internal BFD form +-(`arelent'). +- +- Reading a coff relocation table is done in the following stages: +- +- * Read the entire coff relocation table into memory. +- +- * Process each relocation in turn; first swap it from the external +- to the internal form. +- +- * 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 `bfd_canonicalize_symtab'. The +- back end will call that routine and save the result if a +- canonicalization hasn't been done. +- +- * 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 +- `r_type' to directly produce an index into a howto table vector; +- the 88k subtracts a number from the `r_type' field and creates an +- addend field. +- +- +-File: bfd.info, Node: elf, Next: mmo, Prev: coff, Up: BFD back ends +- +-3.4 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. +- +- +-File: bfd.info, Node: mmo, Prev: elf, Up: BFD back ends +- +-3.5 mmo backend +-=============== +- +-The mmo object format is used exclusively together with Professor +-Donald E. Knuth's educational 64-bit processor MMIX. The simulator +-`mmix' which is available at +-`http://www-cs-faculty.stanford.edu/~knuth/programs/mmix.tar.gz' +-understands this format. That package also includes a combined +-assembler and linker called `mmixal'. The mmo format has no advantages +-feature-wise compared to e.g. ELF. It is a simple non-relocatable +-object format with no support for archives or debugging information, +-except for symbol value information and line numbers (which is not yet +-implemented in BFD). See +-`http://www-cs-faculty.stanford.edu/~knuth/mmix.html' for more +-information about MMIX. The ELF format is used for intermediate object +-files in the BFD implementation. +- +-* Menu: +- +-* File layout:: +-* Symbol-table:: +-* mmo section mapping:: +- +- +-File: bfd.info, Node: File layout, Next: Symbol-table, Prev: mmo, Up: mmo +- +-3.5.1 File layout +------------------ +- +-The mmo file contents is not partitioned into named sections as with +-e.g. ELF. Memory areas is formed by specifying the location of the +-data that follows. Only the memory area `0x0000...00' to `0x01ff...ff' +-is executable, so it is used for code (and constants) and the area +-`0x2000...00' to `0x20ff...ff' is used for writable data. *Note mmo +-section mapping::. +- +- There is provision for specifying "special data" of 65536 different +-types. We use type 80 (decimal), arbitrarily chosen the same as the +-ELF `e_machine' number for MMIX, filling it with section information +-normally found in ELF objects. *Note mmo section mapping::. +- +- Contents is entered as 32-bit words, xor:ed over previous contents, +-always zero-initialized. A word that starts with the byte `0x98' forms +-a command called a `lopcode', where the next byte distinguished between +-the thirteen lopcodes. The two remaining bytes, called the `Y' and `Z' +-fields, or the `YZ' field (a 16-bit big-endian number), are used for +-various purposes different for each lopcode. As documented in +-`http://www-cs-faculty.stanford.edu/~knuth/mmixal-intro.ps.gz', the +-lopcodes are: +- +-`lop_quote' +- 0x98000001. The next word is contents, regardless of whether it +- starts with 0x98 or not. +- +-`lop_loc' +- 0x9801YYZZ, where `Z' is 1 or 2. This is a location directive, +- setting the location for the next data to the next 32-bit word +- (for Z = 1) or 64-bit word (for Z = 2), plus Y * 2^56. Normally +- `Y' is 0 for the text segment and 2 for the data segment. +- +-`lop_skip' +- 0x9802YYZZ. Increase the current location by `YZ' bytes. +- +-`lop_fixo' +- 0x9803YYZZ, where `Z' is 1 or 2. Store the current location as 64 +- bits into the location pointed to by the next 32-bit (Z = 1) or +- 64-bit (Z = 2) word, plus Y * 2^56. +- +-`lop_fixr' +- 0x9804YYZZ. `YZ' is stored into the current location plus 2 - 4 * +- YZ. +- +-`lop_fixrx' +- 0x980500ZZ. `Z' is 16 or 24. A value `L' derived from the +- following 32-bit word are used in a manner similar to `YZ' in +- lop_fixr: it is xor:ed into the current location minus 4 * L. The +- first byte of the word is 0 or 1. If it is 1, then L = (LOWEST 24 +- BITS OF WORD) - 2^Z, if 0, then L = (LOWEST 24 BITS OF WORD). +- +-`lop_file' +- 0x9806YYZZ. `Y' is the file number, `Z' is count of 32-bit words. +- Set the file number to `Y' and the line counter to 0. The next Z +- * 4 bytes contain the file name, padded with zeros if the count is +- not a multiple of four. The same `Y' may occur multiple times, +- but `Z' must be 0 for all but the first occurrence. +- +-`lop_line' +- 0x9807YYZZ. `YZ' is the line number. Together with lop_file, it +- forms the source location for the next 32-bit word. Note that for +- each non-lopcode 32-bit word, line numbers are assumed incremented +- by one. +- +-`lop_spec' +- 0x9808YYZZ. `YZ' is the type number. Data until the next lopcode +- other than lop_quote forms special data of type `YZ'. *Note mmo +- section mapping::. +- +- Other types than 80, (or type 80 with a content that does not +- parse) is stored in sections named `.MMIX.spec_data.N' where N is +- the `YZ'-type. The flags for such a sections say not to allocate +- or load the data. The vma is 0. Contents of multiple occurrences +- of special data N is concatenated to the data of the previous +- lop_spec Ns. The location in data or code at which the lop_spec +- occurred is lost. +- +-`lop_pre' +- 0x980901ZZ. The first lopcode in a file. The `Z' field forms the +- length of header information in 32-bit words, where the first word +- tells the time in seconds since `00:00:00 GMT Jan 1 1970'. +- +-`lop_post' +- 0x980a00ZZ. Z > 32. This lopcode follows after all +- content-generating lopcodes in a program. The `Z' field denotes +- the value of `rG' at the beginning of the program. The following +- 256 - Z big-endian 64-bit words are loaded into global registers +- `$G' ... `$255'. +- +-`lop_stab' +- 0x980b0000. The next-to-last lopcode in a program. Must follow +- immediately after the lop_post lopcode and its data. After this +- lopcode follows all symbols in a compressed format (*note +- Symbol-table::). +- +-`lop_end' +- 0x980cYYZZ. The last lopcode in a program. It must follow the +- lop_stab lopcode and its data. The `YZ' field contains the number +- of 32-bit words of symbol table information after the preceding +- lop_stab lopcode. +- +- Note that the lopcode "fixups"; `lop_fixr', `lop_fixrx' and +-`lop_fixo' are not generated by BFD, but are handled. They are +-generated by `mmixal'. +- +- This trivial one-label, one-instruction file: +- +- :Main TRAP 1,2,3 +- +- can be represented this way in mmo: +- +- 0x98090101 - lop_pre, one 32-bit word with timestamp. +- +- 0x98010002 - lop_loc, text segment, using a 64-bit address. +- Note that mmixal does not emit this for the file above. +- 0x00000000 - Address, high 32 bits. +- 0x00000000 - Address, low 32 bits. +- 0x98060002 - lop_file, 2 32-bit words for file-name. +- 0x74657374 - "test" +- 0x2e730000 - ".s\0\0" +- 0x98070001 - lop_line, line 1. +- 0x00010203 - TRAP 1,2,3 +- 0x980a00ff - lop_post, setting $255 to 0. +- 0x00000000 +- 0x00000000 +- 0x980b0000 - lop_stab for ":Main" = 0, serial 1. +- 0x203a4040 *Note Symbol-table::. +- 0x10404020 +- 0x4d206120 +- 0x69016e00 +- 0x81000000 +- 0x980c0005 - lop_end; symbol table contained five 32-bit words. +- +- +-File: bfd.info, Node: Symbol-table, Next: mmo section mapping, Prev: File layout, Up: mmo +- +-3.5.2 Symbol table format +-------------------------- +- +-From mmixal.w (or really, the generated mmixal.tex) in +-`http://www-cs-faculty.stanford.edu/~knuth/programs/mmix.tar.gz'): +-"Symbols are stored and retrieved by means of a `ternary search trie', +-following ideas of Bentley and Sedgewick. (See ACM-SIAM Symp. on +-Discrete Algorithms `8' (1997), 360-369; R.Sedgewick, `Algorithms in C' +-(Reading, Mass. Addison-Wesley, 1998), `15.4'.) Each trie node stores +-a character, and there are branches to subtries for the cases where a +-given character is less than, equal to, or greater than the character +-in the trie. There also is a pointer to a symbol table entry if a +-symbol ends at the current node." +- +- So it's a tree encoded as a stream of bytes. The stream of bytes +-acts on a single virtual global symbol, adding and removing characters +-and signalling complete symbol points. Here, we read the stream and +-create symbols at the completion points. +- +- First, there's a control byte `m'. If any of the listed bits in `m' +-is nonzero, we execute what stands at the right, in the listed order: +- +- (MMO3_LEFT) +- 0x40 - Traverse left trie. +- (Read a new command byte and recurse.) +- +- (MMO3_SYMBITS) +- 0x2f - Read the next byte as a character and store it in the +- current character position; increment character position. +- Test the bits of `m': +- +- (MMO3_WCHAR) +- 0x80 - The character is 16-bit (so read another byte, +- merge into current character. +- +- (MMO3_TYPEBITS) +- 0xf - We have a complete symbol; parse the type, value +- and serial number and do what should be done +- with a symbol. The type and length information +- is in j = (m & 0xf). +- +- (MMO3_REGQUAL_BITS) +- j == 0xf: A register variable. The following +- byte tells which register. +- j <= 8: An absolute symbol. Read j bytes as the +- big-endian number the symbol equals. +- A j = 2 with two zero bytes denotes an +- unknown symbol. +- j > 8: As with j <= 8, but add (0x20 << 56) +- to the value in the following j - 8 +- bytes. +- +- Then comes the serial number, as a variant of +- uleb128, but better named ubeb128: +- Read bytes and shift the previous value left 7 +- (multiply by 128). Add in the new byte, repeat +- until a byte has bit 7 set. The serial number +- is the computed value minus 128. +- +- (MMO3_MIDDLE) +- 0x20 - Traverse middle trie. (Read a new command byte +- and recurse.) Decrement character position. +- +- (MMO3_RIGHT) +- 0x10 - Traverse right trie. (Read a new command byte and +- recurse.) +- +- Let's look again at the `lop_stab' for the trivial file (*note File +-layout::). +- +- 0x980b0000 - lop_stab for ":Main" = 0, serial 1. +- 0x203a4040 +- 0x10404020 +- 0x4d206120 +- 0x69016e00 +- 0x81000000 +- +- This forms the trivial trie (note that the path between ":" and "M" +-is redundant): +- +- 203a ":" +- 40 / +- 40 / +- 10 \ +- 40 / +- 40 / +- 204d "M" +- 2061 "a" +- 2069 "i" +- 016e "n" is the last character in a full symbol, and +- with a value represented in one byte. +- 00 The value is 0. +- 81 The serial number is 1. +- +- +-File: bfd.info, Node: mmo section mapping, Prev: Symbol-table, Up: mmo +- +-3.5.3 mmo section mapping +-------------------------- +- +-The implementation in BFD uses special data type 80 (decimal) to +-encapsulate and describe named sections, containing e.g. debug +-information. If needed, any datum in the encapsulation will be quoted +-using lop_quote. First comes a 32-bit word holding the number of +-32-bit words containing the zero-terminated zero-padded segment name. +-After the name there's a 32-bit word holding flags describing the +-section type. Then comes a 64-bit big-endian word with the section +-length (in bytes), then another with the section start address. +-Depending on the type of section, the contents might follow, +-zero-padded to 32-bit boundary. For a loadable section (such as data +-or code), the contents might follow at some later point, not +-necessarily immediately, as a lop_loc with the same start address as in +-the section description, followed by the contents. This in effect +-forms a descriptor that must be emitted before the actual contents. +-Sections described this way must not overlap. +- +- For areas that don't have such descriptors, synthetic sections are +-formed by BFD. Consecutive contents in the two memory areas +-`0x0000...00' to `0x01ff...ff' and `0x2000...00' to `0x20ff...ff' are +-entered in sections named `.text' and `.data' respectively. If an area +-is not otherwise described, but would together with a neighboring lower +-area be less than `0x40000000' bytes long, it is joined with the lower +-area and the gap is zero-filled. For other cases, a new section is +-formed, named `.MMIX.sec.N'. Here, N is a number, a running count +-through the mmo file, starting at 0. +- +- A loadable section specified as: +- +- .section secname,"ax" +- TETRA 1,2,3,4,-1,-2009 +- BYTE 80 +- +- and linked to address `0x4', is represented by the sequence: +- +- 0x98080050 - lop_spec 80 +- 0x00000002 - two 32-bit words for the section name +- 0x7365636e - "secn" +- 0x616d6500 - "ame\0" +- 0x00000033 - flags CODE, READONLY, LOAD, ALLOC +- 0x00000000 - high 32 bits of section length +- 0x0000001c - section length is 28 bytes; 6 * 4 + 1 + alignment to 32 bits +- 0x00000000 - high 32 bits of section address +- 0x00000004 - section address is 4 +- 0x98010002 - 64 bits with address of following data +- 0x00000000 - high 32 bits of address +- 0x00000004 - low 32 bits: data starts at address 4 +- 0x00000001 - 1 +- 0x00000002 - 2 +- 0x00000003 - 3 +- 0x00000004 - 4 +- 0xffffffff - -1 +- 0xfffff827 - -2009 +- 0x50000000 - 80 as a byte, padded with zeros. +- +- Note that the lop_spec wrapping does not include the section +-contents. Compare this to a non-loaded section specified as: +- +- .section thirdsec +- TETRA 200001,100002 +- BYTE 38,40 +- +- This, when linked to address `0x200000000000001c', is represented by: +- +- 0x98080050 - lop_spec 80 +- 0x00000002 - two 32-bit words for the section name +- 0x7365636e - "thir" +- 0x616d6500 - "dsec" +- 0x00000010 - flag READONLY +- 0x00000000 - high 32 bits of section length +- 0x0000000c - section length is 12 bytes; 2 * 4 + 2 + alignment to 32 bits +- 0x20000000 - high 32 bits of address +- 0x0000001c - low 32 bits of address 0x200000000000001c +- 0x00030d41 - 200001 +- 0x000186a2 - 100002 +- 0x26280000 - 38, 40 as bytes, padded with zeros +- +- For the latter example, the section contents must not be loaded in +-memory, and is therefore specified as part of the special data. The +-address is usually unimportant but might provide information for e.g. +-the DWARF 2 debugging format. +- +- +-File: bfd.info, Node: GNU Free Documentation License, Next: BFD Index, Prev: BFD back ends, Up: Top +- +- Version 1.3, 3 November 2008 +- +- Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. +- `http://fsf.org/' +- +- Everyone is permitted to copy and distribute verbatim copies +- of this license document, but changing it is not allowed. +- +- 0. PREAMBLE +- +- The purpose of this License is to make a manual, textbook, or other +- functional and useful document "free" in the sense of freedom: to +- assure everyone the effective freedom to copy and redistribute it, +- with or without modifying it, either commercially or +- noncommercially. Secondarily, this License preserves for the +- author and publisher a way to get credit for their work, while not +- being considered responsible for modifications made by others. +- +- This License is a kind of "copyleft", which means that derivative +- works of the document must themselves be free in the same sense. +- It complements the GNU General Public License, which is a copyleft +- license designed for free software. +- +- We have designed this License in order to use it for manuals for +- free software, because free software needs free documentation: a +- free program should come with manuals providing the same freedoms +- that the software does. But this License is not limited to +- software manuals; it can be used for any textual work, regardless +- of subject matter or whether it is published as a printed book. +- We recommend this License principally for works whose purpose is +- instruction or reference. +- +- 1. APPLICABILITY AND DEFINITIONS +- +- This License applies to any manual or other work, in any medium, +- that contains a notice placed by the copyright holder saying it +- can be distributed under the terms of this License. Such a notice +- grants a world-wide, royalty-free license, unlimited in duration, +- to use that work under the conditions stated herein. The +- "Document", below, refers to any such manual or work. Any member +- of the public is a licensee, and is addressed as "you". You +- accept the license if you copy, modify or distribute the work in a +- way requiring permission under copyright law. +- +- A "Modified Version" of the Document means any work containing the +- Document or a portion of it, either copied verbatim, or with +- modifications and/or translated into another language. +- +- A "Secondary Section" is a named appendix or a front-matter section +- of the Document that deals exclusively with the relationship of the +- publishers or authors of the Document to the Document's overall +- subject (or to related matters) and contains nothing that could +- fall directly within that overall subject. (Thus, if the Document +- is in part a textbook of mathematics, a Secondary Section may not +- explain any mathematics.) The relationship could be a matter of +- historical connection with the subject or with related matters, or +- of legal, commercial, philosophical, ethical or political position +- regarding them. +- +- The "Invariant Sections" are certain Secondary Sections whose +- titles are designated, as being those of Invariant Sections, in +- the notice that says that the Document is released under this +- License. If a section does not fit the above definition of +- Secondary then it is not allowed to be designated as Invariant. +- The Document may contain zero Invariant Sections. If the Document +- does not identify any Invariant Sections then there are none. +- +- The "Cover Texts" are certain short passages of text that are +- listed, as Front-Cover Texts or Back-Cover Texts, in the notice +- that says that the Document is released under this License. A +- Front-Cover Text may be at most 5 words, and a Back-Cover Text may +- be at most 25 words. +- +- A "Transparent" copy of the Document means a machine-readable copy, +- represented in a format whose specification is available to the +- general public, that is suitable for revising the document +- straightforwardly with generic text editors or (for images +- composed of pixels) generic paint programs or (for drawings) some +- widely available drawing editor, and that is suitable for input to +- text formatters or for automatic translation to a variety of +- formats suitable for input to text formatters. A copy made in an +- otherwise Transparent file format whose markup, or absence of +- markup, has been arranged to thwart or discourage subsequent +- modification by readers is not Transparent. An image format is +- not Transparent if used for any substantial amount of text. A +- copy that is not "Transparent" is called "Opaque". +- +- Examples of suitable formats for Transparent copies include plain +- ASCII without markup, Texinfo input format, LaTeX input format, +- SGML or XML using a publicly available DTD, and +- standard-conforming simple HTML, PostScript or PDF designed for +- human modification. Examples of transparent image formats include +- PNG, XCF and JPG. Opaque formats include proprietary formats that +- can be read and edited only by proprietary word processors, SGML or +- XML for which the DTD and/or processing tools are not generally +- available, and the machine-generated HTML, PostScript or PDF +- produced by some word processors for output purposes only. +- +- The "Title Page" means, for a printed book, the title page itself, +- plus such following pages as are needed to hold, legibly, the +- material this License requires to appear in the title page. For +- works in formats which do not have any title page as such, "Title +- Page" means the text near the most prominent appearance of the +- work's title, preceding the beginning of the body of the text. +- +- The "publisher" means any person or entity that distributes copies +- of the Document to the public. +- +- A section "Entitled XYZ" means a named subunit of the Document +- whose title either is precisely XYZ or contains XYZ in parentheses +- following text that translates XYZ in another language. (Here XYZ +- stands for a specific section name mentioned below, such as +- "Acknowledgements", "Dedications", "Endorsements", or "History".) +- To "Preserve the Title" of such a section when you modify the +- Document means that it remains a section "Entitled XYZ" according +- to this definition. +- +- The Document may include Warranty Disclaimers next to the notice +- which states that this License applies to the Document. These +- Warranty Disclaimers are considered to be included by reference in +- this License, but only as regards disclaiming warranties: any other +- implication that these Warranty Disclaimers may have is void and +- has no effect on the meaning of this License. +- +- 2. VERBATIM COPYING +- +- You may copy and distribute the Document in any medium, either +- commercially or noncommercially, provided that this License, the +- copyright notices, and the license notice saying this License +- applies to the Document are reproduced in all copies, and that you +- add no other conditions whatsoever to those of this License. You +- may not use technical measures to obstruct or control the reading +- or further copying of the copies you make or distribute. However, +- you may accept compensation in exchange for copies. If you +- distribute a large enough number of copies you must also follow +- the conditions in section 3. +- +- You may also lend copies, under the same conditions stated above, +- and you may publicly display copies. +- +- 3. COPYING IN QUANTITY +- +- If you publish printed copies (or copies in media that commonly +- have printed covers) of the Document, numbering more than 100, and +- the Document's license notice requires Cover Texts, you must +- enclose the copies in covers that carry, clearly and legibly, all +- these Cover Texts: Front-Cover Texts on the front cover, and +- Back-Cover Texts on the back cover. Both covers must also clearly +- and legibly identify you as the publisher of these copies. The +- front cover must present the full title with all words of the +- title equally prominent and visible. You may add other material +- on the covers in addition. Copying with changes limited to the +- covers, as long as they preserve the title of the Document and +- satisfy these conditions, can be treated as verbatim copying in +- other respects. +- +- If the required texts for either cover are too voluminous to fit +- legibly, you should put the first ones listed (as many as fit +- reasonably) on the actual cover, and continue the rest onto +- adjacent pages. +- +- If you publish or distribute Opaque copies of the Document +- numbering more than 100, you must either include a +- machine-readable Transparent copy along with each Opaque copy, or +- state in or with each Opaque copy a computer-network location from +- which the general network-using public has access to download +- using public-standard network protocols a complete Transparent +- copy of the Document, free of added material. If you use the +- latter option, you must take reasonably prudent steps, when you +- begin distribution of Opaque copies in quantity, to ensure that +- this Transparent copy will remain thus accessible at the stated +- location until at least one year after the last time you +- distribute an Opaque copy (directly or through your agents or +- retailers) of that edition to the public. +- +- It is requested, but not required, that you contact the authors of +- the Document well before redistributing any large number of +- copies, to give them a chance to provide you with an updated +- version of the Document. +- +- 4. MODIFICATIONS +- +- You may copy and distribute a Modified Version of the Document +- under the conditions of sections 2 and 3 above, provided that you +- release the Modified Version under precisely this License, with +- the Modified Version filling the role of the Document, thus +- licensing distribution and modification of the Modified Version to +- whoever possesses a copy of it. In addition, you must do these +- things in the Modified Version: +- +- A. Use in the Title Page (and on the covers, if any) a title +- distinct from that of the Document, and from those of +- previous versions (which should, if there were any, be listed +- in the History section of the Document). You may use the +- same title as a previous version if the original publisher of +- that version gives permission. +- +- B. List on the Title Page, as authors, one or more persons or +- entities responsible for authorship of the modifications in +- the Modified Version, together with at least five of the +- principal authors of the Document (all of its principal +- authors, if it has fewer than five), unless they release you +- from this requirement. +- +- C. State on the Title page the name of the publisher of the +- Modified Version, as the publisher. +- +- D. Preserve all the copyright notices of the Document. +- +- E. Add an appropriate copyright notice for your modifications +- adjacent to the other copyright notices. +- +- F. Include, immediately after the copyright notices, a license +- notice giving the public permission to use the Modified +- Version under the terms of this License, in the form shown in +- the Addendum below. +- +- G. Preserve in that license notice the full lists of Invariant +- Sections and required Cover Texts given in the Document's +- license notice. +- +- H. Include an unaltered copy of this License. +- +- I. Preserve the section Entitled "History", Preserve its Title, +- and add to it an item stating at least the title, year, new +- authors, and publisher of the Modified Version as given on +- the Title Page. If there is no section Entitled "History" in +- the Document, create one stating the title, year, authors, +- and publisher of the Document as given on its Title Page, +- then add an item describing the Modified Version as stated in +- the previous sentence. +- +- J. Preserve the network location, if any, given in the Document +- for public access to a Transparent copy of the Document, and +- likewise the network locations given in the Document for +- previous versions it was based on. These may be placed in +- the "History" section. You may omit a network location for a +- work that was published at least four years before the +- Document itself, or if the original publisher of the version +- it refers to gives permission. +- +- K. For any section Entitled "Acknowledgements" or "Dedications", +- Preserve the Title of the section, and preserve in the +- section all the substance and tone of each of the contributor +- acknowledgements and/or dedications given therein. +- +- L. Preserve all the Invariant Sections of the Document, +- unaltered in their text and in their titles. Section numbers +- or the equivalent are not considered part of the section +- titles. +- +- M. Delete any section Entitled "Endorsements". Such a section +- may not be included in the Modified Version. +- +- N. Do not retitle any existing section to be Entitled +- "Endorsements" or to conflict in title with any Invariant +- Section. +- +- O. Preserve any Warranty Disclaimers. +- +- If the Modified Version includes new front-matter sections or +- appendices that qualify as Secondary Sections and contain no +- material copied from the Document, you may at your option +- designate some or all of these sections as invariant. To do this, +- add their titles to the list of Invariant Sections in the Modified +- Version's license notice. These titles must be distinct from any +- other section titles. +- +- You may add a section Entitled "Endorsements", provided it contains +- nothing but endorsements of your Modified Version by various +- parties--for example, statements of peer review or that the text +- has been approved by an organization as the authoritative +- definition of a standard. +- +- You may add a passage of up to five words as a Front-Cover Text, +- and a passage of up to 25 words as a Back-Cover Text, to the end +- of the list of Cover Texts in the Modified Version. Only one +- passage of Front-Cover Text and one of Back-Cover Text may be +- added by (or through arrangements made by) any one entity. If the +- Document already includes a cover text for the same cover, +- previously added by you or by arrangement made by the same entity +- you are acting on behalf of, you may not add another; but you may +- replace the old one, on explicit permission from the previous +- publisher that added the old one. +- +- The author(s) and publisher(s) of the Document do not by this +- License give permission to use their names for publicity for or to +- assert or imply endorsement of any Modified Version. +- +- 5. COMBINING DOCUMENTS +- +- You may combine the Document with other documents released under +- this License, under the terms defined in section 4 above for +- modified versions, provided that you include in the combination +- all of the Invariant Sections of all of the original documents, +- unmodified, and list them all as Invariant Sections of your +- combined work in its license notice, and that you preserve all +- their Warranty Disclaimers. +- +- The combined work need only contain one copy of this License, and +- multiple identical Invariant Sections may be replaced with a single +- copy. If there are multiple Invariant Sections with the same name +- but different contents, make the title of each such section unique +- by adding at the end of it, in parentheses, the name of the +- original author or publisher of that section if known, or else a +- unique number. Make the same adjustment to the section titles in +- the list of Invariant Sections in the license notice of the +- combined work. +- +- In the combination, you must combine any sections Entitled +- "History" in the various original documents, forming one section +- Entitled "History"; likewise combine any sections Entitled +- "Acknowledgements", and any sections Entitled "Dedications". You +- must delete all sections Entitled "Endorsements." +- +- 6. COLLECTIONS OF DOCUMENTS +- +- You may make a collection consisting of the Document and other +- documents released under this License, and replace the individual +- copies of this License in the various documents with a single copy +- that is included in the collection, provided that you follow the +- rules of this License for verbatim copying of each of the +- documents in all other respects. +- +- You may extract a single document from such a collection, and +- distribute it individually under this License, provided you insert +- a copy of this License into the extracted document, and follow +- this License in all other respects regarding verbatim copying of +- that document. +- +- 7. AGGREGATION WITH INDEPENDENT WORKS +- +- A compilation of the Document or its derivatives with other +- separate and independent documents or works, in or on a volume of +- a storage or distribution medium, is called an "aggregate" if the +- copyright resulting from the compilation is not used to limit the +- legal rights of the compilation's users beyond what the individual +- works permit. When the Document is included in an aggregate, this +- License does not apply to the other works in the aggregate which +- are not themselves derivative works of the Document. +- +- If the Cover Text requirement of section 3 is applicable to these +- copies of the Document, then if the Document is less than one half +- of the entire aggregate, the Document's Cover Texts may be placed +- on covers that bracket the Document within the aggregate, or the +- electronic equivalent of covers if the Document is in electronic +- form. Otherwise they must appear on printed covers that bracket +- the whole aggregate. +- +- 8. TRANSLATION +- +- Translation is considered a kind of modification, so you may +- distribute translations of the Document under the terms of section +- 4. Replacing Invariant Sections with translations requires special +- permission from their copyright holders, but you may include +- translations of some or all Invariant Sections in addition to the +- original versions of these Invariant Sections. You may include a +- translation of this License, and all the license notices in the +- Document, and any Warranty Disclaimers, provided that you also +- include the original English version of this License and the +- original versions of those notices and disclaimers. In case of a +- disagreement between the translation and the original version of +- this License or a notice or disclaimer, the original version will +- prevail. +- +- If a section in the Document is Entitled "Acknowledgements", +- "Dedications", or "History", the requirement (section 4) to +- Preserve its Title (section 1) will typically require changing the +- actual title. +- +- 9. TERMINATION +- +- You may not copy, modify, sublicense, or distribute the Document +- except as expressly provided under this License. Any attempt +- otherwise to copy, modify, sublicense, or distribute it is void, +- and will automatically terminate your rights under this License. +- +- However, if you cease all violation of this License, then your +- license from a particular copyright holder is reinstated (a) +- provisionally, unless and until the copyright holder explicitly +- and finally terminates your license, and (b) permanently, if the +- copyright holder fails to notify you of the violation by some +- reasonable means prior to 60 days after the cessation. +- +- Moreover, your license from a particular copyright holder is +- reinstated permanently if the copyright holder notifies you of the +- violation by some reasonable means, this is the first time you have +- received notice of violation of this License (for any work) from +- that copyright holder, and you cure the violation prior to 30 days +- after your receipt of the notice. +- +- Termination of your rights under this section does not terminate +- the licenses of parties who have received copies or rights from +- you under this License. If your rights have been terminated and +- not permanently reinstated, receipt of a copy of some or all of +- the same material does not give you any rights to use it. +- +- 10. FUTURE REVISIONS OF THIS LICENSE +- +- The Free Software Foundation may publish new, revised versions of +- the GNU Free Documentation 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. See +- `http://www.gnu.org/copyleft/'. +- +- Each version of the License is given a distinguishing version +- number. If the Document specifies that a particular numbered +- version of this License "or any later version" applies to it, you +- have the option of following the terms and conditions either of +- that specified version or of any later version that has been +- published (not as a draft) by the Free Software Foundation. If +- the Document does not specify a version number of this License, +- you may choose any version ever published (not as a draft) by the +- Free Software Foundation. If the Document specifies that a proxy +- can decide which future versions of this License can be used, that +- proxy's public statement of acceptance of a version permanently +- authorizes you to choose that version for the Document. +- +- 11. RELICENSING +- +- "Massive Multiauthor Collaboration Site" (or "MMC Site") means any +- World Wide Web server that publishes copyrightable works and also +- provides prominent facilities for anybody to edit those works. A +- public wiki that anybody can edit is an example of such a server. +- A "Massive Multiauthor Collaboration" (or "MMC") contained in the +- site means any set of copyrightable works thus published on the MMC +- site. +- +- "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 +- license published by Creative Commons Corporation, a not-for-profit +- corporation with a principal place of business in San Francisco, +- California, as well as future copyleft versions of that license +- published by that same organization. +- +- "Incorporate" means to publish or republish a Document, in whole or +- in part, as part of another Document. +- +- An MMC is "eligible for relicensing" if it is licensed under this +- License, and if all works that were first published under this +- License somewhere other than this MMC, and subsequently +- incorporated in whole or in part into the MMC, (1) had no cover +- texts or invariant sections, and (2) were thus incorporated prior +- to November 1, 2008. +- +- The operator of an MMC Site may republish an MMC contained in the +- site under CC-BY-SA on the same site at any time before August 1, +- 2009, provided the MMC is eligible for relicensing. +- +- +-ADDENDUM: How to use this License for your documents +-==================================================== +- +-To use this License in a document you have written, include a copy of +-the License in the document and put the following copyright and license +-notices just after the title page: +- +- Copyright (C) YEAR YOUR NAME. +- Permission is granted to copy, distribute and/or modify this document +- under the terms of the GNU Free Documentation License, Version 1.3 +- or any later version published by the Free Software Foundation; +- with no Invariant Sections, no Front-Cover Texts, and no Back-Cover +- Texts. A copy of the license is included in the section entitled ``GNU +- Free Documentation License''. +- +- If you have Invariant Sections, Front-Cover Texts and Back-Cover +-Texts, replace the "with...Texts." line with this: +- +- with the Invariant Sections being LIST THEIR TITLES, with +- the Front-Cover Texts being LIST, and with the Back-Cover Texts +- being LIST. +- +- If you have Invariant Sections without Cover Texts, or some other +-combination of the three, merge those two alternatives to suit the +-situation. +- +- If your document contains nontrivial examples of program code, we +-recommend releasing these examples in parallel under your choice of +-free software license, such as the GNU General Public License, to +-permit their use in free software. +- +- +-File: bfd.info, Node: BFD Index, Prev: GNU Free Documentation License, Up: Top +- +-BFD Index +-********* +- +-[index] +-* Menu: +- +-* _bfd_final_link_relocate: Relocating the section contents. +- (line 22) +-* _bfd_generic_link_add_archive_symbols: Adding symbols from an archive. +- (line 15) +-* _bfd_generic_link_add_one_symbol: Adding symbols from an object file. +- (line 19) +-* _bfd_generic_make_empty_symbol: symbol handling functions. +- (line 92) +-* _bfd_link_add_symbols in target vector: Adding Symbols to the Hash Table. +- (line 6) +-* _bfd_link_final_link in target vector: Performing the Final Link. +- (line 6) +-* _bfd_link_hash_table_create in target vector: Creating a Linker Hash Table. +- (line 6) +-* _bfd_relocate_contents: Relocating the section contents. +- (line 22) +-* aout_SIZE_machine_type: aout. (line 147) +-* aout_SIZE_mkobject: aout. (line 139) +-* aout_SIZE_new_section_hook: aout. (line 177) +-* aout_SIZE_set_arch_mach: aout. (line 164) +-* aout_SIZE_some_aout_object_p: aout. (line 125) +-* aout_SIZE_swap_exec_header_in: aout. (line 101) +-* aout_SIZE_swap_exec_header_out: aout. (line 113) +-* arelent_chain: typedef arelent. (line 336) +-* BFD: Overview. (line 6) +-* BFD canonical format: Canonical format. (line 11) +-* bfd_alloc: Opening and Closing. +- (line 218) +-* bfd_alloc2: Opening and Closing. +- (line 227) +-* bfd_alt_mach_code: Miscellaneous. (line 308) +-* bfd_arch_bits_per_address: Architectures. (line 584) +-* bfd_arch_bits_per_byte: Architectures. (line 576) +-* bfd_arch_default_fill: Architectures. (line 665) +-* bfd_arch_get_compatible: Architectures. (line 519) +-* bfd_arch_list: Architectures. (line 510) +-* bfd_arch_mach_octets_per_byte: Architectures. (line 653) +-* BFD_ARELOC_BFIN_ADD: howto manager. (line 1120) +-* BFD_ARELOC_BFIN_ADDR: howto manager. (line 1171) +-* BFD_ARELOC_BFIN_AND: howto manager. (line 1141) +-* BFD_ARELOC_BFIN_COMP: howto manager. (line 1162) +-* BFD_ARELOC_BFIN_CONST: howto manager. (line 1117) +-* BFD_ARELOC_BFIN_DIV: howto manager. (line 1129) +-* BFD_ARELOC_BFIN_HWPAGE: howto manager. (line 1168) +-* BFD_ARELOC_BFIN_LAND: howto manager. (line 1150) +-* BFD_ARELOC_BFIN_LEN: howto manager. (line 1156) +-* BFD_ARELOC_BFIN_LOR: howto manager. (line 1153) +-* BFD_ARELOC_BFIN_LSHIFT: howto manager. (line 1135) +-* BFD_ARELOC_BFIN_MOD: howto manager. (line 1132) +-* BFD_ARELOC_BFIN_MULT: howto manager. (line 1126) +-* BFD_ARELOC_BFIN_NEG: howto manager. (line 1159) +-* BFD_ARELOC_BFIN_OR: howto manager. (line 1144) +-* BFD_ARELOC_BFIN_PAGE: howto manager. (line 1165) +-* BFD_ARELOC_BFIN_PUSH: howto manager. (line 1114) +-* BFD_ARELOC_BFIN_RSHIFT: howto manager. (line 1138) +-* BFD_ARELOC_BFIN_SUB: howto manager. (line 1123) +-* BFD_ARELOC_BFIN_XOR: howto manager. (line 1147) +-* bfd_cache_close: File Caching. (line 26) +-* bfd_cache_close_all: File Caching. (line 39) +-* bfd_cache_init: File Caching. (line 18) +-* bfd_calc_gnu_debuglink_crc32: Opening and Closing. +- (line 254) +-* bfd_canonicalize_reloc: Miscellaneous. (line 19) +-* bfd_canonicalize_symtab: symbol handling functions. +- (line 50) +-* bfd_check_format: Formats. (line 21) +-* bfd_check_format_matches: Formats. (line 52) +-* bfd_check_overflow: typedef arelent. (line 348) +-* bfd_close: Opening and Closing. +- (line 143) +-* bfd_close_all_done: Opening and Closing. +- (line 161) +-* bfd_coff_backend_data: coff. (line 305) +-* bfd_copy_private_bfd_data: Miscellaneous. (line 158) +-* bfd_copy_private_header_data: Miscellaneous. (line 140) +-* bfd_copy_private_section_data: section prototypes. (line 278) +-* bfd_copy_private_symbol_data: symbol handling functions. +- (line 140) +-* bfd_core_file_failing_command: Core Files. (line 12) +-* bfd_core_file_failing_signal: Core Files. (line 21) +-* bfd_core_file_pid: Core Files. (line 30) +-* bfd_create: Opening and Closing. +- (line 180) +-* bfd_create_gnu_debuglink_section: Opening and Closing. +- (line 363) +-* bfd_decode_symclass: symbol handling functions. +- (line 111) +-* bfd_default_arch_struct: Architectures. (line 531) +-* bfd_default_compatible: Architectures. (line 593) +-* bfd_default_reloc_type_lookup: howto manager. (line 3268) +-* bfd_default_scan: Architectures. (line 602) +-* bfd_default_set_arch_mach: Architectures. (line 549) +-* bfd_demangle: Miscellaneous. (line 359) +-* bfd_emul_get_commonpagesize: Miscellaneous. (line 339) +-* bfd_emul_get_maxpagesize: Miscellaneous. (line 319) +-* bfd_emul_set_commonpagesize: Miscellaneous. (line 350) +-* bfd_emul_set_maxpagesize: Miscellaneous. (line 330) +-* bfd_errmsg: Error reporting. (line 67) +-* bfd_fdopenr: Opening and Closing. +- (line 51) +-* bfd_fill_in_gnu_debuglink_section: Opening and Closing. +- (line 377) +-* bfd_find_target: bfd_target. (line 473) +-* bfd_find_version_for_sym: Writing the symbol table. +- (line 81) +-* bfd_follow_gnu_debugaltlink: Opening and Closing. +- (line 343) +-* bfd_follow_gnu_debuglink: Opening and Closing. +- (line 322) +-* bfd_fopen: Opening and Closing. +- (line 12) +-* bfd_format_string: Formats. (line 79) +-* bfd_generic_define_common_symbol: Writing the symbol table. +- (line 68) +-* bfd_generic_discard_group: section prototypes. (line 304) +-* bfd_generic_gc_sections: howto manager. (line 3299) +-* bfd_generic_get_relocated_section_contents: howto manager. (line 3329) +-* bfd_generic_is_group_section: section prototypes. (line 296) +-* bfd_generic_lookup_section_flags: howto manager. (line 3309) +-* bfd_generic_merge_sections: howto manager. (line 3319) +-* bfd_generic_relax_section: howto manager. (line 3286) +-* bfd_get_alt_debug_link_info: Opening and Closing. +- (line 279) +-* bfd_get_arch: Architectures. (line 560) +-* bfd_get_arch_info: Architectures. (line 612) +-* bfd_get_arch_size: Miscellaneous. (line 63) +-* bfd_get_assert_handler: Error reporting. (line 150) +-* bfd_get_debug_link_info: Opening and Closing. +- (line 268) +-* bfd_get_error: Error reporting. (line 48) +-* bfd_get_error_handler: Error reporting. (line 118) +-* bfd_get_gp_size: Miscellaneous. (line 104) +-* bfd_get_linker_section: section prototypes. (line 36) +-* bfd_get_mach: Architectures. (line 568) +-* bfd_get_mtime: Miscellaneous. (line 410) +-* bfd_get_next_mapent: Archives. (line 58) +-* bfd_get_next_section_by_name: section prototypes. (line 26) +-* bfd_get_reloc_code_name: howto manager. (line 3277) +-* bfd_get_reloc_size: typedef arelent. (line 327) +-* bfd_get_reloc_upper_bound: Miscellaneous. (line 9) +-* bfd_get_section_by_name: section prototypes. (line 17) +-* bfd_get_section_by_name_if: section prototypes. (line 45) +-* bfd_get_section_contents: section prototypes. (line 251) +-* bfd_get_sign_extend_vma: Miscellaneous. (line 76) +-* bfd_get_size <1>: Miscellaneous. (line 419) +-* bfd_get_size: Internal. (line 25) +-* bfd_get_symtab_upper_bound: symbol handling functions. +- (line 6) +-* bfd_get_target_info: bfd_target. (line 489) +-* bfd_get_unique_section_name: section prototypes. (line 64) +-* bfd_h_put_size: Internal. (line 97) +-* bfd_hash_allocate: Creating and Freeing a Hash Table. +- (line 17) +-* bfd_hash_lookup: Looking Up or Entering a String. +- (line 6) +-* bfd_hash_newfunc: Creating and Freeing a Hash Table. +- (line 12) +-* bfd_hash_set_default_size: Creating and Freeing a Hash Table. +- (line 25) +-* bfd_hash_table_free: Creating and Freeing a Hash Table. +- (line 21) +-* bfd_hash_table_init: Creating and Freeing a Hash Table. +- (line 6) +-* bfd_hash_table_init_n: Creating and Freeing a Hash Table. +- (line 6) +-* bfd_hash_traverse: Traversing a Hash Table. +- (line 6) +-* bfd_hide_sym_by_version: Writing the symbol table. +- (line 93) +-* bfd_init: Initialization. (line 11) +-* bfd_install_relocation: typedef arelent. (line 389) +-* bfd_is_local_label: symbol handling functions. +- (line 17) +-* bfd_is_local_label_name: symbol handling functions. +- (line 26) +-* bfd_is_target_special_symbol: symbol handling functions. +- (line 38) +-* bfd_is_undefined_symclass: symbol handling functions. +- (line 120) +-* bfd_link_split_section: Writing the symbol table. +- (line 44) +-* bfd_log2: Internal. (line 164) +-* bfd_lookup_arch: Architectures. (line 620) +-* bfd_make_debug_symbol: symbol handling functions. +- (line 102) +-* bfd_make_empty_symbol: symbol handling functions. +- (line 78) +-* bfd_make_readable: Opening and Closing. +- (line 204) +-* bfd_make_section: section prototypes. (line 143) +-* bfd_make_section_anyway: section prototypes. (line 114) +-* bfd_make_section_anyway_with_flags: section prototypes. (line 96) +-* bfd_make_section_old_way: section prototypes. (line 76) +-* bfd_make_section_with_flags: section prototypes. (line 130) +-* bfd_make_writable: Opening and Closing. +- (line 190) +-* bfd_malloc_and_get_section: section prototypes. (line 268) +-* bfd_map_over_sections: section prototypes. (line 178) +-* bfd_merge_private_bfd_data: Miscellaneous. (line 174) +-* bfd_mmap: Miscellaneous. (line 448) +-* bfd_octets_per_byte: Architectures. (line 643) +-* bfd_open_file: File Caching. (line 52) +-* bfd_openr: Opening and Closing. +- (line 35) +-* bfd_openr_iovec: Opening and Closing. +- (line 83) +-* bfd_openr_next_archived_file: Archives. (line 84) +-* bfd_openstreamr: Opening and Closing. +- (line 74) +-* bfd_openw: Opening and Closing. +- (line 131) +-* bfd_perform_relocation: typedef arelent. (line 364) +-* bfd_perror: Error reporting. (line 76) +-* bfd_print_symbol_vandf: symbol handling functions. +- (line 70) +-* bfd_printable_arch_mach: Architectures. (line 631) +-* bfd_printable_name: Architectures. (line 491) +-* bfd_put_size: Internal. (line 22) +-* BFD_RELOC_12_PCREL: howto manager. (line 39) +-* BFD_RELOC_14: howto manager. (line 31) +-* BFD_RELOC_16: howto manager. (line 30) +-* BFD_RELOC_16_BASEREL: howto manager. (line 99) +-* BFD_RELOC_16_GOT_PCREL: howto manager. (line 52) +-* BFD_RELOC_16_GOTOFF: howto manager. (line 55) +-* BFD_RELOC_16_PCREL: howto manager. (line 38) +-* BFD_RELOC_16_PCREL_S2: howto manager. (line 111) +-* BFD_RELOC_16_PLT_PCREL: howto manager. (line 63) +-* BFD_RELOC_16_PLTOFF: howto manager. (line 67) +-* BFD_RELOC_16C_ABS20: howto manager. (line 2236) +-* BFD_RELOC_16C_ABS20_C: howto manager. (line 2237) +-* BFD_RELOC_16C_ABS24: howto manager. (line 2238) +-* BFD_RELOC_16C_ABS24_C: howto manager. (line 2239) +-* BFD_RELOC_16C_DISP04: howto manager. (line 2216) +-* BFD_RELOC_16C_DISP04_C: howto manager. (line 2217) +-* BFD_RELOC_16C_DISP08: howto manager. (line 2218) +-* BFD_RELOC_16C_DISP08_C: howto manager. (line 2219) +-* BFD_RELOC_16C_DISP16: howto manager. (line 2220) +-* BFD_RELOC_16C_DISP16_C: howto manager. (line 2221) +-* BFD_RELOC_16C_DISP24: howto manager. (line 2222) +-* BFD_RELOC_16C_DISP24_C: howto manager. (line 2223) +-* BFD_RELOC_16C_DISP24a: howto manager. (line 2224) +-* BFD_RELOC_16C_DISP24a_C: howto manager. (line 2225) +-* BFD_RELOC_16C_IMM04: howto manager. (line 2240) +-* BFD_RELOC_16C_IMM04_C: howto manager. (line 2241) +-* BFD_RELOC_16C_IMM16: howto manager. (line 2242) +-* BFD_RELOC_16C_IMM16_C: howto manager. (line 2243) +-* BFD_RELOC_16C_IMM20: howto manager. (line 2244) +-* BFD_RELOC_16C_IMM20_C: howto manager. (line 2245) +-* BFD_RELOC_16C_IMM24: howto manager. (line 2246) +-* BFD_RELOC_16C_IMM24_C: howto manager. (line 2247) +-* BFD_RELOC_16C_IMM32: howto manager. (line 2248) +-* BFD_RELOC_16C_IMM32_C: howto manager. (line 2249) +-* BFD_RELOC_16C_NUM08: howto manager. (line 2210) +-* BFD_RELOC_16C_NUM08_C: howto manager. (line 2211) +-* BFD_RELOC_16C_NUM16: howto manager. (line 2212) +-* BFD_RELOC_16C_NUM16_C: howto manager. (line 2213) +-* BFD_RELOC_16C_NUM32: howto manager. (line 2214) +-* BFD_RELOC_16C_NUM32_C: howto manager. (line 2215) +-* BFD_RELOC_16C_REG04: howto manager. (line 2226) +-* BFD_RELOC_16C_REG04_C: howto manager. (line 2227) +-* BFD_RELOC_16C_REG04a: howto manager. (line 2228) +-* BFD_RELOC_16C_REG04a_C: howto manager. (line 2229) +-* BFD_RELOC_16C_REG14: howto manager. (line 2230) +-* BFD_RELOC_16C_REG14_C: howto manager. (line 2231) +-* BFD_RELOC_16C_REG16: howto manager. (line 2232) +-* BFD_RELOC_16C_REG16_C: howto manager. (line 2233) +-* BFD_RELOC_16C_REG20: howto manager. (line 2234) +-* BFD_RELOC_16C_REG20_C: howto manager. (line 2235) +-* BFD_RELOC_23_PCREL_S2: howto manager. (line 112) +-* BFD_RELOC_24: howto manager. (line 29) +-* BFD_RELOC_24_PCREL: howto manager. (line 37) +-* BFD_RELOC_24_PLT_PCREL: howto manager. (line 62) +-* BFD_RELOC_26: howto manager. (line 28) +-* BFD_RELOC_32: howto manager. (line 27) +-* BFD_RELOC_32_BASEREL: howto manager. (line 98) +-* BFD_RELOC_32_GOT_PCREL: howto manager. (line 51) +-* BFD_RELOC_32_GOTOFF: howto manager. (line 54) +-* BFD_RELOC_32_PCREL: howto manager. (line 36) +-* BFD_RELOC_32_PCREL_S2: howto manager. (line 110) +-* BFD_RELOC_32_PLT_PCREL: howto manager. (line 61) +-* BFD_RELOC_32_PLTOFF: howto manager. (line 66) +-* BFD_RELOC_32_SECREL: howto manager. (line 48) +-* BFD_RELOC_386_COPY: howto manager. (line 577) +-* BFD_RELOC_386_GLOB_DAT: howto manager. (line 578) +-* BFD_RELOC_386_GOT32: howto manager. (line 575) +-* BFD_RELOC_386_GOTOFF: howto manager. (line 581) +-* BFD_RELOC_386_GOTPC: howto manager. (line 582) +-* BFD_RELOC_386_IRELATIVE: howto manager. (line 598) +-* BFD_RELOC_386_JUMP_SLOT: howto manager. (line 579) +-* BFD_RELOC_386_PLT32: howto manager. (line 576) +-* BFD_RELOC_386_RELATIVE: howto manager. (line 580) +-* BFD_RELOC_386_TLS_DESC: howto manager. (line 597) +-* BFD_RELOC_386_TLS_DESC_CALL: howto manager. (line 596) +-* BFD_RELOC_386_TLS_DTPMOD32: howto manager. (line 592) +-* BFD_RELOC_386_TLS_DTPOFF32: howto manager. (line 593) +-* BFD_RELOC_386_TLS_GD: howto manager. (line 587) +-* BFD_RELOC_386_TLS_GOTDESC: howto manager. (line 595) +-* BFD_RELOC_386_TLS_GOTIE: howto manager. (line 585) +-* BFD_RELOC_386_TLS_IE: howto manager. (line 584) +-* BFD_RELOC_386_TLS_IE_32: howto manager. (line 590) +-* BFD_RELOC_386_TLS_LDM: howto manager. (line 588) +-* BFD_RELOC_386_TLS_LDO_32: howto manager. (line 589) +-* BFD_RELOC_386_TLS_LE: howto manager. (line 586) +-* BFD_RELOC_386_TLS_LE_32: howto manager. (line 591) +-* BFD_RELOC_386_TLS_TPOFF: howto manager. (line 583) +-* BFD_RELOC_386_TLS_TPOFF32: howto manager. (line 594) +-* BFD_RELOC_390_12: howto manager. (line 1819) +-* BFD_RELOC_390_20: howto manager. (line 1931) +-* BFD_RELOC_390_COPY: howto manager. (line 1828) +-* BFD_RELOC_390_GLOB_DAT: howto manager. (line 1831) +-* BFD_RELOC_390_GOT12: howto manager. (line 1822) +-* BFD_RELOC_390_GOT16: howto manager. (line 1843) +-* BFD_RELOC_390_GOT20: howto manager. (line 1932) +-* BFD_RELOC_390_GOT64: howto manager. (line 1873) +-* BFD_RELOC_390_GOTENT: howto manager. (line 1879) +-* BFD_RELOC_390_GOTOFF64: howto manager. (line 1882) +-* BFD_RELOC_390_GOTPC: howto manager. (line 1840) +-* BFD_RELOC_390_GOTPCDBL: howto manager. (line 1870) +-* BFD_RELOC_390_GOTPLT12: howto manager. (line 1885) +-* BFD_RELOC_390_GOTPLT16: howto manager. (line 1888) +-* BFD_RELOC_390_GOTPLT20: howto manager. (line 1933) +-* BFD_RELOC_390_GOTPLT32: howto manager. (line 1891) +-* BFD_RELOC_390_GOTPLT64: howto manager. (line 1894) +-* BFD_RELOC_390_GOTPLTENT: howto manager. (line 1897) +-* BFD_RELOC_390_IRELATIVE: howto manager. (line 1937) +-* BFD_RELOC_390_JMP_SLOT: howto manager. (line 1834) +-* BFD_RELOC_390_PC12DBL: howto manager. (line 1846) +-* BFD_RELOC_390_PC16DBL: howto manager. (line 1852) +-* BFD_RELOC_390_PC24DBL: howto manager. (line 1858) +-* BFD_RELOC_390_PC32DBL: howto manager. (line 1864) +-* BFD_RELOC_390_PLT12DBL: howto manager. (line 1849) +-* BFD_RELOC_390_PLT16DBL: howto manager. (line 1855) +-* BFD_RELOC_390_PLT24DBL: howto manager. (line 1861) +-* BFD_RELOC_390_PLT32: howto manager. (line 1825) +-* BFD_RELOC_390_PLT32DBL: howto manager. (line 1867) +-* BFD_RELOC_390_PLT64: howto manager. (line 1876) +-* BFD_RELOC_390_PLTOFF16: howto manager. (line 1900) +-* BFD_RELOC_390_PLTOFF32: howto manager. (line 1903) +-* BFD_RELOC_390_PLTOFF64: howto manager. (line 1906) +-* BFD_RELOC_390_RELATIVE: howto manager. (line 1837) +-* BFD_RELOC_390_TLS_DTPMOD: howto manager. (line 1926) +-* BFD_RELOC_390_TLS_DTPOFF: howto manager. (line 1927) +-* BFD_RELOC_390_TLS_GD32: howto manager. (line 1912) +-* BFD_RELOC_390_TLS_GD64: howto manager. (line 1913) +-* BFD_RELOC_390_TLS_GDCALL: howto manager. (line 1910) +-* BFD_RELOC_390_TLS_GOTIE12: howto manager. (line 1914) +-* BFD_RELOC_390_TLS_GOTIE20: howto manager. (line 1934) +-* BFD_RELOC_390_TLS_GOTIE32: howto manager. (line 1915) +-* BFD_RELOC_390_TLS_GOTIE64: howto manager. (line 1916) +-* BFD_RELOC_390_TLS_IE32: howto manager. (line 1919) +-* BFD_RELOC_390_TLS_IE64: howto manager. (line 1920) +-* BFD_RELOC_390_TLS_IEENT: howto manager. (line 1921) +-* BFD_RELOC_390_TLS_LDCALL: howto manager. (line 1911) +-* BFD_RELOC_390_TLS_LDM32: howto manager. (line 1917) +-* BFD_RELOC_390_TLS_LDM64: howto manager. (line 1918) +-* BFD_RELOC_390_TLS_LDO32: howto manager. (line 1924) +-* BFD_RELOC_390_TLS_LDO64: howto manager. (line 1925) +-* BFD_RELOC_390_TLS_LE32: howto manager. (line 1922) +-* BFD_RELOC_390_TLS_LE64: howto manager. (line 1923) +-* BFD_RELOC_390_TLS_LOAD: howto manager. (line 1909) +-* BFD_RELOC_390_TLS_TPOFF: howto manager. (line 1928) +-* BFD_RELOC_64: howto manager. (line 26) +-* BFD_RELOC_64_PCREL: howto manager. (line 35) +-* BFD_RELOC_64_PLT_PCREL: howto manager. (line 60) +-* BFD_RELOC_64_PLTOFF: howto manager. (line 65) +-* BFD_RELOC_68K_GLOB_DAT: howto manager. (line 78) +-* BFD_RELOC_68K_JMP_SLOT: howto manager. (line 79) +-* BFD_RELOC_68K_RELATIVE: howto manager. (line 80) +-* BFD_RELOC_68K_TLS_GD16: howto manager. (line 82) +-* BFD_RELOC_68K_TLS_GD32: howto manager. (line 81) +-* BFD_RELOC_68K_TLS_GD8: howto manager. (line 83) +-* BFD_RELOC_68K_TLS_IE16: howto manager. (line 91) +-* BFD_RELOC_68K_TLS_IE32: howto manager. (line 90) +-* BFD_RELOC_68K_TLS_IE8: howto manager. (line 92) +-* BFD_RELOC_68K_TLS_LDM16: howto manager. (line 85) +-* BFD_RELOC_68K_TLS_LDM32: howto manager. (line 84) +-* BFD_RELOC_68K_TLS_LDM8: howto manager. (line 86) +-* BFD_RELOC_68K_TLS_LDO16: howto manager. (line 88) +-* BFD_RELOC_68K_TLS_LDO32: howto manager. (line 87) +-* BFD_RELOC_68K_TLS_LDO8: howto manager. (line 89) +-* BFD_RELOC_68K_TLS_LE16: howto manager. (line 94) +-* BFD_RELOC_68K_TLS_LE32: howto manager. (line 93) +-* BFD_RELOC_68K_TLS_LE8: howto manager. (line 95) +-* BFD_RELOC_8: howto manager. (line 32) +-* BFD_RELOC_860_COPY: howto manager. (line 2364) +-* BFD_RELOC_860_GLOB_DAT: howto manager. (line 2365) +-* BFD_RELOC_860_HAGOT: howto manager. (line 2390) +-* BFD_RELOC_860_HAGOTOFF: howto manager. (line 2391) +-* BFD_RELOC_860_HAPC: howto manager. (line 2392) +-* BFD_RELOC_860_HIGH: howto manager. (line 2393) +-* BFD_RELOC_860_HIGHADJ: howto manager. (line 2389) +-* BFD_RELOC_860_HIGOT: howto manager. (line 2394) +-* BFD_RELOC_860_HIGOTOFF: howto manager. (line 2395) +-* BFD_RELOC_860_JUMP_SLOT: howto manager. (line 2366) +-* BFD_RELOC_860_LOGOT0: howto manager. (line 2378) +-* BFD_RELOC_860_LOGOT1: howto manager. (line 2380) +-* BFD_RELOC_860_LOGOTOFF0: howto manager. (line 2382) +-* BFD_RELOC_860_LOGOTOFF1: howto manager. (line 2384) +-* BFD_RELOC_860_LOGOTOFF2: howto manager. (line 2386) +-* BFD_RELOC_860_LOGOTOFF3: howto manager. (line 2387) +-* BFD_RELOC_860_LOPC: howto manager. (line 2388) +-* BFD_RELOC_860_LOW0: howto manager. (line 2371) +-* BFD_RELOC_860_LOW1: howto manager. (line 2373) +-* BFD_RELOC_860_LOW2: howto manager. (line 2375) +-* BFD_RELOC_860_LOW3: howto manager. (line 2377) +-* BFD_RELOC_860_PC16: howto manager. (line 2370) +-* BFD_RELOC_860_PC26: howto manager. (line 2368) +-* BFD_RELOC_860_PLT26: howto manager. (line 2369) +-* BFD_RELOC_860_RELATIVE: howto manager. (line 2367) +-* BFD_RELOC_860_SPGOT0: howto manager. (line 2379) +-* BFD_RELOC_860_SPGOT1: howto manager. (line 2381) +-* BFD_RELOC_860_SPGOTOFF0: howto manager. (line 2383) +-* BFD_RELOC_860_SPGOTOFF1: howto manager. (line 2385) +-* BFD_RELOC_860_SPLIT0: howto manager. (line 2372) +-* BFD_RELOC_860_SPLIT1: howto manager. (line 2374) +-* BFD_RELOC_860_SPLIT2: howto manager. (line 2376) +-* BFD_RELOC_8_BASEREL: howto manager. (line 103) +-* BFD_RELOC_8_FFnn: howto manager. (line 107) +-* BFD_RELOC_8_GOT_PCREL: howto manager. (line 53) +-* BFD_RELOC_8_GOTOFF: howto manager. (line 59) +-* BFD_RELOC_8_PCREL: howto manager. (line 40) +-* BFD_RELOC_8_PLT_PCREL: howto manager. (line 64) +-* BFD_RELOC_8_PLTOFF: howto manager. (line 71) +-* BFD_RELOC_AARCH64_16: howto manager. (line 2755) +-* BFD_RELOC_AARCH64_16_PCREL: howto manager. (line 2762) +-* BFD_RELOC_AARCH64_32: howto manager. (line 2754) +-* BFD_RELOC_AARCH64_32_PCREL: howto manager. (line 2761) +-* BFD_RELOC_AARCH64_64: howto manager. (line 2753) +-* BFD_RELOC_AARCH64_64_PCREL: howto manager. (line 2760) +-* BFD_RELOC_AARCH64_ADD_LO12: howto manager. (line 2827) +-* BFD_RELOC_AARCH64_ADR_GOT_PAGE: howto manager. (line 2884) +-* BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL: howto manager. (line 2822) +-* BFD_RELOC_AARCH64_ADR_HI21_PCREL: howto manager. (line 2818) +-* BFD_RELOC_AARCH64_ADR_LO21_PCREL: howto manager. (line 2814) +-* BFD_RELOC_AARCH64_BRANCH19: howto manager. (line 2842) +-* BFD_RELOC_AARCH64_CALL26: howto manager. (line 2852) +-* BFD_RELOC_AARCH64_COPY: howto manager. (line 2985) +-* BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP: howto manager. (line 3019) +-* BFD_RELOC_AARCH64_GLOB_DAT: howto manager. (line 2988) +-* BFD_RELOC_AARCH64_GOT_LD_PREL19: howto manager. (line 2877) +-* BFD_RELOC_AARCH64_IRELATIVE: howto manager. (line 3009) +-* BFD_RELOC_AARCH64_JUMP26: howto manager. (line 2847) +-* BFD_RELOC_AARCH64_JUMP_SLOT: howto manager. (line 2991) +-* BFD_RELOC_AARCH64_LD32_GOT_LO12_NC: howto manager. (line 2894) +-* BFD_RELOC_AARCH64_LD64_GOT_LO12_NC: howto manager. (line 2889) +-* BFD_RELOC_AARCH64_LD_GOT_LO12_NC: howto manager. (line 3028) +-* BFD_RELOC_AARCH64_LD_LO19_PCREL: howto manager. (line 2809) +-* BFD_RELOC_AARCH64_LDST128_LO12: howto manager. (line 2872) +-* BFD_RELOC_AARCH64_LDST16_LO12: howto manager. (line 2857) +-* BFD_RELOC_AARCH64_LDST32_LO12: howto manager. (line 2862) +-* BFD_RELOC_AARCH64_LDST64_LO12: howto manager. (line 2867) +-* BFD_RELOC_AARCH64_LDST8_LO12: howto manager. (line 2832) +-* BFD_RELOC_AARCH64_LDST_LO12: howto manager. (line 3023) +-* BFD_RELOC_AARCH64_MOVW_G0: howto manager. (line 2766) +-* BFD_RELOC_AARCH64_MOVW_G0_NC: howto manager. (line 2770) +-* BFD_RELOC_AARCH64_MOVW_G0_S: howto manager. (line 2794) +-* BFD_RELOC_AARCH64_MOVW_G1: howto manager. (line 2774) +-* BFD_RELOC_AARCH64_MOVW_G1_NC: howto manager. (line 2778) +-* BFD_RELOC_AARCH64_MOVW_G1_S: howto manager. (line 2799) +-* BFD_RELOC_AARCH64_MOVW_G2: howto manager. (line 2782) +-* BFD_RELOC_AARCH64_MOVW_G2_NC: howto manager. (line 2786) +-* BFD_RELOC_AARCH64_MOVW_G2_S: howto manager. (line 2804) +-* BFD_RELOC_AARCH64_MOVW_G3: howto manager. (line 2790) +-* BFD_RELOC_AARCH64_NONE: howto manager. (line 2750) +-* BFD_RELOC_AARCH64_RELATIVE: howto manager. (line 2994) +-* BFD_RELOC_AARCH64_RELOC_END: howto manager. (line 3012) +-* BFD_RELOC_AARCH64_RELOC_START: howto manager. (line 2744) +-* BFD_RELOC_AARCH64_TLS_DTPMOD: howto manager. (line 2997) +-* BFD_RELOC_AARCH64_TLS_DTPREL: howto manager. (line 3000) +-* BFD_RELOC_AARCH64_TLS_TPREL: howto manager. (line 3003) +-* BFD_RELOC_AARCH64_TLSDESC: howto manager. (line 3006) +-* BFD_RELOC_AARCH64_TLSDESC_ADD: howto manager. (line 2979) +-* BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: howto manager. (line 2967) +-* BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: howto manager. (line 2958) +-* BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21: howto manager. (line 2955) +-* BFD_RELOC_AARCH64_TLSDESC_CALL: howto manager. (line 2982) +-* BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC: howto manager. (line 2964) +-* BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC: howto manager. (line 2961) +-* BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC: howto manager. (line 3036) +-* BFD_RELOC_AARCH64_TLSDESC_LD_PREL19: howto manager. (line 2952) +-* BFD_RELOC_AARCH64_TLSDESC_LDR: howto manager. (line 2976) +-* BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC: howto manager. (line 2973) +-* BFD_RELOC_AARCH64_TLSDESC_OFF_G1: howto manager. (line 2970) +-* BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: howto manager. (line 2905) +-* BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: howto manager. (line 2899) +-* BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: howto manager. +- (line 2916) +-* BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC: howto manager. +- (line 2922) +-* BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: howto manager. +- (line 2919) +-* BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC: howto manager. +- (line 3032) +-* BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19: howto manager. (line 2925) +-* BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC: howto manager. +- (line 2913) +-* BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1: howto manager. (line 2910) +-* BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12: howto manager. (line 2943) +-* BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12: howto manager. (line 2946) +-* BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC: howto manager. (line 2949) +-* BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0: howto manager. (line 2937) +-* BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC: howto manager. (line 2940) +-* BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1: howto manager. (line 2931) +-* BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC: howto manager. (line 2934) +-* BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2: howto manager. (line 2928) +-* BFD_RELOC_AARCH64_TSTBR14: howto manager. (line 2837) +-* BFD_RELOC_ALPHA_BOH: howto manager. (line 323) +-* BFD_RELOC_ALPHA_BRSGP: howto manager. (line 306) +-* BFD_RELOC_ALPHA_BSR: howto manager. (line 315) +-* BFD_RELOC_ALPHA_CODEADDR: howto manager. (line 297) +-* BFD_RELOC_ALPHA_DTPMOD64: howto manager. (line 329) +-* BFD_RELOC_ALPHA_DTPREL16: howto manager. (line 334) +-* BFD_RELOC_ALPHA_DTPREL64: howto manager. (line 331) +-* BFD_RELOC_ALPHA_DTPREL_HI16: howto manager. (line 332) +-* BFD_RELOC_ALPHA_DTPREL_LO16: howto manager. (line 333) +-* BFD_RELOC_ALPHA_ELF_LITERAL: howto manager. (line 262) +-* BFD_RELOC_ALPHA_GOTDTPREL16: howto manager. (line 330) +-* BFD_RELOC_ALPHA_GOTTPREL16: howto manager. (line 335) +-* BFD_RELOC_ALPHA_GPDISP: howto manager. (line 256) +-* BFD_RELOC_ALPHA_GPDISP_HI16: howto manager. (line 242) +-* BFD_RELOC_ALPHA_GPDISP_LO16: howto manager. (line 250) +-* BFD_RELOC_ALPHA_GPREL_HI16: howto manager. (line 301) +-* BFD_RELOC_ALPHA_GPREL_LO16: howto manager. (line 302) +-* BFD_RELOC_ALPHA_HINT: howto manager. (line 288) +-* BFD_RELOC_ALPHA_LDA: howto manager. (line 319) +-* BFD_RELOC_ALPHA_LINKAGE: howto manager. (line 293) +-* BFD_RELOC_ALPHA_LITERAL: howto manager. (line 261) +-* BFD_RELOC_ALPHA_LITUSE: howto manager. (line 263) +-* BFD_RELOC_ALPHA_NOP: howto manager. (line 311) +-* BFD_RELOC_ALPHA_TLSGD: howto manager. (line 327) +-* BFD_RELOC_ALPHA_TLSLDM: howto manager. (line 328) +-* BFD_RELOC_ALPHA_TPREL16: howto manager. (line 339) +-* BFD_RELOC_ALPHA_TPREL64: howto manager. (line 336) +-* BFD_RELOC_ALPHA_TPREL_HI16: howto manager. (line 337) +-* BFD_RELOC_ALPHA_TPREL_LO16: howto manager. (line 338) +-* BFD_RELOC_ARC_B22_PCREL: howto manager. (line 1049) +-* BFD_RELOC_ARC_B26: howto manager. (line 1054) +-* BFD_RELOC_ARM_ADR_IMM: howto manager. (line 935) +-* BFD_RELOC_ARM_ADRL_IMMEDIATE: howto manager. (line 921) +-* BFD_RELOC_ARM_ALU_PC_G0: howto manager. (line 885) +-* BFD_RELOC_ARM_ALU_PC_G0_NC: howto manager. (line 884) +-* BFD_RELOC_ARM_ALU_PC_G1: howto manager. (line 887) +-* BFD_RELOC_ARM_ALU_PC_G1_NC: howto manager. (line 886) +-* BFD_RELOC_ARM_ALU_PC_G2: howto manager. (line 888) +-* BFD_RELOC_ARM_ALU_SB_G0: howto manager. (line 899) +-* BFD_RELOC_ARM_ALU_SB_G0_NC: howto manager. (line 898) +-* BFD_RELOC_ARM_ALU_SB_G1: howto manager. (line 901) +-* BFD_RELOC_ARM_ALU_SB_G1_NC: howto manager. (line 900) +-* BFD_RELOC_ARM_ALU_SB_G2: howto manager. (line 902) +-* BFD_RELOC_ARM_CP_OFF_IMM: howto manager. (line 931) +-* BFD_RELOC_ARM_CP_OFF_IMM_S2: howto manager. (line 932) +-* BFD_RELOC_ARM_GLOB_DAT: howto manager. (line 859) +-* BFD_RELOC_ARM_GOT32: howto manager. (line 860) +-* BFD_RELOC_ARM_GOT_PREL: howto manager. (line 865) +-* BFD_RELOC_ARM_GOTOFF: howto manager. (line 863) +-* BFD_RELOC_ARM_GOTPC: howto manager. (line 864) +-* BFD_RELOC_ARM_HVC: howto manager. (line 928) +-* BFD_RELOC_ARM_HWLITERAL: howto manager. (line 942) +-* BFD_RELOC_ARM_IMMEDIATE: howto manager. (line 920) +-* BFD_RELOC_ARM_IN_POOL: howto manager. (line 938) +-* BFD_RELOC_ARM_IRELATIVE: howto manager. (line 917) +-* BFD_RELOC_ARM_JUMP_SLOT: howto manager. (line 858) +-* BFD_RELOC_ARM_LDC_PC_G0: howto manager. (line 895) +-* BFD_RELOC_ARM_LDC_PC_G1: howto manager. (line 896) +-* BFD_RELOC_ARM_LDC_PC_G2: howto manager. (line 897) +-* BFD_RELOC_ARM_LDC_SB_G0: howto manager. (line 909) +-* BFD_RELOC_ARM_LDC_SB_G1: howto manager. (line 910) +-* BFD_RELOC_ARM_LDC_SB_G2: howto manager. (line 911) +-* BFD_RELOC_ARM_LDR_IMM: howto manager. (line 936) +-* BFD_RELOC_ARM_LDR_PC_G0: howto manager. (line 889) +-* BFD_RELOC_ARM_LDR_PC_G1: howto manager. (line 890) +-* BFD_RELOC_ARM_LDR_PC_G2: howto manager. (line 891) +-* BFD_RELOC_ARM_LDR_SB_G0: howto manager. (line 903) +-* BFD_RELOC_ARM_LDR_SB_G1: howto manager. (line 904) +-* BFD_RELOC_ARM_LDR_SB_G2: howto manager. (line 905) +-* BFD_RELOC_ARM_LDRS_PC_G0: howto manager. (line 892) +-* BFD_RELOC_ARM_LDRS_PC_G1: howto manager. (line 893) +-* BFD_RELOC_ARM_LDRS_PC_G2: howto manager. (line 894) +-* BFD_RELOC_ARM_LDRS_SB_G0: howto manager. (line 906) +-* BFD_RELOC_ARM_LDRS_SB_G1: howto manager. (line 907) +-* BFD_RELOC_ARM_LDRS_SB_G2: howto manager. (line 908) +-* BFD_RELOC_ARM_LITERAL: howto manager. (line 937) +-* BFD_RELOC_ARM_MOVT: howto manager. (line 849) +-* BFD_RELOC_ARM_MOVT_PCREL: howto manager. (line 851) +-* BFD_RELOC_ARM_MOVW: howto manager. (line 848) +-* BFD_RELOC_ARM_MOVW_PCREL: howto manager. (line 850) +-* BFD_RELOC_ARM_MULTI: howto manager. (line 930) +-* BFD_RELOC_ARM_OFFSET_IMM: howto manager. (line 822) +-* BFD_RELOC_ARM_OFFSET_IMM8: howto manager. (line 939) +-* BFD_RELOC_ARM_PCREL_BLX: howto manager. (line 793) +-* BFD_RELOC_ARM_PCREL_BRANCH: howto manager. (line 789) +-* BFD_RELOC_ARM_PCREL_CALL: howto manager. (line 803) +-* BFD_RELOC_ARM_PCREL_JUMP: howto manager. (line 807) +-* BFD_RELOC_ARM_PLT32: howto manager. (line 861) +-* BFD_RELOC_ARM_PREL31: howto manager. (line 845) +-* BFD_RELOC_ARM_RELATIVE: howto manager. (line 862) +-* BFD_RELOC_ARM_ROSEGREL32: howto manager. (line 834) +-* BFD_RELOC_ARM_SBREL32: howto manager. (line 837) +-* BFD_RELOC_ARM_SHIFT_IMM: howto manager. (line 926) +-* BFD_RELOC_ARM_SMC: howto manager. (line 927) +-* BFD_RELOC_ARM_SWI: howto manager. (line 929) +-* BFD_RELOC_ARM_T32_ADD_IMM: howto manager. (line 923) +-* BFD_RELOC_ARM_T32_ADD_PC12: howto manager. (line 925) +-* BFD_RELOC_ARM_T32_CP_OFF_IMM: howto manager. (line 933) +-* BFD_RELOC_ARM_T32_CP_OFF_IMM_S2: howto manager. (line 934) +-* BFD_RELOC_ARM_T32_IMM12: howto manager. (line 924) +-* BFD_RELOC_ARM_T32_IMMEDIATE: howto manager. (line 922) +-* BFD_RELOC_ARM_T32_OFFSET_IMM: howto manager. (line 941) +-* BFD_RELOC_ARM_T32_OFFSET_U8: howto manager. (line 940) +-* BFD_RELOC_ARM_TARGET1: howto manager. (line 830) +-* BFD_RELOC_ARM_TARGET2: howto manager. (line 840) +-* BFD_RELOC_ARM_THM_TLS_CALL: howto manager. (line 878) +-* BFD_RELOC_ARM_THM_TLS_DESCSEQ: howto manager. (line 880) +-* BFD_RELOC_ARM_THUMB_ADD: howto manager. (line 943) +-* BFD_RELOC_ARM_THUMB_IMM: howto manager. (line 944) +-* BFD_RELOC_ARM_THUMB_MOVT: howto manager. (line 853) +-* BFD_RELOC_ARM_THUMB_MOVT_PCREL: howto manager. (line 855) +-* BFD_RELOC_ARM_THUMB_MOVW: howto manager. (line 852) +-* BFD_RELOC_ARM_THUMB_MOVW_PCREL: howto manager. (line 854) +-* BFD_RELOC_ARM_THUMB_OFFSET: howto manager. (line 826) +-* BFD_RELOC_ARM_THUMB_SHIFT: howto manager. (line 945) +-* BFD_RELOC_ARM_TLS_CALL: howto manager. (line 877) +-* BFD_RELOC_ARM_TLS_DESC: howto manager. (line 881) +-* BFD_RELOC_ARM_TLS_DESCSEQ: howto manager. (line 879) +-* BFD_RELOC_ARM_TLS_DTPMOD32: howto manager. (line 872) +-* BFD_RELOC_ARM_TLS_DTPOFF32: howto manager. (line 871) +-* BFD_RELOC_ARM_TLS_GD32: howto manager. (line 868) +-* BFD_RELOC_ARM_TLS_GOTDESC: howto manager. (line 876) +-* BFD_RELOC_ARM_TLS_IE32: howto manager. (line 874) +-* BFD_RELOC_ARM_TLS_LDM32: howto manager. (line 870) +-* BFD_RELOC_ARM_TLS_LDO32: howto manager. (line 869) +-* BFD_RELOC_ARM_TLS_LE32: howto manager. (line 875) +-* BFD_RELOC_ARM_TLS_TPOFF32: howto manager. (line 873) +-* BFD_RELOC_ARM_V4BX: howto manager. (line 914) +-* BFD_RELOC_AVR_13_PCREL: howto manager. (line 1644) +-* BFD_RELOC_AVR_16_PM: howto manager. (line 1648) +-* BFD_RELOC_AVR_6: howto manager. (line 1735) +-* BFD_RELOC_AVR_6_ADIW: howto manager. (line 1739) +-* BFD_RELOC_AVR_7_PCREL: howto manager. (line 1640) +-* BFD_RELOC_AVR_8_HI: howto manager. (line 1747) +-* BFD_RELOC_AVR_8_HLO: howto manager. (line 1751) +-* BFD_RELOC_AVR_8_LO: howto manager. (line 1743) +-* BFD_RELOC_AVR_CALL: howto manager. (line 1727) +-* BFD_RELOC_AVR_HH8_LDI: howto manager. (line 1660) +-* BFD_RELOC_AVR_HH8_LDI_NEG: howto manager. (line 1679) +-* BFD_RELOC_AVR_HH8_LDI_PM: howto manager. (line 1708) +-* BFD_RELOC_AVR_HH8_LDI_PM_NEG: howto manager. (line 1722) +-* BFD_RELOC_AVR_HI8_LDI: howto manager. (line 1656) +-* BFD_RELOC_AVR_HI8_LDI_GS: howto manager. (line 1702) +-* BFD_RELOC_AVR_HI8_LDI_NEG: howto manager. (line 1674) +-* BFD_RELOC_AVR_HI8_LDI_PM: howto manager. (line 1698) +-* BFD_RELOC_AVR_HI8_LDI_PM_NEG: howto manager. (line 1717) +-* BFD_RELOC_AVR_LDI: howto manager. (line 1731) +-* BFD_RELOC_AVR_LO8_LDI: howto manager. (line 1652) +-* BFD_RELOC_AVR_LO8_LDI_GS: howto manager. (line 1692) +-* BFD_RELOC_AVR_LO8_LDI_NEG: howto manager. (line 1669) +-* BFD_RELOC_AVR_LO8_LDI_PM: howto manager. (line 1688) +-* BFD_RELOC_AVR_LO8_LDI_PM_NEG: howto manager. (line 1713) +-* BFD_RELOC_AVR_MS8_LDI: howto manager. (line 1665) +-* BFD_RELOC_AVR_MS8_LDI_NEG: howto manager. (line 1684) +-* BFD_RELOC_BFIN_10_PCREL: howto manager. (line 1074) +-* BFD_RELOC_BFIN_11_PCREL: howto manager. (line 1077) +-* BFD_RELOC_BFIN_12_PCREL_JUMP: howto manager. (line 1080) +-* BFD_RELOC_BFIN_12_PCREL_JUMP_S: howto manager. (line 1083) +-* BFD_RELOC_BFIN_16_HIGH: howto manager. (line 1062) +-* BFD_RELOC_BFIN_16_IMM: howto manager. (line 1059) +-* BFD_RELOC_BFIN_16_LOW: howto manager. (line 1071) +-* BFD_RELOC_BFIN_24_PCREL_CALL_X: howto manager. (line 1086) +-* BFD_RELOC_BFIN_24_PCREL_JUMP_L: howto manager. (line 1089) +-* BFD_RELOC_BFIN_4_PCREL: howto manager. (line 1065) +-* BFD_RELOC_BFIN_5_PCREL: howto manager. (line 1068) +-* BFD_RELOC_BFIN_FUNCDESC: howto manager. (line 1095) +-* BFD_RELOC_BFIN_FUNCDESC_GOT17M4: howto manager. (line 1096) +-* BFD_RELOC_BFIN_FUNCDESC_GOTHI: howto manager. (line 1097) +-* BFD_RELOC_BFIN_FUNCDESC_GOTLO: howto manager. (line 1098) +-* BFD_RELOC_BFIN_FUNCDESC_GOTOFF17M4: howto manager. (line 1100) +-* BFD_RELOC_BFIN_FUNCDESC_GOTOFFHI: howto manager. (line 1101) +-* BFD_RELOC_BFIN_FUNCDESC_GOTOFFLO: howto manager. (line 1102) +-* BFD_RELOC_BFIN_FUNCDESC_VALUE: howto manager. (line 1099) +-* BFD_RELOC_BFIN_GOT: howto manager. (line 1108) +-* BFD_RELOC_BFIN_GOT17M4: howto manager. (line 1092) +-* BFD_RELOC_BFIN_GOTHI: howto manager. (line 1093) +-* BFD_RELOC_BFIN_GOTLO: howto manager. (line 1094) +-* BFD_RELOC_BFIN_GOTOFF17M4: howto manager. (line 1103) +-* BFD_RELOC_BFIN_GOTOFFHI: howto manager. (line 1104) +-* BFD_RELOC_BFIN_GOTOFFLO: howto manager. (line 1105) +-* BFD_RELOC_BFIN_PLTPC: howto manager. (line 1111) +-* BFD_RELOC_C6000_ABS_H16: howto manager. (line 1463) +-* BFD_RELOC_C6000_ABS_L16: howto manager. (line 1462) +-* BFD_RELOC_C6000_ABS_S16: howto manager. (line 1461) +-* BFD_RELOC_C6000_ALIGN: howto manager. (line 1484) +-* BFD_RELOC_C6000_COPY: howto manager. (line 1479) +-* BFD_RELOC_C6000_DSBT_INDEX: howto manager. (line 1477) +-* BFD_RELOC_C6000_EHTYPE: howto manager. (line 1481) +-* BFD_RELOC_C6000_FPHEAD: howto manager. (line 1485) +-* BFD_RELOC_C6000_JUMP_SLOT: howto manager. (line 1480) +-* BFD_RELOC_C6000_NOCMP: howto manager. (line 1486) +-* BFD_RELOC_C6000_PCR_H16: howto manager. (line 1482) +-* BFD_RELOC_C6000_PCR_L16: howto manager. (line 1483) +-* BFD_RELOC_C6000_PCR_S10: howto manager. (line 1459) +-* BFD_RELOC_C6000_PCR_S12: howto manager. (line 1458) +-* BFD_RELOC_C6000_PCR_S21: howto manager. (line 1457) +-* BFD_RELOC_C6000_PCR_S7: howto manager. (line 1460) +-* BFD_RELOC_C6000_PREL31: howto manager. (line 1478) +-* BFD_RELOC_C6000_SBR_GOT_H16_W: howto manager. (line 1476) +-* BFD_RELOC_C6000_SBR_GOT_L16_W: howto manager. (line 1475) +-* BFD_RELOC_C6000_SBR_GOT_U15_W: howto manager. (line 1474) +-* BFD_RELOC_C6000_SBR_H16_B: howto manager. (line 1471) +-* BFD_RELOC_C6000_SBR_H16_H: howto manager. (line 1472) +-* BFD_RELOC_C6000_SBR_H16_W: howto manager. (line 1473) +-* BFD_RELOC_C6000_SBR_L16_B: howto manager. (line 1468) +-* BFD_RELOC_C6000_SBR_L16_H: howto manager. (line 1469) +-* BFD_RELOC_C6000_SBR_L16_W: howto manager. (line 1470) +-* BFD_RELOC_C6000_SBR_S16: howto manager. (line 1467) +-* BFD_RELOC_C6000_SBR_U15_B: howto manager. (line 1464) +-* BFD_RELOC_C6000_SBR_U15_H: howto manager. (line 1465) +-* BFD_RELOC_C6000_SBR_U15_W: howto manager. (line 1466) +-* bfd_reloc_code_type: howto manager. (line 10) +-* BFD_RELOC_CR16_ABS20: howto manager. (line 2264) +-* BFD_RELOC_CR16_ABS24: howto manager. (line 2265) +-* BFD_RELOC_CR16_DISP16: howto manager. (line 2275) +-* BFD_RELOC_CR16_DISP20: howto manager. (line 2276) +-* BFD_RELOC_CR16_DISP24: howto manager. (line 2277) +-* BFD_RELOC_CR16_DISP24a: howto manager. (line 2278) +-* BFD_RELOC_CR16_DISP4: howto manager. (line 2273) +-* BFD_RELOC_CR16_DISP8: howto manager. (line 2274) +-* BFD_RELOC_CR16_GLOB_DAT: howto manager. (line 2284) +-* BFD_RELOC_CR16_GOT_REGREL20: howto manager. (line 2282) +-* BFD_RELOC_CR16_GOTC_REGREL20: howto manager. (line 2283) +-* BFD_RELOC_CR16_IMM16: howto manager. (line 2268) +-* BFD_RELOC_CR16_IMM20: howto manager. (line 2269) +-* BFD_RELOC_CR16_IMM24: howto manager. (line 2270) +-* BFD_RELOC_CR16_IMM32: howto manager. (line 2271) +-* BFD_RELOC_CR16_IMM32a: howto manager. (line 2272) +-* BFD_RELOC_CR16_IMM4: howto manager. (line 2266) +-* BFD_RELOC_CR16_IMM8: howto manager. (line 2267) +-* BFD_RELOC_CR16_NUM16: howto manager. (line 2253) +-* BFD_RELOC_CR16_NUM32: howto manager. (line 2254) +-* BFD_RELOC_CR16_NUM32a: howto manager. (line 2255) +-* BFD_RELOC_CR16_NUM8: howto manager. (line 2252) +-* BFD_RELOC_CR16_REGREL0: howto manager. (line 2256) +-* BFD_RELOC_CR16_REGREL14: howto manager. (line 2259) +-* BFD_RELOC_CR16_REGREL14a: howto manager. (line 2260) +-* BFD_RELOC_CR16_REGREL16: howto manager. (line 2261) +-* BFD_RELOC_CR16_REGREL20: howto manager. (line 2262) +-* BFD_RELOC_CR16_REGREL20a: howto manager. (line 2263) +-* BFD_RELOC_CR16_REGREL4: howto manager. (line 2257) +-* BFD_RELOC_CR16_REGREL4a: howto manager. (line 2258) +-* BFD_RELOC_CR16_SWITCH16: howto manager. (line 2280) +-* BFD_RELOC_CR16_SWITCH32: howto manager. (line 2281) +-* BFD_RELOC_CR16_SWITCH8: howto manager. (line 2279) +-* BFD_RELOC_CRIS_16_DTPREL: howto manager. (line 2355) +-* BFD_RELOC_CRIS_16_GOT: howto manager. (line 2331) +-* BFD_RELOC_CRIS_16_GOT_GD: howto manager. (line 2351) +-* BFD_RELOC_CRIS_16_GOT_TPREL: howto manager. (line 2357) +-* BFD_RELOC_CRIS_16_GOTPLT: howto manager. (line 2337) +-* BFD_RELOC_CRIS_16_TPREL: howto manager. (line 2359) +-* BFD_RELOC_CRIS_32_DTPREL: howto manager. (line 2354) +-* BFD_RELOC_CRIS_32_GD: howto manager. (line 2352) +-* BFD_RELOC_CRIS_32_GOT: howto manager. (line 2328) +-* BFD_RELOC_CRIS_32_GOT_GD: howto manager. (line 2350) +-* BFD_RELOC_CRIS_32_GOT_TPREL: howto manager. (line 2356) +-* BFD_RELOC_CRIS_32_GOTPLT: howto manager. (line 2334) +-* BFD_RELOC_CRIS_32_GOTREL: howto manager. (line 2340) +-* BFD_RELOC_CRIS_32_IE: howto manager. (line 2361) +-* BFD_RELOC_CRIS_32_PLT_GOTREL: howto manager. (line 2343) +-* BFD_RELOC_CRIS_32_PLT_PCREL: howto manager. (line 2346) +-* BFD_RELOC_CRIS_32_TPREL: howto manager. (line 2358) +-* BFD_RELOC_CRIS_BDISP8: howto manager. (line 2309) +-* BFD_RELOC_CRIS_COPY: howto manager. (line 2322) +-* BFD_RELOC_CRIS_DTP: howto manager. (line 2353) +-* BFD_RELOC_CRIS_DTPMOD: howto manager. (line 2360) +-* BFD_RELOC_CRIS_GLOB_DAT: howto manager. (line 2323) +-* BFD_RELOC_CRIS_JUMP_SLOT: howto manager. (line 2324) +-* BFD_RELOC_CRIS_LAPCQ_OFFSET: howto manager. (line 2317) +-* BFD_RELOC_CRIS_RELATIVE: howto manager. (line 2325) +-* BFD_RELOC_CRIS_SIGNED_16: howto manager. (line 2315) +-* BFD_RELOC_CRIS_SIGNED_6: howto manager. (line 2311) +-* BFD_RELOC_CRIS_SIGNED_8: howto manager. (line 2313) +-* BFD_RELOC_CRIS_UNSIGNED_16: howto manager. (line 2316) +-* BFD_RELOC_CRIS_UNSIGNED_4: howto manager. (line 2318) +-* BFD_RELOC_CRIS_UNSIGNED_5: howto manager. (line 2310) +-* BFD_RELOC_CRIS_UNSIGNED_6: howto manager. (line 2312) +-* BFD_RELOC_CRIS_UNSIGNED_8: howto manager. (line 2314) +-* BFD_RELOC_CRX_ABS16: howto manager. (line 2297) +-* BFD_RELOC_CRX_ABS32: howto manager. (line 2298) +-* BFD_RELOC_CRX_IMM16: howto manager. (line 2302) +-* BFD_RELOC_CRX_IMM32: howto manager. (line 2303) +-* BFD_RELOC_CRX_NUM16: howto manager. (line 2300) +-* BFD_RELOC_CRX_NUM32: howto manager. (line 2301) +-* BFD_RELOC_CRX_NUM8: howto manager. (line 2299) +-* BFD_RELOC_CRX_REGREL12: howto manager. (line 2293) +-* BFD_RELOC_CRX_REGREL22: howto manager. (line 2294) +-* BFD_RELOC_CRX_REGREL28: howto manager. (line 2295) +-* BFD_RELOC_CRX_REGREL32: howto manager. (line 2296) +-* BFD_RELOC_CRX_REL16: howto manager. (line 2290) +-* BFD_RELOC_CRX_REL24: howto manager. (line 2291) +-* BFD_RELOC_CRX_REL32: howto manager. (line 2292) +-* BFD_RELOC_CRX_REL4: howto manager. (line 2287) +-* BFD_RELOC_CRX_REL8: howto manager. (line 2288) +-* BFD_RELOC_CRX_REL8_CMP: howto manager. (line 2289) +-* BFD_RELOC_CRX_SWITCH16: howto manager. (line 2305) +-* BFD_RELOC_CRX_SWITCH32: howto manager. (line 2306) +-* BFD_RELOC_CRX_SWITCH8: howto manager. (line 2304) +-* BFD_RELOC_CTOR: howto manager. (line 783) +-* BFD_RELOC_D10V_10_PCREL_L: howto manager. (line 1178) +-* BFD_RELOC_D10V_10_PCREL_R: howto manager. (line 1174) +-* BFD_RELOC_D10V_18: howto manager. (line 1183) +-* BFD_RELOC_D10V_18_PCREL: howto manager. (line 1186) +-* BFD_RELOC_D30V_15: howto manager. (line 1201) +-* BFD_RELOC_D30V_15_PCREL: howto manager. (line 1205) +-* BFD_RELOC_D30V_15_PCREL_R: howto manager. (line 1209) +-* BFD_RELOC_D30V_21: howto manager. (line 1214) +-* BFD_RELOC_D30V_21_PCREL: howto manager. (line 1218) +-* BFD_RELOC_D30V_21_PCREL_R: howto manager. (line 1222) +-* BFD_RELOC_D30V_32: howto manager. (line 1227) +-* BFD_RELOC_D30V_32_PCREL: howto manager. (line 1230) +-* BFD_RELOC_D30V_6: howto manager. (line 1189) +-* BFD_RELOC_D30V_9_PCREL: howto manager. (line 1192) +-* BFD_RELOC_D30V_9_PCREL_R: howto manager. (line 1196) +-* BFD_RELOC_DLX_HI16_S: howto manager. (line 1233) +-* BFD_RELOC_DLX_JMP26: howto manager. (line 1239) +-* BFD_RELOC_DLX_LO16: howto manager. (line 1236) +-* BFD_RELOC_EPIPHANY_HIGH: howto manager. (line 3238) +-* BFD_RELOC_EPIPHANY_IMM11: howto manager. (line 3247) +-* BFD_RELOC_EPIPHANY_IMM8: howto manager. (line 3251) +-* BFD_RELOC_EPIPHANY_LOW: howto manager. (line 3241) +-* BFD_RELOC_EPIPHANY_SIMM11: howto manager. (line 3244) +-* BFD_RELOC_EPIPHANY_SIMM24: howto manager. (line 3235) +-* BFD_RELOC_EPIPHANY_SIMM8: howto manager. (line 3232) +-* BFD_RELOC_FR30_10_IN_8: howto manager. (line 1508) +-* BFD_RELOC_FR30_12_PCREL: howto manager. (line 1516) +-* BFD_RELOC_FR30_20: howto manager. (line 1492) +-* BFD_RELOC_FR30_48: howto manager. (line 1489) +-* BFD_RELOC_FR30_6_IN_4: howto manager. (line 1496) +-* BFD_RELOC_FR30_8_IN_8: howto manager. (line 1500) +-* BFD_RELOC_FR30_9_IN_8: howto manager. (line 1504) +-* BFD_RELOC_FR30_9_PCREL: howto manager. (line 1512) +-* BFD_RELOC_FRV_FUNCDESC: howto manager. (line 491) +-* BFD_RELOC_FRV_FUNCDESC_GOT12: howto manager. (line 492) +-* BFD_RELOC_FRV_FUNCDESC_GOTHI: howto manager. (line 493) +-* BFD_RELOC_FRV_FUNCDESC_GOTLO: howto manager. (line 494) +-* BFD_RELOC_FRV_FUNCDESC_GOTOFF12: howto manager. (line 496) +-* BFD_RELOC_FRV_FUNCDESC_GOTOFFHI: howto manager. (line 497) +-* BFD_RELOC_FRV_FUNCDESC_GOTOFFLO: howto manager. (line 498) +-* BFD_RELOC_FRV_FUNCDESC_VALUE: howto manager. (line 495) +-* BFD_RELOC_FRV_GETTLSOFF: howto manager. (line 502) +-* BFD_RELOC_FRV_GETTLSOFF_RELAX: howto manager. (line 515) +-* BFD_RELOC_FRV_GOT12: howto manager. (line 488) +-* BFD_RELOC_FRV_GOTHI: howto manager. (line 489) +-* BFD_RELOC_FRV_GOTLO: howto manager. (line 490) +-* BFD_RELOC_FRV_GOTOFF12: howto manager. (line 499) +-* BFD_RELOC_FRV_GOTOFFHI: howto manager. (line 500) +-* BFD_RELOC_FRV_GOTOFFLO: howto manager. (line 501) +-* BFD_RELOC_FRV_GOTTLSDESC12: howto manager. (line 504) +-* BFD_RELOC_FRV_GOTTLSDESCHI: howto manager. (line 505) +-* BFD_RELOC_FRV_GOTTLSDESCLO: howto manager. (line 506) +-* BFD_RELOC_FRV_GOTTLSOFF12: howto manager. (line 510) +-* BFD_RELOC_FRV_GOTTLSOFFHI: howto manager. (line 511) +-* BFD_RELOC_FRV_GOTTLSOFFLO: howto manager. (line 512) +-* BFD_RELOC_FRV_GPREL12: howto manager. (line 483) +-* BFD_RELOC_FRV_GPREL32: howto manager. (line 485) +-* BFD_RELOC_FRV_GPRELHI: howto manager. (line 486) +-* BFD_RELOC_FRV_GPRELLO: howto manager. (line 487) +-* BFD_RELOC_FRV_GPRELU12: howto manager. (line 484) +-* BFD_RELOC_FRV_HI16: howto manager. (line 482) +-* BFD_RELOC_FRV_LABEL16: howto manager. (line 479) +-* BFD_RELOC_FRV_LABEL24: howto manager. (line 480) +-* BFD_RELOC_FRV_LO16: howto manager. (line 481) +-* BFD_RELOC_FRV_TLSDESC_RELAX: howto manager. (line 514) +-* BFD_RELOC_FRV_TLSDESC_VALUE: howto manager. (line 503) +-* BFD_RELOC_FRV_TLSMOFF: howto manager. (line 517) +-* BFD_RELOC_FRV_TLSMOFF12: howto manager. (line 507) +-* BFD_RELOC_FRV_TLSMOFFHI: howto manager. (line 508) +-* BFD_RELOC_FRV_TLSMOFFLO: howto manager. (line 509) +-* BFD_RELOC_FRV_TLSOFF: howto manager. (line 513) +-* BFD_RELOC_FRV_TLSOFF_RELAX: howto manager. (line 516) +-* BFD_RELOC_GPREL16: howto manager. (line 125) +-* BFD_RELOC_GPREL32: howto manager. (line 126) +-* BFD_RELOC_H8_DIR16A8: howto manager. (line 2402) +-* BFD_RELOC_H8_DIR16R8: howto manager. (line 2403) +-* BFD_RELOC_H8_DIR24A8: howto manager. (line 2404) +-* BFD_RELOC_H8_DIR24R8: howto manager. (line 2405) +-* BFD_RELOC_H8_DIR32A16: howto manager. (line 2406) +-* BFD_RELOC_H8_DISP32A16: howto manager. (line 2407) +-* BFD_RELOC_HI16: howto manager. (line 352) +-* BFD_RELOC_HI16_BASEREL: howto manager. (line 101) +-* BFD_RELOC_HI16_GOTOFF: howto manager. (line 57) +-* BFD_RELOC_HI16_PCREL: howto manager. (line 364) +-* BFD_RELOC_HI16_PLTOFF: howto manager. (line 69) +-* BFD_RELOC_HI16_S: howto manager. (line 355) +-* BFD_RELOC_HI16_S_BASEREL: howto manager. (line 102) +-* BFD_RELOC_HI16_S_GOTOFF: howto manager. (line 58) +-* BFD_RELOC_HI16_S_PCREL: howto manager. (line 367) +-* BFD_RELOC_HI16_S_PLTOFF: howto manager. (line 70) +-* BFD_RELOC_HI22: howto manager. (line 120) +-* BFD_RELOC_I370_D12: howto manager. (line 780) +-* BFD_RELOC_I960_CALLJ: howto manager. (line 132) +-* BFD_RELOC_IA64_COPY: howto manager. (line 2084) +-* BFD_RELOC_IA64_DIR32LSB: howto manager. (line 2029) +-* BFD_RELOC_IA64_DIR32MSB: howto manager. (line 2028) +-* BFD_RELOC_IA64_DIR64LSB: howto manager. (line 2031) +-* BFD_RELOC_IA64_DIR64MSB: howto manager. (line 2030) +-* BFD_RELOC_IA64_DTPMOD64LSB: howto manager. (line 2094) +-* BFD_RELOC_IA64_DTPMOD64MSB: howto manager. (line 2093) +-* BFD_RELOC_IA64_DTPREL14: howto manager. (line 2096) +-* BFD_RELOC_IA64_DTPREL22: howto manager. (line 2097) +-* BFD_RELOC_IA64_DTPREL32LSB: howto manager. (line 2100) +-* BFD_RELOC_IA64_DTPREL32MSB: howto manager. (line 2099) +-* BFD_RELOC_IA64_DTPREL64I: howto manager. (line 2098) +-* BFD_RELOC_IA64_DTPREL64LSB: howto manager. (line 2102) +-* BFD_RELOC_IA64_DTPREL64MSB: howto manager. (line 2101) +-* BFD_RELOC_IA64_FPTR32LSB: howto manager. (line 2046) +-* BFD_RELOC_IA64_FPTR32MSB: howto manager. (line 2045) +-* BFD_RELOC_IA64_FPTR64I: howto manager. (line 2044) +-* BFD_RELOC_IA64_FPTR64LSB: howto manager. (line 2048) +-* BFD_RELOC_IA64_FPTR64MSB: howto manager. (line 2047) +-* BFD_RELOC_IA64_GPREL22: howto manager. (line 2032) +-* BFD_RELOC_IA64_GPREL32LSB: howto manager. (line 2035) +-* BFD_RELOC_IA64_GPREL32MSB: howto manager. (line 2034) +-* BFD_RELOC_IA64_GPREL64I: howto manager. (line 2033) +-* BFD_RELOC_IA64_GPREL64LSB: howto manager. (line 2037) +-* BFD_RELOC_IA64_GPREL64MSB: howto manager. (line 2036) +-* BFD_RELOC_IA64_IMM14: howto manager. (line 2025) +-* BFD_RELOC_IA64_IMM22: howto manager. (line 2026) +-* BFD_RELOC_IA64_IMM64: howto manager. (line 2027) +-* BFD_RELOC_IA64_IPLTLSB: howto manager. (line 2083) +-* BFD_RELOC_IA64_IPLTMSB: howto manager. (line 2082) +-* BFD_RELOC_IA64_LDXMOV: howto manager. (line 2086) +-* BFD_RELOC_IA64_LTOFF22: howto manager. (line 2038) +-* BFD_RELOC_IA64_LTOFF22X: howto manager. (line 2085) +-* BFD_RELOC_IA64_LTOFF64I: howto manager. (line 2039) +-* BFD_RELOC_IA64_LTOFF_DTPMOD22: howto manager. (line 2095) +-* BFD_RELOC_IA64_LTOFF_DTPREL22: howto manager. (line 2103) +-* BFD_RELOC_IA64_LTOFF_FPTR22: howto manager. (line 2060) +-* BFD_RELOC_IA64_LTOFF_FPTR32LSB: howto manager. (line 2063) +-* BFD_RELOC_IA64_LTOFF_FPTR32MSB: howto manager. (line 2062) +-* BFD_RELOC_IA64_LTOFF_FPTR64I: howto manager. (line 2061) +-* BFD_RELOC_IA64_LTOFF_FPTR64LSB: howto manager. (line 2065) +-* BFD_RELOC_IA64_LTOFF_FPTR64MSB: howto manager. (line 2064) +-* BFD_RELOC_IA64_LTOFF_TPREL22: howto manager. (line 2092) +-* BFD_RELOC_IA64_LTV32LSB: howto manager. (line 2079) +-* BFD_RELOC_IA64_LTV32MSB: howto manager. (line 2078) +-* BFD_RELOC_IA64_LTV64LSB: howto manager. (line 2081) +-* BFD_RELOC_IA64_LTV64MSB: howto manager. (line 2080) +-* BFD_RELOC_IA64_PCREL21B: howto manager. (line 2049) +-* BFD_RELOC_IA64_PCREL21BI: howto manager. (line 2050) +-* BFD_RELOC_IA64_PCREL21F: howto manager. (line 2052) +-* BFD_RELOC_IA64_PCREL21M: howto manager. (line 2051) +-* BFD_RELOC_IA64_PCREL22: howto manager. (line 2053) +-* BFD_RELOC_IA64_PCREL32LSB: howto manager. (line 2057) +-* BFD_RELOC_IA64_PCREL32MSB: howto manager. (line 2056) +-* BFD_RELOC_IA64_PCREL60B: howto manager. (line 2054) +-* BFD_RELOC_IA64_PCREL64I: howto manager. (line 2055) +-* BFD_RELOC_IA64_PCREL64LSB: howto manager. (line 2059) +-* BFD_RELOC_IA64_PCREL64MSB: howto manager. (line 2058) +-* BFD_RELOC_IA64_PLTOFF22: howto manager. (line 2040) +-* BFD_RELOC_IA64_PLTOFF64I: howto manager. (line 2041) +-* BFD_RELOC_IA64_PLTOFF64LSB: howto manager. (line 2043) +-* BFD_RELOC_IA64_PLTOFF64MSB: howto manager. (line 2042) +-* BFD_RELOC_IA64_REL32LSB: howto manager. (line 2075) +-* BFD_RELOC_IA64_REL32MSB: howto manager. (line 2074) +-* BFD_RELOC_IA64_REL64LSB: howto manager. (line 2077) +-* BFD_RELOC_IA64_REL64MSB: howto manager. (line 2076) +-* BFD_RELOC_IA64_SECREL32LSB: howto manager. (line 2071) +-* BFD_RELOC_IA64_SECREL32MSB: howto manager. (line 2070) +-* BFD_RELOC_IA64_SECREL64LSB: howto manager. (line 2073) +-* BFD_RELOC_IA64_SECREL64MSB: howto manager. (line 2072) +-* BFD_RELOC_IA64_SEGREL32LSB: howto manager. (line 2067) +-* BFD_RELOC_IA64_SEGREL32MSB: howto manager. (line 2066) +-* BFD_RELOC_IA64_SEGREL64LSB: howto manager. (line 2069) +-* BFD_RELOC_IA64_SEGREL64MSB: howto manager. (line 2068) +-* BFD_RELOC_IA64_TPREL14: howto manager. (line 2087) +-* BFD_RELOC_IA64_TPREL22: howto manager. (line 2088) +-* BFD_RELOC_IA64_TPREL64I: howto manager. (line 2089) +-* BFD_RELOC_IA64_TPREL64LSB: howto manager. (line 2091) +-* BFD_RELOC_IA64_TPREL64MSB: howto manager. (line 2090) +-* BFD_RELOC_IP2K_ADDR16CJP: howto manager. (line 1977) +-* BFD_RELOC_IP2K_BANK: howto manager. (line 1974) +-* BFD_RELOC_IP2K_EX8DATA: howto manager. (line 1985) +-* BFD_RELOC_IP2K_FR9: howto manager. (line 1971) +-* BFD_RELOC_IP2K_FR_OFFSET: howto manager. (line 1998) +-* BFD_RELOC_IP2K_HI8DATA: howto manager. (line 1984) +-* BFD_RELOC_IP2K_HI8INSN: howto manager. (line 1989) +-* BFD_RELOC_IP2K_LO8DATA: howto manager. (line 1983) +-* BFD_RELOC_IP2K_LO8INSN: howto manager. (line 1988) +-* BFD_RELOC_IP2K_PAGE3: howto manager. (line 1980) +-* BFD_RELOC_IP2K_PC_SKIP: howto manager. (line 1992) +-* BFD_RELOC_IP2K_TEXT: howto manager. (line 1995) +-* BFD_RELOC_IQ2000_OFFSET_16: howto manager. (line 2508) +-* BFD_RELOC_IQ2000_OFFSET_21: howto manager. (line 2509) +-* BFD_RELOC_IQ2000_UHI16: howto manager. (line 2510) +-* BFD_RELOC_LM32_16_GOT: howto manager. (line 2615) +-* BFD_RELOC_LM32_BRANCH: howto manager. (line 2614) +-* BFD_RELOC_LM32_CALL: howto manager. (line 2613) +-* BFD_RELOC_LM32_COPY: howto manager. (line 2618) +-* BFD_RELOC_LM32_GLOB_DAT: howto manager. (line 2619) +-* BFD_RELOC_LM32_GOTOFF_HI16: howto manager. (line 2616) +-* BFD_RELOC_LM32_GOTOFF_LO16: howto manager. (line 2617) +-* BFD_RELOC_LM32_JMP_SLOT: howto manager. (line 2620) +-* BFD_RELOC_LM32_RELATIVE: howto manager. (line 2621) +-* BFD_RELOC_LO10: howto manager. (line 121) +-* BFD_RELOC_LO16: howto manager. (line 361) +-* BFD_RELOC_LO16_BASEREL: howto manager. (line 100) +-* BFD_RELOC_LO16_GOTOFF: howto manager. (line 56) +-* BFD_RELOC_LO16_PCREL: howto manager. (line 370) +-* BFD_RELOC_LO16_PLTOFF: howto manager. (line 68) +-* BFD_RELOC_M32C_HI8: howto manager. (line 1242) +-* BFD_RELOC_M32C_RL_1ADDR: howto manager. (line 1244) +-* BFD_RELOC_M32C_RL_2ADDR: howto manager. (line 1245) +-* BFD_RELOC_M32C_RL_JUMP: howto manager. (line 1243) +-* BFD_RELOC_M32R_10_PCREL: howto manager. (line 1252) +-* BFD_RELOC_M32R_18_PCREL: howto manager. (line 1256) +-* BFD_RELOC_M32R_24: howto manager. (line 1248) +-* BFD_RELOC_M32R_26_PCREL: howto manager. (line 1259) +-* BFD_RELOC_M32R_26_PLTREL: howto manager. (line 1278) +-* BFD_RELOC_M32R_COPY: howto manager. (line 1279) +-* BFD_RELOC_M32R_GLOB_DAT: howto manager. (line 1280) +-* BFD_RELOC_M32R_GOT16_HI_SLO: howto manager. (line 1289) +-* BFD_RELOC_M32R_GOT16_HI_ULO: howto manager. (line 1288) +-* BFD_RELOC_M32R_GOT16_LO: howto manager. (line 1290) +-* BFD_RELOC_M32R_GOT24: howto manager. (line 1277) +-* BFD_RELOC_M32R_GOTOFF: howto manager. (line 1283) +-* BFD_RELOC_M32R_GOTOFF_HI_SLO: howto manager. (line 1285) +-* BFD_RELOC_M32R_GOTOFF_HI_ULO: howto manager. (line 1284) +-* BFD_RELOC_M32R_GOTOFF_LO: howto manager. (line 1286) +-* BFD_RELOC_M32R_GOTPC24: howto manager. (line 1287) +-* BFD_RELOC_M32R_GOTPC_HI_SLO: howto manager. (line 1292) +-* BFD_RELOC_M32R_GOTPC_HI_ULO: howto manager. (line 1291) +-* BFD_RELOC_M32R_GOTPC_LO: howto manager. (line 1293) +-* BFD_RELOC_M32R_HI16_SLO: howto manager. (line 1266) +-* BFD_RELOC_M32R_HI16_ULO: howto manager. (line 1262) +-* BFD_RELOC_M32R_JMP_SLOT: howto manager. (line 1281) +-* BFD_RELOC_M32R_LO16: howto manager. (line 1270) +-* BFD_RELOC_M32R_RELATIVE: howto manager. (line 1282) +-* BFD_RELOC_M32R_SDA16: howto manager. (line 1273) +-* BFD_RELOC_M68HC11_24: howto manager. (line 2139) +-* BFD_RELOC_M68HC11_3B: howto manager. (line 2114) +-* BFD_RELOC_M68HC11_HI8: howto manager. (line 2106) +-* BFD_RELOC_M68HC11_LO16: howto manager. (line 2128) +-* BFD_RELOC_M68HC11_LO8: howto manager. (line 2110) +-* BFD_RELOC_M68HC11_PAGE: howto manager. (line 2134) +-* BFD_RELOC_M68HC11_RL_GROUP: howto manager. (line 2123) +-* BFD_RELOC_M68HC11_RL_JUMP: howto manager. (line 2117) +-* BFD_RELOC_M68HC12_10_PCREL: howto manager. (line 2199) +-* BFD_RELOC_M68HC12_16B: howto manager. (line 2193) +-* BFD_RELOC_M68HC12_5B: howto manager. (line 2145) +-* BFD_RELOC_M68HC12_9_PCREL: howto manager. (line 2196) +-* BFD_RELOC_M68HC12_9B: howto manager. (line 2190) +-* BFD_RELOC_M68HC12_HI8XG: howto manager. (line 2206) +-* BFD_RELOC_M68HC12_LO8XG: howto manager. (line 2202) +-* BFD_RELOC_MACH_O_LOCAL_SECTDIFF: howto manager. (line 2628) +-* BFD_RELOC_MACH_O_PAIR: howto manager. (line 2631) +-* BFD_RELOC_MACH_O_SECTDIFF: howto manager. (line 2624) +-* BFD_RELOC_MACH_O_X86_64_BRANCH32: howto manager. (line 2634) +-* BFD_RELOC_MACH_O_X86_64_BRANCH8: howto manager. (line 2635) +-* BFD_RELOC_MACH_O_X86_64_GOT: howto manager. (line 2639) +-* BFD_RELOC_MACH_O_X86_64_GOT_LOAD: howto manager. (line 2642) +-* BFD_RELOC_MACH_O_X86_64_PCREL32_1: howto manager. (line 2652) +-* BFD_RELOC_MACH_O_X86_64_PCREL32_2: howto manager. (line 2655) +-* BFD_RELOC_MACH_O_X86_64_PCREL32_4: howto manager. (line 2658) +-* BFD_RELOC_MACH_O_X86_64_SUBTRACTOR32: howto manager. (line 2646) +-* BFD_RELOC_MACH_O_X86_64_SUBTRACTOR64: howto manager. (line 2649) +-* BFD_RELOC_MCORE_PCREL_32: howto manager. (line 1523) +-* BFD_RELOC_MCORE_PCREL_IMM11BY2: howto manager. (line 1521) +-* BFD_RELOC_MCORE_PCREL_IMM4BY2: howto manager. (line 1522) +-* BFD_RELOC_MCORE_PCREL_IMM8BY4: howto manager. (line 1520) +-* BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2: howto manager. (line 1524) +-* BFD_RELOC_MCORE_RVA: howto manager. (line 1525) +-* BFD_RELOC_MEP_16: howto manager. (line 1529) +-* BFD_RELOC_MEP_32: howto manager. (line 1530) +-* BFD_RELOC_MEP_8: howto manager. (line 1528) +-* BFD_RELOC_MEP_ADDR24A4: howto manager. (line 1545) +-* BFD_RELOC_MEP_GNU_VTENTRY: howto manager. (line 1547) +-* BFD_RELOC_MEP_GNU_VTINHERIT: howto manager. (line 1546) +-* BFD_RELOC_MEP_GPREL: howto manager. (line 1539) +-* BFD_RELOC_MEP_HI16S: howto manager. (line 1538) +-* BFD_RELOC_MEP_HI16U: howto manager. (line 1537) +-* BFD_RELOC_MEP_LOW16: howto manager. (line 1536) +-* BFD_RELOC_MEP_PCABS24A2: howto manager. (line 1535) +-* BFD_RELOC_MEP_PCREL12A2: howto manager. (line 1532) +-* BFD_RELOC_MEP_PCREL17A2: howto manager. (line 1533) +-* BFD_RELOC_MEP_PCREL24A2: howto manager. (line 1534) +-* BFD_RELOC_MEP_PCREL8A2: howto manager. (line 1531) +-* BFD_RELOC_MEP_TPREL: howto manager. (line 1540) +-* BFD_RELOC_MEP_TPREL7: howto manager. (line 1541) +-* BFD_RELOC_MEP_TPREL7A2: howto manager. (line 1542) +-* BFD_RELOC_MEP_TPREL7A4: howto manager. (line 1543) +-* BFD_RELOC_MEP_UIMM24: howto manager. (line 1544) +-* BFD_RELOC_METAG_COPY: howto manager. (line 1569) +-* BFD_RELOC_METAG_GETSET_GOT: howto manager. (line 1561) +-* BFD_RELOC_METAG_GETSET_GOTOFF: howto manager. (line 1560) +-* BFD_RELOC_METAG_GETSETOFF: howto manager. (line 1553) +-* BFD_RELOC_METAG_GLOB_DAT: howto manager. (line 1572) +-* BFD_RELOC_METAG_GOTOFF: howto manager. (line 1567) +-* BFD_RELOC_METAG_HI16_GOTOFF: howto manager. (line 1558) +-* BFD_RELOC_METAG_HI16_GOTPC: howto manager. (line 1562) +-* BFD_RELOC_METAG_HI16_PLT: howto manager. (line 1564) +-* BFD_RELOC_METAG_HIADDR16: howto manager. (line 1550) +-* BFD_RELOC_METAG_HIOG: howto manager. (line 1554) +-* BFD_RELOC_METAG_JMP_SLOT: howto manager. (line 1570) +-* BFD_RELOC_METAG_LO16_GOTOFF: howto manager. (line 1559) +-* BFD_RELOC_METAG_LO16_GOTPC: howto manager. (line 1563) +-* BFD_RELOC_METAG_LO16_PLT: howto manager. (line 1565) +-* BFD_RELOC_METAG_LOADDR16: howto manager. (line 1551) +-* BFD_RELOC_METAG_LOOG: howto manager. (line 1555) +-* BFD_RELOC_METAG_PLT: howto manager. (line 1568) +-* BFD_RELOC_METAG_REL16: howto manager. (line 1557) +-* BFD_RELOC_METAG_REL8: howto manager. (line 1556) +-* BFD_RELOC_METAG_RELATIVE: howto manager. (line 1571) +-* BFD_RELOC_METAG_RELBRANCH: howto manager. (line 1552) +-* BFD_RELOC_METAG_RELBRANCH_PLT: howto manager. (line 1566) +-* BFD_RELOC_METAG_TLS_DTPMOD: howto manager. (line 1583) +-* BFD_RELOC_METAG_TLS_DTPOFF: howto manager. (line 1584) +-* BFD_RELOC_METAG_TLS_GD: howto manager. (line 1573) +-* BFD_RELOC_METAG_TLS_IE: howto manager. (line 1578) +-* BFD_RELOC_METAG_TLS_IENONPIC: howto manager. (line 1579) +-* BFD_RELOC_METAG_TLS_IENONPIC_HI16: howto manager. (line 1580) +-* BFD_RELOC_METAG_TLS_IENONPIC_LO16: howto manager. (line 1581) +-* BFD_RELOC_METAG_TLS_LDM: howto manager. (line 1574) +-* BFD_RELOC_METAG_TLS_LDO: howto manager. (line 1577) +-* BFD_RELOC_METAG_TLS_LDO_HI16: howto manager. (line 1575) +-* BFD_RELOC_METAG_TLS_LDO_LO16: howto manager. (line 1576) +-* BFD_RELOC_METAG_TLS_LE: howto manager. (line 1585) +-* BFD_RELOC_METAG_TLS_LE_HI16: howto manager. (line 1586) +-* BFD_RELOC_METAG_TLS_LE_LO16: howto manager. (line 1587) +-* BFD_RELOC_METAG_TLS_TPOFF: howto manager. (line 1582) +-* BFD_RELOC_MICROBLAZE_32_GOTOFF: howto manager. (line 2705) +-* BFD_RELOC_MICROBLAZE_32_LO: howto manager. (line 2661) +-* BFD_RELOC_MICROBLAZE_32_LO_PCREL: howto manager. (line 2665) +-* BFD_RELOC_MICROBLAZE_32_ROSDA: howto manager. (line 2669) +-* BFD_RELOC_MICROBLAZE_32_RWSDA: howto manager. (line 2673) +-* BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM: howto manager. (line 2677) +-* BFD_RELOC_MICROBLAZE_32_TLSDTPMOD: howto manager. (line 2726) +-* BFD_RELOC_MICROBLAZE_32_TLSDTPREL: howto manager. (line 2729) +-* BFD_RELOC_MICROBLAZE_64_GOT: howto manager. (line 2691) +-* BFD_RELOC_MICROBLAZE_64_GOTOFF: howto manager. (line 2700) +-* BFD_RELOC_MICROBLAZE_64_GOTPC: howto manager. (line 2686) +-* BFD_RELOC_MICROBLAZE_64_NONE: howto manager. (line 2681) +-* BFD_RELOC_MICROBLAZE_64_PLT: howto manager. (line 2695) +-* BFD_RELOC_MICROBLAZE_64_TLS: howto manager. (line 2713) +-* BFD_RELOC_MICROBLAZE_64_TLSDTPREL: howto manager. (line 2732) +-* BFD_RELOC_MICROBLAZE_64_TLSGD: howto manager. (line 2716) +-* BFD_RELOC_MICROBLAZE_64_TLSGOTTPREL: howto manager. (line 2736) +-* BFD_RELOC_MICROBLAZE_64_TLSLD: howto manager. (line 2721) +-* BFD_RELOC_MICROBLAZE_64_TLSTPREL: howto manager. (line 2740) +-* BFD_RELOC_MICROBLAZE_COPY: howto manager. (line 2709) +-* BFD_RELOC_MICROMIPS_10_PCREL_S1: howto manager. (line 404) +-* BFD_RELOC_MICROMIPS_16_PCREL_S1: howto manager. (line 405) +-* BFD_RELOC_MICROMIPS_7_PCREL_S1: howto manager. (line 403) +-* BFD_RELOC_MICROMIPS_CALL16: howto manager. (line 417) +-* BFD_RELOC_MICROMIPS_CALL_HI16: howto manager. (line 423) +-* BFD_RELOC_MICROMIPS_CALL_LO16: howto manager. (line 425) +-* BFD_RELOC_MICROMIPS_GOT16: howto manager. (line 415) +-* BFD_RELOC_MICROMIPS_GOT_DISP: howto manager. (line 433) +-* BFD_RELOC_MICROMIPS_GOT_HI16: howto manager. (line 419) +-* BFD_RELOC_MICROMIPS_GOT_LO16: howto manager. (line 421) +-* BFD_RELOC_MICROMIPS_GOT_OFST: howto manager. (line 431) +-* BFD_RELOC_MICROMIPS_GOT_PAGE: howto manager. (line 429) +-* BFD_RELOC_MICROMIPS_GPREL16: howto manager. (line 408) +-* BFD_RELOC_MICROMIPS_HI16: howto manager. (line 409) +-* BFD_RELOC_MICROMIPS_HI16_S: howto manager. (line 410) +-* BFD_RELOC_MICROMIPS_HIGHER: howto manager. (line 442) +-* BFD_RELOC_MICROMIPS_HIGHEST: howto manager. (line 440) +-* BFD_RELOC_MICROMIPS_JALR: howto manager. (line 448) +-* BFD_RELOC_MICROMIPS_JMP: howto manager. (line 343) +-* BFD_RELOC_MICROMIPS_LITERAL: howto manager. (line 400) +-* BFD_RELOC_MICROMIPS_LO16: howto manager. (line 411) +-* BFD_RELOC_MICROMIPS_SCN_DISP: howto manager. (line 444) +-* BFD_RELOC_MICROMIPS_SUB: howto manager. (line 427) +-* BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16: howto manager. (line 458) +-* BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16: howto manager. (line 460) +-* BFD_RELOC_MICROMIPS_TLS_GD: howto manager. (line 454) +-* BFD_RELOC_MICROMIPS_TLS_GOTTPREL: howto manager. (line 462) +-* BFD_RELOC_MICROMIPS_TLS_LDM: howto manager. (line 456) +-* BFD_RELOC_MICROMIPS_TLS_TPREL_HI16: howto manager. (line 466) +-* BFD_RELOC_MICROMIPS_TLS_TPREL_LO16: howto manager. (line 468) +-* BFD_RELOC_MIPS16_CALL16: howto manager. (line 374) +-* BFD_RELOC_MIPS16_GOT16: howto manager. (line 373) +-* BFD_RELOC_MIPS16_GPREL: howto manager. (line 349) +-* BFD_RELOC_MIPS16_HI16: howto manager. (line 378) +-* BFD_RELOC_MIPS16_HI16_S: howto manager. (line 381) +-* BFD_RELOC_MIPS16_JMP: howto manager. (line 346) +-* BFD_RELOC_MIPS16_LO16: howto manager. (line 387) +-* BFD_RELOC_MIPS16_TLS_DTPREL_HI16: howto manager. (line 392) +-* BFD_RELOC_MIPS16_TLS_DTPREL_LO16: howto manager. (line 393) +-* BFD_RELOC_MIPS16_TLS_GD: howto manager. (line 390) +-* BFD_RELOC_MIPS16_TLS_GOTTPREL: howto manager. (line 394) +-* BFD_RELOC_MIPS16_TLS_LDM: howto manager. (line 391) +-* BFD_RELOC_MIPS16_TLS_TPREL_HI16: howto manager. (line 395) +-* BFD_RELOC_MIPS16_TLS_TPREL_LO16: howto manager. (line 396) +-* BFD_RELOC_MIPS_CALL16: howto manager. (line 416) +-* BFD_RELOC_MIPS_CALL_HI16: howto manager. (line 422) +-* BFD_RELOC_MIPS_CALL_LO16: howto manager. (line 424) +-* BFD_RELOC_MIPS_COPY: howto manager. (line 472) +-* BFD_RELOC_MIPS_DELETE: howto manager. (line 438) +-* BFD_RELOC_MIPS_EH: howto manager. (line 469) +-* BFD_RELOC_MIPS_GOT16: howto manager. (line 414) +-* BFD_RELOC_MIPS_GOT_DISP: howto manager. (line 432) +-* BFD_RELOC_MIPS_GOT_HI16: howto manager. (line 418) +-* BFD_RELOC_MIPS_GOT_LO16: howto manager. (line 420) +-* BFD_RELOC_MIPS_GOT_OFST: howto manager. (line 430) +-* BFD_RELOC_MIPS_GOT_PAGE: howto manager. (line 428) +-* BFD_RELOC_MIPS_HIGHER: howto manager. (line 441) +-* BFD_RELOC_MIPS_HIGHEST: howto manager. (line 439) +-* BFD_RELOC_MIPS_INSERT_A: howto manager. (line 436) +-* BFD_RELOC_MIPS_INSERT_B: howto manager. (line 437) +-* BFD_RELOC_MIPS_JALR: howto manager. (line 447) +-* BFD_RELOC_MIPS_JMP: howto manager. (line 342) +-* BFD_RELOC_MIPS_JUMP_SLOT: howto manager. (line 473) +-* BFD_RELOC_MIPS_LITERAL: howto manager. (line 399) +-* BFD_RELOC_MIPS_REL16: howto manager. (line 445) +-* BFD_RELOC_MIPS_RELGOT: howto manager. (line 446) +-* BFD_RELOC_MIPS_SCN_DISP: howto manager. (line 443) +-* BFD_RELOC_MIPS_SHIFT5: howto manager. (line 434) +-* BFD_RELOC_MIPS_SHIFT6: howto manager. (line 435) +-* BFD_RELOC_MIPS_SUB: howto manager. (line 426) +-* BFD_RELOC_MIPS_TLS_DTPMOD32: howto manager. (line 449) +-* BFD_RELOC_MIPS_TLS_DTPMOD64: howto manager. (line 451) +-* BFD_RELOC_MIPS_TLS_DTPREL32: howto manager. (line 450) +-* BFD_RELOC_MIPS_TLS_DTPREL64: howto manager. (line 452) +-* BFD_RELOC_MIPS_TLS_DTPREL_HI16: howto manager. (line 457) +-* BFD_RELOC_MIPS_TLS_DTPREL_LO16: howto manager. (line 459) +-* BFD_RELOC_MIPS_TLS_GD: howto manager. (line 453) +-* BFD_RELOC_MIPS_TLS_GOTTPREL: howto manager. (line 461) +-* BFD_RELOC_MIPS_TLS_LDM: howto manager. (line 455) +-* BFD_RELOC_MIPS_TLS_TPREL32: howto manager. (line 463) +-* BFD_RELOC_MIPS_TLS_TPREL64: howto manager. (line 464) +-* BFD_RELOC_MIPS_TLS_TPREL_HI16: howto manager. (line 465) +-* BFD_RELOC_MIPS_TLS_TPREL_LO16: howto manager. (line 467) +-* BFD_RELOC_MMIX_ADDR19: howto manager. (line 1616) +-* BFD_RELOC_MMIX_ADDR27: howto manager. (line 1620) +-* BFD_RELOC_MMIX_BASE_PLUS_OFFSET: howto manager. (line 1632) +-* BFD_RELOC_MMIX_CBRANCH: howto manager. (line 1596) +-* BFD_RELOC_MMIX_CBRANCH_1: howto manager. (line 1598) +-* BFD_RELOC_MMIX_CBRANCH_2: howto manager. (line 1599) +-* BFD_RELOC_MMIX_CBRANCH_3: howto manager. (line 1600) +-* BFD_RELOC_MMIX_CBRANCH_J: howto manager. (line 1597) +-* BFD_RELOC_MMIX_GETA: howto manager. (line 1590) +-* BFD_RELOC_MMIX_GETA_1: howto manager. (line 1591) +-* BFD_RELOC_MMIX_GETA_2: howto manager. (line 1592) +-* BFD_RELOC_MMIX_GETA_3: howto manager. (line 1593) +-* BFD_RELOC_MMIX_JMP: howto manager. (line 1610) +-* BFD_RELOC_MMIX_JMP_1: howto manager. (line 1611) +-* BFD_RELOC_MMIX_JMP_2: howto manager. (line 1612) +-* BFD_RELOC_MMIX_JMP_3: howto manager. (line 1613) +-* BFD_RELOC_MMIX_LOCAL: howto manager. (line 1636) +-* BFD_RELOC_MMIX_PUSHJ: howto manager. (line 1603) +-* BFD_RELOC_MMIX_PUSHJ_1: howto manager. (line 1604) +-* BFD_RELOC_MMIX_PUSHJ_2: howto manager. (line 1605) +-* BFD_RELOC_MMIX_PUSHJ_3: howto manager. (line 1606) +-* BFD_RELOC_MMIX_PUSHJ_STUBBABLE: howto manager. (line 1607) +-* BFD_RELOC_MMIX_REG: howto manager. (line 1628) +-* BFD_RELOC_MMIX_REG_OR_BYTE: howto manager. (line 1624) +-* BFD_RELOC_MN10300_16_PCREL: howto manager. (line 571) +-* BFD_RELOC_MN10300_32_PCREL: howto manager. (line 567) +-* BFD_RELOC_MN10300_ALIGN: howto manager. (line 552) +-* BFD_RELOC_MN10300_COPY: howto manager. (line 535) +-* BFD_RELOC_MN10300_GLOB_DAT: howto manager. (line 538) +-* BFD_RELOC_MN10300_GOT16: howto manager. (line 531) +-* BFD_RELOC_MN10300_GOT24: howto manager. (line 527) +-* BFD_RELOC_MN10300_GOT32: howto manager. (line 523) +-* BFD_RELOC_MN10300_GOTOFF24: howto manager. (line 520) +-* BFD_RELOC_MN10300_JMP_SLOT: howto manager. (line 541) +-* BFD_RELOC_MN10300_RELATIVE: howto manager. (line 544) +-* BFD_RELOC_MN10300_SYM_DIFF: howto manager. (line 547) +-* BFD_RELOC_MN10300_TLS_DTPMOD: howto manager. (line 562) +-* BFD_RELOC_MN10300_TLS_DTPOFF: howto manager. (line 563) +-* BFD_RELOC_MN10300_TLS_GD: howto manager. (line 556) +-* BFD_RELOC_MN10300_TLS_GOTIE: howto manager. (line 559) +-* BFD_RELOC_MN10300_TLS_IE: howto manager. (line 560) +-* BFD_RELOC_MN10300_TLS_LD: howto manager. (line 557) +-* BFD_RELOC_MN10300_TLS_LDO: howto manager. (line 558) +-* BFD_RELOC_MN10300_TLS_LE: howto manager. (line 561) +-* BFD_RELOC_MN10300_TLS_TPOFF: howto manager. (line 564) +-* BFD_RELOC_MOXIE_10_PCREL: howto manager. (line 476) +-* BFD_RELOC_MSP430_10_PCREL: howto manager. (line 2448) +-* BFD_RELOC_MSP430_16: howto manager. (line 2450) +-* BFD_RELOC_MSP430_16_BYTE: howto manager. (line 2452) +-* BFD_RELOC_MSP430_16_PCREL: howto manager. (line 2449) +-* BFD_RELOC_MSP430_16_PCREL_BYTE: howto manager. (line 2451) +-* BFD_RELOC_MSP430_2X_PCREL: howto manager. (line 2453) +-* BFD_RELOC_MSP430_ABS8: howto manager. (line 2455) +-* BFD_RELOC_MSP430_ABS_HI16: howto manager. (line 2467) +-* BFD_RELOC_MSP430_PREL31: howto manager. (line 2468) +-* BFD_RELOC_MSP430_RL_PCREL: howto manager. (line 2454) +-* BFD_RELOC_MSP430_SYM_DIFF: howto manager. (line 2469) +-* BFD_RELOC_MSP430X_ABS16: howto manager. (line 2466) +-* BFD_RELOC_MSP430X_ABS20_ADR_DST: howto manager. (line 2463) +-* BFD_RELOC_MSP430X_ABS20_ADR_SRC: howto manager. (line 2462) +-* BFD_RELOC_MSP430X_ABS20_EXT_DST: howto manager. (line 2460) +-* BFD_RELOC_MSP430X_ABS20_EXT_ODST: howto manager. (line 2461) +-* BFD_RELOC_MSP430X_ABS20_EXT_SRC: howto manager. (line 2459) +-* BFD_RELOC_MSP430X_PCR16: howto manager. (line 2464) +-* BFD_RELOC_MSP430X_PCR20_CALL: howto manager. (line 2465) +-* BFD_RELOC_MSP430X_PCR20_EXT_DST: howto manager. (line 2457) +-* BFD_RELOC_MSP430X_PCR20_EXT_ODST: howto manager. (line 2458) +-* BFD_RELOC_MSP430X_PCR20_EXT_SRC: howto manager. (line 2456) +-* BFD_RELOC_MT_GNU_VTENTRY: howto manager. (line 2442) +-* BFD_RELOC_MT_GNU_VTINHERIT: howto manager. (line 2439) +-* BFD_RELOC_MT_HI16: howto manager. (line 2433) +-* BFD_RELOC_MT_LO16: howto manager. (line 2436) +-* BFD_RELOC_MT_PC16: howto manager. (line 2430) +-* BFD_RELOC_MT_PCINSN8: howto manager. (line 2445) +-* BFD_RELOC_NIOS2_ALIGN: howto manager. (line 2486) +-* BFD_RELOC_NIOS2_CACHE_OPX: howto manager. (line 2476) +-* BFD_RELOC_NIOS2_CALL16: howto manager. (line 2488) +-* BFD_RELOC_NIOS2_CALL26: howto manager. (line 2474) +-* BFD_RELOC_NIOS2_CALLR: howto manager. (line 2485) +-* BFD_RELOC_NIOS2_CJMP: howto manager. (line 2484) +-* BFD_RELOC_NIOS2_COPY: howto manager. (line 2501) +-* BFD_RELOC_NIOS2_GLOB_DAT: howto manager. (line 2502) +-* BFD_RELOC_NIOS2_GOT16: howto manager. (line 2487) +-* BFD_RELOC_NIOS2_GOTOFF: howto manager. (line 2505) +-* BFD_RELOC_NIOS2_GOTOFF_HA: howto manager. (line 2490) +-* BFD_RELOC_NIOS2_GOTOFF_LO: howto manager. (line 2489) +-* BFD_RELOC_NIOS2_GPREL: howto manager. (line 2482) +-* BFD_RELOC_NIOS2_HI16: howto manager. (line 2479) +-* BFD_RELOC_NIOS2_HIADJ16: howto manager. (line 2481) +-* BFD_RELOC_NIOS2_IMM5: howto manager. (line 2475) +-* BFD_RELOC_NIOS2_IMM6: howto manager. (line 2477) +-* BFD_RELOC_NIOS2_IMM8: howto manager. (line 2478) +-* BFD_RELOC_NIOS2_JUMP_SLOT: howto manager. (line 2503) +-* BFD_RELOC_NIOS2_LO16: howto manager. (line 2480) +-* BFD_RELOC_NIOS2_PCREL_HA: howto manager. (line 2492) +-* BFD_RELOC_NIOS2_PCREL_LO: howto manager. (line 2491) +-* BFD_RELOC_NIOS2_RELATIVE: howto manager. (line 2504) +-* BFD_RELOC_NIOS2_S16: howto manager. (line 2472) +-* BFD_RELOC_NIOS2_TLS_DTPMOD: howto manager. (line 2498) +-* BFD_RELOC_NIOS2_TLS_DTPREL: howto manager. (line 2499) +-* BFD_RELOC_NIOS2_TLS_GD16: howto manager. (line 2493) +-* BFD_RELOC_NIOS2_TLS_IE16: howto manager. (line 2496) +-* BFD_RELOC_NIOS2_TLS_LDM16: howto manager. (line 2494) +-* BFD_RELOC_NIOS2_TLS_LDO16: howto manager. (line 2495) +-* BFD_RELOC_NIOS2_TLS_LE16: howto manager. (line 2497) +-* BFD_RELOC_NIOS2_TLS_TPREL: howto manager. (line 2500) +-* BFD_RELOC_NIOS2_U16: howto manager. (line 2473) +-* BFD_RELOC_NIOS2_UJMP: howto manager. (line 2483) +-* BFD_RELOC_NONE: howto manager. (line 135) +-* BFD_RELOC_NS32K_DISP_16: howto manager. (line 639) +-* BFD_RELOC_NS32K_DISP_16_PCREL: howto manager. (line 642) +-* BFD_RELOC_NS32K_DISP_32: howto manager. (line 640) +-* BFD_RELOC_NS32K_DISP_32_PCREL: howto manager. (line 643) +-* BFD_RELOC_NS32K_DISP_8: howto manager. (line 638) +-* BFD_RELOC_NS32K_DISP_8_PCREL: howto manager. (line 641) +-* BFD_RELOC_NS32K_IMM_16: howto manager. (line 633) +-* BFD_RELOC_NS32K_IMM_16_PCREL: howto manager. (line 636) +-* BFD_RELOC_NS32K_IMM_32: howto manager. (line 634) +-* BFD_RELOC_NS32K_IMM_32_PCREL: howto manager. (line 637) +-* BFD_RELOC_NS32K_IMM_8: howto manager. (line 632) +-* BFD_RELOC_NS32K_IMM_8_PCREL: howto manager. (line 635) +-* BFD_RELOC_OPENRISC_ABS_26: howto manager. (line 2398) +-* BFD_RELOC_OPENRISC_REL_26: howto manager. (line 2399) +-* BFD_RELOC_PDP11_DISP_6_PCREL: howto manager. (line 647) +-* BFD_RELOC_PDP11_DISP_8_PCREL: howto manager. (line 646) +-* BFD_RELOC_PJ_CODE_DIR16: howto manager. (line 652) +-* BFD_RELOC_PJ_CODE_DIR32: howto manager. (line 653) +-* BFD_RELOC_PJ_CODE_HI16: howto manager. (line 650) +-* BFD_RELOC_PJ_CODE_LO16: howto manager. (line 651) +-* BFD_RELOC_PJ_CODE_REL16: howto manager. (line 654) +-* BFD_RELOC_PJ_CODE_REL32: howto manager. (line 655) +-* BFD_RELOC_PPC64_ADDR16_DS: howto manager. (line 717) +-* BFD_RELOC_PPC64_ADDR16_HIGH: howto manager. (line 728) +-* BFD_RELOC_PPC64_ADDR16_HIGHA: howto manager. (line 729) +-* BFD_RELOC_PPC64_ADDR16_LO_DS: howto manager. (line 718) +-* BFD_RELOC_PPC64_DTPREL16_DS: howto manager. (line 768) +-* BFD_RELOC_PPC64_DTPREL16_HIGH: howto manager. (line 776) +-* BFD_RELOC_PPC64_DTPREL16_HIGHA: howto manager. (line 777) +-* BFD_RELOC_PPC64_DTPREL16_HIGHER: howto manager. (line 770) +-* BFD_RELOC_PPC64_DTPREL16_HIGHERA: howto manager. (line 771) +-* BFD_RELOC_PPC64_DTPREL16_HIGHEST: howto manager. (line 772) +-* BFD_RELOC_PPC64_DTPREL16_HIGHESTA: howto manager. (line 773) +-* BFD_RELOC_PPC64_DTPREL16_LO_DS: howto manager. (line 769) +-* BFD_RELOC_PPC64_GOT16_DS: howto manager. (line 719) +-* BFD_RELOC_PPC64_GOT16_LO_DS: howto manager. (line 720) +-* BFD_RELOC_PPC64_HIGHER: howto manager. (line 705) +-* BFD_RELOC_PPC64_HIGHER_S: howto manager. (line 706) +-* BFD_RELOC_PPC64_HIGHEST: howto manager. (line 707) +-* BFD_RELOC_PPC64_HIGHEST_S: howto manager. (line 708) +-* BFD_RELOC_PPC64_PLT16_LO_DS: howto manager. (line 721) +-* BFD_RELOC_PPC64_PLTGOT16: howto manager. (line 713) +-* BFD_RELOC_PPC64_PLTGOT16_DS: howto manager. (line 726) +-* BFD_RELOC_PPC64_PLTGOT16_HA: howto manager. (line 716) +-* BFD_RELOC_PPC64_PLTGOT16_HI: howto manager. (line 715) +-* BFD_RELOC_PPC64_PLTGOT16_LO: howto manager. (line 714) +-* BFD_RELOC_PPC64_PLTGOT16_LO_DS: howto manager. (line 727) +-* BFD_RELOC_PPC64_SECTOFF_DS: howto manager. (line 722) +-* BFD_RELOC_PPC64_SECTOFF_LO_DS: howto manager. (line 723) +-* BFD_RELOC_PPC64_TOC: howto manager. (line 712) +-* BFD_RELOC_PPC64_TOC16_DS: howto manager. (line 724) +-* BFD_RELOC_PPC64_TOC16_HA: howto manager. (line 711) +-* BFD_RELOC_PPC64_TOC16_HI: howto manager. (line 710) +-* BFD_RELOC_PPC64_TOC16_LO: howto manager. (line 709) +-* BFD_RELOC_PPC64_TOC16_LO_DS: howto manager. (line 725) +-* BFD_RELOC_PPC64_TPREL16_DS: howto manager. (line 762) +-* BFD_RELOC_PPC64_TPREL16_HIGH: howto manager. (line 774) +-* BFD_RELOC_PPC64_TPREL16_HIGHA: howto manager. (line 775) +-* BFD_RELOC_PPC64_TPREL16_HIGHER: howto manager. (line 764) +-* BFD_RELOC_PPC64_TPREL16_HIGHERA: howto manager. (line 765) +-* BFD_RELOC_PPC64_TPREL16_HIGHEST: howto manager. (line 766) +-* BFD_RELOC_PPC64_TPREL16_HIGHESTA: howto manager. (line 767) +-* BFD_RELOC_PPC64_TPREL16_LO_DS: howto manager. (line 763) +-* BFD_RELOC_PPC_B16: howto manager. (line 661) +-* BFD_RELOC_PPC_B16_BRNTAKEN: howto manager. (line 663) +-* BFD_RELOC_PPC_B16_BRTAKEN: howto manager. (line 662) +-* BFD_RELOC_PPC_B26: howto manager. (line 658) +-* BFD_RELOC_PPC_BA16: howto manager. (line 664) +-* BFD_RELOC_PPC_BA16_BRNTAKEN: howto manager. (line 666) +-* BFD_RELOC_PPC_BA16_BRTAKEN: howto manager. (line 665) +-* BFD_RELOC_PPC_BA26: howto manager. (line 659) +-* BFD_RELOC_PPC_COPY: howto manager. (line 667) +-* BFD_RELOC_PPC_DTPMOD: howto manager. (line 735) +-* BFD_RELOC_PPC_DTPREL: howto manager. (line 745) +-* BFD_RELOC_PPC_DTPREL16: howto manager. (line 741) +-* BFD_RELOC_PPC_DTPREL16_HA: howto manager. (line 744) +-* BFD_RELOC_PPC_DTPREL16_HI: howto manager. (line 743) +-* BFD_RELOC_PPC_DTPREL16_LO: howto manager. (line 742) +-* BFD_RELOC_PPC_EMB_BIT_FLD: howto manager. (line 686) +-* BFD_RELOC_PPC_EMB_MRKREF: howto manager. (line 681) +-* BFD_RELOC_PPC_EMB_NADDR16: howto manager. (line 673) +-* BFD_RELOC_PPC_EMB_NADDR16_HA: howto manager. (line 676) +-* BFD_RELOC_PPC_EMB_NADDR16_HI: howto manager. (line 675) +-* BFD_RELOC_PPC_EMB_NADDR16_LO: howto manager. (line 674) +-* BFD_RELOC_PPC_EMB_NADDR32: howto manager. (line 672) +-* BFD_RELOC_PPC_EMB_RELSDA: howto manager. (line 687) +-* BFD_RELOC_PPC_EMB_RELSEC16: howto manager. (line 682) +-* BFD_RELOC_PPC_EMB_RELST_HA: howto manager. (line 685) +-* BFD_RELOC_PPC_EMB_RELST_HI: howto manager. (line 684) +-* BFD_RELOC_PPC_EMB_RELST_LO: howto manager. (line 683) +-* BFD_RELOC_PPC_EMB_SDA21: howto manager. (line 680) +-* BFD_RELOC_PPC_EMB_SDA2I16: howto manager. (line 678) +-* BFD_RELOC_PPC_EMB_SDA2REL: howto manager. (line 679) +-* BFD_RELOC_PPC_EMB_SDAI16: howto manager. (line 677) +-* BFD_RELOC_PPC_GLOB_DAT: howto manager. (line 668) +-* BFD_RELOC_PPC_GOT_DTPREL16: howto manager. (line 758) +-* BFD_RELOC_PPC_GOT_DTPREL16_HA: howto manager. (line 761) +-* BFD_RELOC_PPC_GOT_DTPREL16_HI: howto manager. (line 760) +-* BFD_RELOC_PPC_GOT_DTPREL16_LO: howto manager. (line 759) +-* BFD_RELOC_PPC_GOT_TLSGD16: howto manager. (line 746) +-* BFD_RELOC_PPC_GOT_TLSGD16_HA: howto manager. (line 749) +-* BFD_RELOC_PPC_GOT_TLSGD16_HI: howto manager. (line 748) +-* BFD_RELOC_PPC_GOT_TLSGD16_LO: howto manager. (line 747) +-* BFD_RELOC_PPC_GOT_TLSLD16: howto manager. (line 750) +-* BFD_RELOC_PPC_GOT_TLSLD16_HA: howto manager. (line 753) +-* BFD_RELOC_PPC_GOT_TLSLD16_HI: howto manager. (line 752) +-* BFD_RELOC_PPC_GOT_TLSLD16_LO: howto manager. (line 751) +-* BFD_RELOC_PPC_GOT_TPREL16: howto manager. (line 754) +-* BFD_RELOC_PPC_GOT_TPREL16_HA: howto manager. (line 757) +-* BFD_RELOC_PPC_GOT_TPREL16_HI: howto manager. (line 756) +-* BFD_RELOC_PPC_GOT_TPREL16_LO: howto manager. (line 755) +-* BFD_RELOC_PPC_JMP_SLOT: howto manager. (line 669) +-* BFD_RELOC_PPC_LOCAL24PC: howto manager. (line 671) +-* BFD_RELOC_PPC_RELATIVE: howto manager. (line 670) +-* BFD_RELOC_PPC_TLS: howto manager. (line 732) +-* BFD_RELOC_PPC_TLSGD: howto manager. (line 733) +-* BFD_RELOC_PPC_TLSLD: howto manager. (line 734) +-* BFD_RELOC_PPC_TOC16: howto manager. (line 660) +-* BFD_RELOC_PPC_TPREL: howto manager. (line 740) +-* BFD_RELOC_PPC_TPREL16: howto manager. (line 736) +-* BFD_RELOC_PPC_TPREL16_HA: howto manager. (line 739) +-* BFD_RELOC_PPC_TPREL16_HI: howto manager. (line 738) +-* BFD_RELOC_PPC_TPREL16_LO: howto manager. (line 737) +-* BFD_RELOC_PPC_VLE_HA16A: howto manager. (line 695) +-* BFD_RELOC_PPC_VLE_HA16D: howto manager. (line 696) +-* BFD_RELOC_PPC_VLE_HI16A: howto manager. (line 693) +-* BFD_RELOC_PPC_VLE_HI16D: howto manager. (line 694) +-* BFD_RELOC_PPC_VLE_LO16A: howto manager. (line 691) +-* BFD_RELOC_PPC_VLE_LO16D: howto manager. (line 692) +-* BFD_RELOC_PPC_VLE_REL15: howto manager. (line 689) +-* BFD_RELOC_PPC_VLE_REL24: howto manager. (line 690) +-* BFD_RELOC_PPC_VLE_REL8: howto manager. (line 688) +-* BFD_RELOC_PPC_VLE_SDA21: howto manager. (line 697) +-* BFD_RELOC_PPC_VLE_SDA21_LO: howto manager. (line 698) +-* BFD_RELOC_PPC_VLE_SDAREL_HA16A: howto manager. (line 703) +-* BFD_RELOC_PPC_VLE_SDAREL_HA16D: howto manager. (line 704) +-* BFD_RELOC_PPC_VLE_SDAREL_HI16A: howto manager. (line 701) +-* BFD_RELOC_PPC_VLE_SDAREL_HI16D: howto manager. (line 702) +-* BFD_RELOC_PPC_VLE_SDAREL_LO16A: howto manager. (line 699) +-* BFD_RELOC_PPC_VLE_SDAREL_LO16D: howto manager. (line 700) +-* BFD_RELOC_RELC: howto manager. (line 2416) +-* BFD_RELOC_RL78_16_OP: howto manager. (line 1759) +-* BFD_RELOC_RL78_16U: howto manager. (line 1763) +-* BFD_RELOC_RL78_24_OP: howto manager. (line 1760) +-* BFD_RELOC_RL78_24U: howto manager. (line 1764) +-* BFD_RELOC_RL78_32_OP: howto manager. (line 1761) +-* BFD_RELOC_RL78_8U: howto manager. (line 1762) +-* BFD_RELOC_RL78_ABS16: howto manager. (line 1776) +-* BFD_RELOC_RL78_ABS16_REV: howto manager. (line 1777) +-* BFD_RELOC_RL78_ABS16U: howto manager. (line 1780) +-* BFD_RELOC_RL78_ABS16UL: howto manager. (line 1782) +-* BFD_RELOC_RL78_ABS16UW: howto manager. (line 1781) +-* BFD_RELOC_RL78_ABS32: howto manager. (line 1778) +-* BFD_RELOC_RL78_ABS32_REV: howto manager. (line 1779) +-* BFD_RELOC_RL78_ABS8: howto manager. (line 1775) +-* BFD_RELOC_RL78_CODE: howto manager. (line 1787) +-* BFD_RELOC_RL78_DIFF: howto manager. (line 1766) +-* BFD_RELOC_RL78_DIR3U_PCREL: howto manager. (line 1765) +-* BFD_RELOC_RL78_GPRELB: howto manager. (line 1767) +-* BFD_RELOC_RL78_GPRELL: howto manager. (line 1769) +-* BFD_RELOC_RL78_GPRELW: howto manager. (line 1768) +-* BFD_RELOC_RL78_HI16: howto manager. (line 1784) +-* BFD_RELOC_RL78_HI8: howto manager. (line 1785) +-* BFD_RELOC_RL78_LO16: howto manager. (line 1786) +-* BFD_RELOC_RL78_NEG16: howto manager. (line 1756) +-* BFD_RELOC_RL78_NEG24: howto manager. (line 1757) +-* BFD_RELOC_RL78_NEG32: howto manager. (line 1758) +-* BFD_RELOC_RL78_NEG8: howto manager. (line 1755) +-* BFD_RELOC_RL78_OP_AND: howto manager. (line 1773) +-* BFD_RELOC_RL78_OP_NEG: howto manager. (line 1772) +-* BFD_RELOC_RL78_OP_SHRA: howto manager. (line 1774) +-* BFD_RELOC_RL78_OP_SUBTRACT: howto manager. (line 1771) +-* BFD_RELOC_RL78_RELAX: howto manager. (line 1783) +-* BFD_RELOC_RL78_SYM: howto manager. (line 1770) +-* BFD_RELOC_RVA: howto manager. (line 104) +-* BFD_RELOC_RX_16_OP: howto manager. (line 1794) +-* BFD_RELOC_RX_16U: howto manager. (line 1798) +-* BFD_RELOC_RX_24_OP: howto manager. (line 1795) +-* BFD_RELOC_RX_24U: howto manager. (line 1799) +-* BFD_RELOC_RX_32_OP: howto manager. (line 1796) +-* BFD_RELOC_RX_8U: howto manager. (line 1797) +-* BFD_RELOC_RX_ABS16: howto manager. (line 1809) +-* BFD_RELOC_RX_ABS16_REV: howto manager. (line 1810) +-* BFD_RELOC_RX_ABS16U: howto manager. (line 1813) +-* BFD_RELOC_RX_ABS16UL: howto manager. (line 1815) +-* BFD_RELOC_RX_ABS16UW: howto manager. (line 1814) +-* BFD_RELOC_RX_ABS32: howto manager. (line 1811) +-* BFD_RELOC_RX_ABS32_REV: howto manager. (line 1812) +-* BFD_RELOC_RX_ABS8: howto manager. (line 1808) +-* BFD_RELOC_RX_DIFF: howto manager. (line 1801) +-* BFD_RELOC_RX_DIR3U_PCREL: howto manager. (line 1800) +-* BFD_RELOC_RX_GPRELB: howto manager. (line 1802) +-* BFD_RELOC_RX_GPRELL: howto manager. (line 1804) +-* BFD_RELOC_RX_GPRELW: howto manager. (line 1803) +-* BFD_RELOC_RX_NEG16: howto manager. (line 1791) +-* BFD_RELOC_RX_NEG24: howto manager. (line 1792) +-* BFD_RELOC_RX_NEG32: howto manager. (line 1793) +-* BFD_RELOC_RX_NEG8: howto manager. (line 1790) +-* BFD_RELOC_RX_OP_NEG: howto manager. (line 1807) +-* BFD_RELOC_RX_OP_SUBTRACT: howto manager. (line 1806) +-* BFD_RELOC_RX_RELAX: howto manager. (line 1816) +-* BFD_RELOC_RX_SYM: howto manager. (line 1805) +-* BFD_RELOC_SCORE16_BRANCH: howto manager. (line 1959) +-* BFD_RELOC_SCORE16_JMP: howto manager. (line 1956) +-* BFD_RELOC_SCORE_BCMP: howto manager. (line 1962) +-* BFD_RELOC_SCORE_BRANCH: howto manager. (line 1947) +-* BFD_RELOC_SCORE_CALL15: howto manager. (line 1967) +-* BFD_RELOC_SCORE_DUMMY2: howto manager. (line 1943) +-* BFD_RELOC_SCORE_DUMMY_HI16: howto manager. (line 1968) +-* BFD_RELOC_SCORE_GOT15: howto manager. (line 1965) +-* BFD_RELOC_SCORE_GOT_LO16: howto manager. (line 1966) +-* BFD_RELOC_SCORE_GPREL15: howto manager. (line 1940) +-* BFD_RELOC_SCORE_IMM30: howto manager. (line 1950) +-* BFD_RELOC_SCORE_IMM32: howto manager. (line 1953) +-* BFD_RELOC_SCORE_JMP: howto manager. (line 1944) +-* BFD_RELOC_SH_ALIGN: howto manager. (line 971) +-* BFD_RELOC_SH_CODE: howto manager. (line 972) +-* BFD_RELOC_SH_COPY: howto manager. (line 977) +-* BFD_RELOC_SH_COPY64: howto manager. (line 1002) +-* BFD_RELOC_SH_COUNT: howto manager. (line 970) +-* BFD_RELOC_SH_DATA: howto manager. (line 973) +-* BFD_RELOC_SH_DISP12: howto manager. (line 953) +-* BFD_RELOC_SH_DISP12BY2: howto manager. (line 954) +-* BFD_RELOC_SH_DISP12BY4: howto manager. (line 955) +-* BFD_RELOC_SH_DISP12BY8: howto manager. (line 956) +-* BFD_RELOC_SH_DISP20: howto manager. (line 957) +-* BFD_RELOC_SH_DISP20BY8: howto manager. (line 958) +-* BFD_RELOC_SH_FUNCDESC: howto manager. (line 1045) +-* BFD_RELOC_SH_GLOB_DAT: howto manager. (line 978) +-* BFD_RELOC_SH_GLOB_DAT64: howto manager. (line 1003) +-* BFD_RELOC_SH_GOT10BY4: howto manager. (line 1006) +-* BFD_RELOC_SH_GOT10BY8: howto manager. (line 1007) +-* BFD_RELOC_SH_GOT20: howto manager. (line 1039) +-* BFD_RELOC_SH_GOT_HI16: howto manager. (line 985) +-* BFD_RELOC_SH_GOT_LOW16: howto manager. (line 982) +-* BFD_RELOC_SH_GOT_MEDHI16: howto manager. (line 984) +-* BFD_RELOC_SH_GOT_MEDLOW16: howto manager. (line 983) +-* BFD_RELOC_SH_GOTFUNCDESC: howto manager. (line 1041) +-* BFD_RELOC_SH_GOTFUNCDESC20: howto manager. (line 1042) +-* BFD_RELOC_SH_GOTOFF20: howto manager. (line 1040) +-* BFD_RELOC_SH_GOTOFF_HI16: howto manager. (line 997) +-* BFD_RELOC_SH_GOTOFF_LOW16: howto manager. (line 994) +-* BFD_RELOC_SH_GOTOFF_MEDHI16: howto manager. (line 996) +-* BFD_RELOC_SH_GOTOFF_MEDLOW16: howto manager. (line 995) +-* BFD_RELOC_SH_GOTOFFFUNCDESC: howto manager. (line 1043) +-* BFD_RELOC_SH_GOTOFFFUNCDESC20: howto manager. (line 1044) +-* BFD_RELOC_SH_GOTPC: howto manager. (line 981) +-* BFD_RELOC_SH_GOTPC_HI16: howto manager. (line 1001) +-* BFD_RELOC_SH_GOTPC_LOW16: howto manager. (line 998) +-* BFD_RELOC_SH_GOTPC_MEDHI16: howto manager. (line 1000) +-* BFD_RELOC_SH_GOTPC_MEDLOW16: howto manager. (line 999) +-* BFD_RELOC_SH_GOTPLT10BY4: howto manager. (line 1008) +-* BFD_RELOC_SH_GOTPLT10BY8: howto manager. (line 1009) +-* BFD_RELOC_SH_GOTPLT32: howto manager. (line 1010) +-* BFD_RELOC_SH_GOTPLT_HI16: howto manager. (line 989) +-* BFD_RELOC_SH_GOTPLT_LOW16: howto manager. (line 986) +-* BFD_RELOC_SH_GOTPLT_MEDHI16: howto manager. (line 988) +-* BFD_RELOC_SH_GOTPLT_MEDLOW16: howto manager. (line 987) +-* BFD_RELOC_SH_IMM3: howto manager. (line 951) +-* BFD_RELOC_SH_IMM3U: howto manager. (line 952) +-* BFD_RELOC_SH_IMM4: howto manager. (line 959) +-* BFD_RELOC_SH_IMM4BY2: howto manager. (line 960) +-* BFD_RELOC_SH_IMM4BY4: howto manager. (line 961) +-* BFD_RELOC_SH_IMM8: howto manager. (line 962) +-* BFD_RELOC_SH_IMM8BY2: howto manager. (line 963) +-* BFD_RELOC_SH_IMM8BY4: howto manager. (line 964) +-* BFD_RELOC_SH_IMM_HI16: howto manager. (line 1028) +-* BFD_RELOC_SH_IMM_HI16_PCREL: howto manager. (line 1029) +-* BFD_RELOC_SH_IMM_LOW16: howto manager. (line 1022) +-* BFD_RELOC_SH_IMM_LOW16_PCREL: howto manager. (line 1023) +-* BFD_RELOC_SH_IMM_MEDHI16: howto manager. (line 1026) +-* BFD_RELOC_SH_IMM_MEDHI16_PCREL: howto manager. (line 1027) +-* BFD_RELOC_SH_IMM_MEDLOW16: howto manager. (line 1024) +-* BFD_RELOC_SH_IMM_MEDLOW16_PCREL: howto manager. (line 1025) +-* BFD_RELOC_SH_IMMS10: howto manager. (line 1016) +-* BFD_RELOC_SH_IMMS10BY2: howto manager. (line 1017) +-* BFD_RELOC_SH_IMMS10BY4: howto manager. (line 1018) +-* BFD_RELOC_SH_IMMS10BY8: howto manager. (line 1019) +-* BFD_RELOC_SH_IMMS16: howto manager. (line 1020) +-* BFD_RELOC_SH_IMMS6: howto manager. (line 1013) +-* BFD_RELOC_SH_IMMS6BY32: howto manager. (line 1014) +-* BFD_RELOC_SH_IMMU16: howto manager. (line 1021) +-* BFD_RELOC_SH_IMMU5: howto manager. (line 1012) +-* BFD_RELOC_SH_IMMU6: howto manager. (line 1015) +-* BFD_RELOC_SH_JMP_SLOT: howto manager. (line 979) +-* BFD_RELOC_SH_JMP_SLOT64: howto manager. (line 1004) +-* BFD_RELOC_SH_LABEL: howto manager. (line 974) +-* BFD_RELOC_SH_LOOP_END: howto manager. (line 976) +-* BFD_RELOC_SH_LOOP_START: howto manager. (line 975) +-* BFD_RELOC_SH_PCDISP12BY2: howto manager. (line 950) +-* BFD_RELOC_SH_PCDISP8BY2: howto manager. (line 949) +-* BFD_RELOC_SH_PCRELIMM8BY2: howto manager. (line 965) +-* BFD_RELOC_SH_PCRELIMM8BY4: howto manager. (line 966) +-* BFD_RELOC_SH_PLT_HI16: howto manager. (line 993) +-* BFD_RELOC_SH_PLT_LOW16: howto manager. (line 990) +-* BFD_RELOC_SH_PLT_MEDHI16: howto manager. (line 992) +-* BFD_RELOC_SH_PLT_MEDLOW16: howto manager. (line 991) +-* BFD_RELOC_SH_PT_16: howto manager. (line 1030) +-* BFD_RELOC_SH_RELATIVE: howto manager. (line 980) +-* BFD_RELOC_SH_RELATIVE64: howto manager. (line 1005) +-* BFD_RELOC_SH_SHMEDIA_CODE: howto manager. (line 1011) +-* BFD_RELOC_SH_SWITCH16: howto manager. (line 967) +-* BFD_RELOC_SH_SWITCH32: howto manager. (line 968) +-* BFD_RELOC_SH_TLS_DTPMOD32: howto manager. (line 1036) +-* BFD_RELOC_SH_TLS_DTPOFF32: howto manager. (line 1037) +-* BFD_RELOC_SH_TLS_GD_32: howto manager. (line 1031) +-* BFD_RELOC_SH_TLS_IE_32: howto manager. (line 1034) +-* BFD_RELOC_SH_TLS_LD_32: howto manager. (line 1032) +-* BFD_RELOC_SH_TLS_LDO_32: howto manager. (line 1033) +-* BFD_RELOC_SH_TLS_LE_32: howto manager. (line 1035) +-* BFD_RELOC_SH_TLS_TPOFF32: howto manager. (line 1038) +-* BFD_RELOC_SH_USES: howto manager. (line 969) +-* BFD_RELOC_SIZE32: howto manager. (line 74) +-* BFD_RELOC_SIZE64: howto manager. (line 75) +-* BFD_RELOC_SPARC13: howto manager. (line 138) +-* BFD_RELOC_SPARC22: howto manager. (line 137) +-* BFD_RELOC_SPARC_10: howto manager. (line 167) +-* BFD_RELOC_SPARC_11: howto manager. (line 168) +-* BFD_RELOC_SPARC_5: howto manager. (line 180) +-* BFD_RELOC_SPARC_6: howto manager. (line 179) +-* BFD_RELOC_SPARC_64: howto manager. (line 166) +-* BFD_RELOC_SPARC_7: howto manager. (line 178) +-* BFD_RELOC_SPARC_BASE13: howto manager. (line 162) +-* BFD_RELOC_SPARC_BASE22: howto manager. (line 163) +-* BFD_RELOC_SPARC_COPY: howto manager. (line 145) +-* BFD_RELOC_SPARC_DISP64: howto manager. (line 181) +-* BFD_RELOC_SPARC_GLOB_DAT: howto manager. (line 146) +-* BFD_RELOC_SPARC_GOT10: howto manager. (line 139) +-* BFD_RELOC_SPARC_GOT13: howto manager. (line 140) +-* BFD_RELOC_SPARC_GOT22: howto manager. (line 141) +-* BFD_RELOC_SPARC_GOTDATA_HIX22: howto manager. (line 152) +-* BFD_RELOC_SPARC_GOTDATA_LOX10: howto manager. (line 153) +-* BFD_RELOC_SPARC_GOTDATA_OP: howto manager. (line 156) +-* BFD_RELOC_SPARC_GOTDATA_OP_HIX22: howto manager. (line 154) +-* BFD_RELOC_SPARC_GOTDATA_OP_LOX10: howto manager. (line 155) +-* BFD_RELOC_SPARC_H34: howto manager. (line 190) +-* BFD_RELOC_SPARC_H44: howto manager. (line 186) +-* BFD_RELOC_SPARC_HH22: howto manager. (line 170) +-* BFD_RELOC_SPARC_HIX22: howto manager. (line 184) +-* BFD_RELOC_SPARC_HM10: howto manager. (line 171) +-* BFD_RELOC_SPARC_IRELATIVE: howto manager. (line 158) +-* BFD_RELOC_SPARC_JMP_IREL: howto manager. (line 157) +-* BFD_RELOC_SPARC_JMP_SLOT: howto manager. (line 147) +-* BFD_RELOC_SPARC_L44: howto manager. (line 188) +-* BFD_RELOC_SPARC_LM22: howto manager. (line 172) +-* BFD_RELOC_SPARC_LOX10: howto manager. (line 185) +-* BFD_RELOC_SPARC_M44: howto manager. (line 187) +-* BFD_RELOC_SPARC_OLO10: howto manager. (line 169) +-* BFD_RELOC_SPARC_PC10: howto manager. (line 142) +-* BFD_RELOC_SPARC_PC22: howto manager. (line 143) +-* BFD_RELOC_SPARC_PC_HH22: howto manager. (line 173) +-* BFD_RELOC_SPARC_PC_HM10: howto manager. (line 174) +-* BFD_RELOC_SPARC_PC_LM22: howto manager. (line 175) +-* BFD_RELOC_SPARC_PLT32: howto manager. (line 182) +-* BFD_RELOC_SPARC_PLT64: howto manager. (line 183) +-* BFD_RELOC_SPARC_REGISTER: howto manager. (line 189) +-* BFD_RELOC_SPARC_RELATIVE: howto manager. (line 148) +-* BFD_RELOC_SPARC_REV32: howto manager. (line 196) +-* BFD_RELOC_SPARC_SIZE32: howto manager. (line 191) +-* BFD_RELOC_SPARC_SIZE64: howto manager. (line 192) +-* BFD_RELOC_SPARC_TLS_DTPMOD32: howto manager. (line 217) +-* BFD_RELOC_SPARC_TLS_DTPMOD64: howto manager. (line 218) +-* BFD_RELOC_SPARC_TLS_DTPOFF32: howto manager. (line 219) +-* BFD_RELOC_SPARC_TLS_DTPOFF64: howto manager. (line 220) +-* BFD_RELOC_SPARC_TLS_GD_ADD: howto manager. (line 201) +-* BFD_RELOC_SPARC_TLS_GD_CALL: howto manager. (line 202) +-* BFD_RELOC_SPARC_TLS_GD_HI22: howto manager. (line 199) +-* BFD_RELOC_SPARC_TLS_GD_LO10: howto manager. (line 200) +-* BFD_RELOC_SPARC_TLS_IE_ADD: howto manager. (line 214) +-* BFD_RELOC_SPARC_TLS_IE_HI22: howto manager. (line 210) +-* BFD_RELOC_SPARC_TLS_IE_LD: howto manager. (line 212) +-* BFD_RELOC_SPARC_TLS_IE_LDX: howto manager. (line 213) +-* BFD_RELOC_SPARC_TLS_IE_LO10: howto manager. (line 211) +-* BFD_RELOC_SPARC_TLS_LDM_ADD: howto manager. (line 205) +-* BFD_RELOC_SPARC_TLS_LDM_CALL: howto manager. (line 206) +-* BFD_RELOC_SPARC_TLS_LDM_HI22: howto manager. (line 203) +-* BFD_RELOC_SPARC_TLS_LDM_LO10: howto manager. (line 204) +-* BFD_RELOC_SPARC_TLS_LDO_ADD: howto manager. (line 209) +-* BFD_RELOC_SPARC_TLS_LDO_HIX22: howto manager. (line 207) +-* BFD_RELOC_SPARC_TLS_LDO_LOX10: howto manager. (line 208) +-* BFD_RELOC_SPARC_TLS_LE_HIX22: howto manager. (line 215) +-* BFD_RELOC_SPARC_TLS_LE_LOX10: howto manager. (line 216) +-* BFD_RELOC_SPARC_TLS_TPOFF32: howto manager. (line 221) +-* BFD_RELOC_SPARC_TLS_TPOFF64: howto manager. (line 222) +-* BFD_RELOC_SPARC_UA16: howto manager. (line 149) +-* BFD_RELOC_SPARC_UA32: howto manager. (line 150) +-* BFD_RELOC_SPARC_UA64: howto manager. (line 151) +-* BFD_RELOC_SPARC_WDISP10: howto manager. (line 193) +-* BFD_RELOC_SPARC_WDISP16: howto manager. (line 176) +-* BFD_RELOC_SPARC_WDISP19: howto manager. (line 177) +-* BFD_RELOC_SPARC_WDISP22: howto manager. (line 136) +-* BFD_RELOC_SPARC_WPLT30: howto manager. (line 144) +-* BFD_RELOC_SPU_ADD_PIC: howto manager. (line 239) +-* BFD_RELOC_SPU_HI16: howto manager. (line 236) +-* BFD_RELOC_SPU_IMM10: howto manager. (line 227) +-* BFD_RELOC_SPU_IMM10W: howto manager. (line 228) +-* BFD_RELOC_SPU_IMM16: howto manager. (line 229) +-* BFD_RELOC_SPU_IMM16W: howto manager. (line 230) +-* BFD_RELOC_SPU_IMM18: howto manager. (line 231) +-* BFD_RELOC_SPU_IMM7: howto manager. (line 225) +-* BFD_RELOC_SPU_IMM8: howto manager. (line 226) +-* BFD_RELOC_SPU_LO16: howto manager. (line 235) +-* BFD_RELOC_SPU_PCREL16: howto manager. (line 234) +-* BFD_RELOC_SPU_PCREL9a: howto manager. (line 232) +-* BFD_RELOC_SPU_PCREL9b: howto manager. (line 233) +-* BFD_RELOC_SPU_PPU32: howto manager. (line 237) +-* BFD_RELOC_SPU_PPU64: howto manager. (line 238) +-* BFD_RELOC_THUMB_PCREL_BLX: howto manager. (line 798) +-* BFD_RELOC_THUMB_PCREL_BRANCH12: howto manager. (line 812) +-* BFD_RELOC_THUMB_PCREL_BRANCH20: howto manager. (line 813) +-* BFD_RELOC_THUMB_PCREL_BRANCH23: howto manager. (line 814) +-* BFD_RELOC_THUMB_PCREL_BRANCH25: howto manager. (line 815) +-* BFD_RELOC_THUMB_PCREL_BRANCH7: howto manager. (line 810) +-* BFD_RELOC_THUMB_PCREL_BRANCH9: howto manager. (line 811) +-* BFD_RELOC_TIC30_LDP: howto manager. (line 1430) +-* BFD_RELOC_TIC54X_16_OF_23: howto manager. (line 1448) +-* BFD_RELOC_TIC54X_23: howto manager. (line 1445) +-* BFD_RELOC_TIC54X_MS7_OF_23: howto manager. (line 1453) +-* BFD_RELOC_TIC54X_PARTLS7: howto manager. (line 1435) +-* BFD_RELOC_TIC54X_PARTMS9: howto manager. (line 1440) +-* BFD_RELOC_TILEGX_BROFF_X1: howto manager. (line 3132) +-* BFD_RELOC_TILEGX_COPY: howto manager. (line 3128) +-* BFD_RELOC_TILEGX_DEST_IMM8_X1: howto manager. (line 3139) +-* BFD_RELOC_TILEGX_GLOB_DAT: howto manager. (line 3129) +-* BFD_RELOC_TILEGX_HW0: howto manager. (line 3121) +-* BFD_RELOC_TILEGX_HW0_LAST: howto manager. (line 3125) +-* BFD_RELOC_TILEGX_HW1: howto manager. (line 3122) +-* BFD_RELOC_TILEGX_HW1_LAST: howto manager. (line 3126) +-* BFD_RELOC_TILEGX_HW2: howto manager. (line 3123) +-* BFD_RELOC_TILEGX_HW2_LAST: howto manager. (line 3127) +-* BFD_RELOC_TILEGX_HW3: howto manager. (line 3124) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0: howto manager. (line 3148) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0_GOT: howto manager. (line 3176) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST: howto manager. (line 3156) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_GOT: howto manager. (line 3184) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PCREL: howto manager. (line 3170) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL: howto manager. +- (line 3204) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD: howto manager. (line 3198) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE: howto manager. (line 3210) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE: howto manager. (line 3194) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0_PCREL: howto manager. (line 3162) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0_PLT_PCREL: howto manager. (line 3178) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD: howto manager. (line 3190) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE: howto manager. (line 3202) +-* BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE: howto manager. (line 3192) +-* BFD_RELOC_TILEGX_IMM16_X0_HW1: howto manager. (line 3150) +-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST: howto manager. (line 3158) +-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_GOT: howto manager. (line 3186) +-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PCREL: howto manager. (line 3172) +-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL: howto manager. +- (line 3206) +-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD: howto manager. (line 3200) +-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE: howto manager. (line 3212) +-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE: howto manager. (line 3196) +-* BFD_RELOC_TILEGX_IMM16_X0_HW1_PCREL: howto manager. (line 3164) +-* BFD_RELOC_TILEGX_IMM16_X0_HW1_PLT_PCREL: howto manager. (line 3180) +-* BFD_RELOC_TILEGX_IMM16_X0_HW2: howto manager. (line 3152) +-* BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST: howto manager. (line 3160) +-* BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PCREL: howto manager. (line 3174) +-* BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL: howto manager. +- (line 3208) +-* BFD_RELOC_TILEGX_IMM16_X0_HW2_PCREL: howto manager. (line 3166) +-* BFD_RELOC_TILEGX_IMM16_X0_HW2_PLT_PCREL: howto manager. (line 3182) +-* BFD_RELOC_TILEGX_IMM16_X0_HW3: howto manager. (line 3154) +-* BFD_RELOC_TILEGX_IMM16_X0_HW3_PCREL: howto manager. (line 3168) +-* BFD_RELOC_TILEGX_IMM16_X0_HW3_PLT_PCREL: howto manager. (line 3188) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0: howto manager. (line 3149) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0_GOT: howto manager. (line 3177) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST: howto manager. (line 3157) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_GOT: howto manager. (line 3185) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PCREL: howto manager. (line 3171) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL: howto manager. +- (line 3205) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD: howto manager. (line 3199) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE: howto manager. (line 3211) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE: howto manager. (line 3195) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0_PCREL: howto manager. (line 3163) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0_PLT_PCREL: howto manager. (line 3179) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD: howto manager. (line 3191) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE: howto manager. (line 3203) +-* BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE: howto manager. (line 3193) +-* BFD_RELOC_TILEGX_IMM16_X1_HW1: howto manager. (line 3151) +-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST: howto manager. (line 3159) +-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_GOT: howto manager. (line 3187) +-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PCREL: howto manager. (line 3173) +-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL: howto manager. +- (line 3207) +-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD: howto manager. (line 3201) +-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE: howto manager. (line 3213) +-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE: howto manager. (line 3197) +-* BFD_RELOC_TILEGX_IMM16_X1_HW1_PCREL: howto manager. (line 3165) +-* BFD_RELOC_TILEGX_IMM16_X1_HW1_PLT_PCREL: howto manager. (line 3181) +-* BFD_RELOC_TILEGX_IMM16_X1_HW2: howto manager. (line 3153) +-* BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST: howto manager. (line 3161) +-* BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PCREL: howto manager. (line 3175) +-* BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL: howto manager. +- (line 3209) +-* BFD_RELOC_TILEGX_IMM16_X1_HW2_PCREL: howto manager. (line 3167) +-* BFD_RELOC_TILEGX_IMM16_X1_HW2_PLT_PCREL: howto manager. (line 3183) +-* BFD_RELOC_TILEGX_IMM16_X1_HW3: howto manager. (line 3155) +-* BFD_RELOC_TILEGX_IMM16_X1_HW3_PCREL: howto manager. (line 3169) +-* BFD_RELOC_TILEGX_IMM16_X1_HW3_PLT_PCREL: howto manager. (line 3189) +-* BFD_RELOC_TILEGX_IMM8_X0: howto manager. (line 3135) +-* BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD: howto manager. (line 3226) +-* BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD: howto manager. (line 3221) +-* BFD_RELOC_TILEGX_IMM8_X1: howto manager. (line 3137) +-* BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD: howto manager. (line 3227) +-* BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD: howto manager. (line 3222) +-* BFD_RELOC_TILEGX_IMM8_Y0: howto manager. (line 3136) +-* BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD: howto manager. (line 3228) +-* BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD: howto manager. (line 3223) +-* BFD_RELOC_TILEGX_IMM8_Y1: howto manager. (line 3138) +-* BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD: howto manager. (line 3229) +-* BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD: howto manager. (line 3224) +-* BFD_RELOC_TILEGX_JMP_SLOT: howto manager. (line 3130) +-* BFD_RELOC_TILEGX_JUMPOFF_X1: howto manager. (line 3133) +-* BFD_RELOC_TILEGX_JUMPOFF_X1_PLT: howto manager. (line 3134) +-* BFD_RELOC_TILEGX_MF_IMM14_X1: howto manager. (line 3141) +-* BFD_RELOC_TILEGX_MMEND_X0: howto manager. (line 3143) +-* BFD_RELOC_TILEGX_MMSTART_X0: howto manager. (line 3142) +-* BFD_RELOC_TILEGX_MT_IMM14_X1: howto manager. (line 3140) +-* BFD_RELOC_TILEGX_RELATIVE: howto manager. (line 3131) +-* BFD_RELOC_TILEGX_SHAMT_X0: howto manager. (line 3144) +-* BFD_RELOC_TILEGX_SHAMT_X1: howto manager. (line 3145) +-* BFD_RELOC_TILEGX_SHAMT_Y0: howto manager. (line 3146) +-* BFD_RELOC_TILEGX_SHAMT_Y1: howto manager. (line 3147) +-* BFD_RELOC_TILEGX_TLS_DTPMOD32: howto manager. (line 3217) +-* BFD_RELOC_TILEGX_TLS_DTPMOD64: howto manager. (line 3214) +-* BFD_RELOC_TILEGX_TLS_DTPOFF32: howto manager. (line 3218) +-* BFD_RELOC_TILEGX_TLS_DTPOFF64: howto manager. (line 3215) +-* BFD_RELOC_TILEGX_TLS_GD_CALL: howto manager. (line 3220) +-* BFD_RELOC_TILEGX_TLS_IE_LOAD: howto manager. (line 3225) +-* BFD_RELOC_TILEGX_TLS_TPOFF32: howto manager. (line 3219) +-* BFD_RELOC_TILEGX_TLS_TPOFF64: howto manager. (line 3216) +-* BFD_RELOC_TILEPRO_BROFF_X1: howto manager. (line 3044) +-* BFD_RELOC_TILEPRO_COPY: howto manager. (line 3040) +-* BFD_RELOC_TILEPRO_DEST_IMM8_X1: howto manager. (line 3051) +-* BFD_RELOC_TILEPRO_GLOB_DAT: howto manager. (line 3041) +-* BFD_RELOC_TILEPRO_IMM16_X0: howto manager. (line 3054) +-* BFD_RELOC_TILEPRO_IMM16_X0_GOT: howto manager. (line 3070) +-* BFD_RELOC_TILEPRO_IMM16_X0_GOT_HA: howto manager. (line 3076) +-* BFD_RELOC_TILEPRO_IMM16_X0_GOT_HI: howto manager. (line 3074) +-* BFD_RELOC_TILEPRO_IMM16_X0_GOT_LO: howto manager. (line 3072) +-* BFD_RELOC_TILEPRO_IMM16_X0_HA: howto manager. (line 3060) +-* BFD_RELOC_TILEPRO_IMM16_X0_HA_PCREL: howto manager. (line 3068) +-* BFD_RELOC_TILEPRO_IMM16_X0_HI: howto manager. (line 3058) +-* BFD_RELOC_TILEPRO_IMM16_X0_HI_PCREL: howto manager. (line 3066) +-* BFD_RELOC_TILEPRO_IMM16_X0_LO: howto manager. (line 3056) +-* BFD_RELOC_TILEPRO_IMM16_X0_LO_PCREL: howto manager. (line 3064) +-* BFD_RELOC_TILEPRO_IMM16_X0_PCREL: howto manager. (line 3062) +-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD: howto manager. (line 3092) +-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA: howto manager. (line 3098) +-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI: howto manager. (line 3096) +-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO: howto manager. (line 3094) +-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE: howto manager. (line 3100) +-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA: howto manager. (line 3106) +-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI: howto manager. (line 3104) +-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO: howto manager. (line 3102) +-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE: howto manager. (line 3111) +-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA: howto manager. (line 3117) +-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI: howto manager. (line 3115) +-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO: howto manager. (line 3113) +-* BFD_RELOC_TILEPRO_IMM16_X1: howto manager. (line 3055) +-* BFD_RELOC_TILEPRO_IMM16_X1_GOT: howto manager. (line 3071) +-* BFD_RELOC_TILEPRO_IMM16_X1_GOT_HA: howto manager. (line 3077) +-* BFD_RELOC_TILEPRO_IMM16_X1_GOT_HI: howto manager. (line 3075) +-* BFD_RELOC_TILEPRO_IMM16_X1_GOT_LO: howto manager. (line 3073) +-* BFD_RELOC_TILEPRO_IMM16_X1_HA: howto manager. (line 3061) +-* BFD_RELOC_TILEPRO_IMM16_X1_HA_PCREL: howto manager. (line 3069) +-* BFD_RELOC_TILEPRO_IMM16_X1_HI: howto manager. (line 3059) +-* BFD_RELOC_TILEPRO_IMM16_X1_HI_PCREL: howto manager. (line 3067) +-* BFD_RELOC_TILEPRO_IMM16_X1_LO: howto manager. (line 3057) +-* BFD_RELOC_TILEPRO_IMM16_X1_LO_PCREL: howto manager. (line 3065) +-* BFD_RELOC_TILEPRO_IMM16_X1_PCREL: howto manager. (line 3063) +-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD: howto manager. (line 3093) +-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA: howto manager. (line 3099) +-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI: howto manager. (line 3097) +-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO: howto manager. (line 3095) +-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE: howto manager. (line 3101) +-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA: howto manager. (line 3107) +-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI: howto manager. (line 3105) +-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO: howto manager. (line 3103) +-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE: howto manager. (line 3112) +-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA: howto manager. (line 3118) +-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI: howto manager. (line 3116) +-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO: howto manager. (line 3114) +-* BFD_RELOC_TILEPRO_IMM8_X0: howto manager. (line 3047) +-* BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD: howto manager. (line 3087) +-* BFD_RELOC_TILEPRO_IMM8_X1: howto manager. (line 3049) +-* BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD: howto manager. (line 3088) +-* BFD_RELOC_TILEPRO_IMM8_Y0: howto manager. (line 3048) +-* BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD: howto manager. (line 3089) +-* BFD_RELOC_TILEPRO_IMM8_Y1: howto manager. (line 3050) +-* BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD: howto manager. (line 3090) +-* BFD_RELOC_TILEPRO_JMP_SLOT: howto manager. (line 3042) +-* BFD_RELOC_TILEPRO_JOFFLONG_X1: howto manager. (line 3045) +-* BFD_RELOC_TILEPRO_JOFFLONG_X1_PLT: howto manager. (line 3046) +-* BFD_RELOC_TILEPRO_MF_IMM15_X1: howto manager. (line 3053) +-* BFD_RELOC_TILEPRO_MMEND_X0: howto manager. (line 3079) +-* BFD_RELOC_TILEPRO_MMEND_X1: howto manager. (line 3081) +-* BFD_RELOC_TILEPRO_MMSTART_X0: howto manager. (line 3078) +-* BFD_RELOC_TILEPRO_MMSTART_X1: howto manager. (line 3080) +-* BFD_RELOC_TILEPRO_MT_IMM15_X1: howto manager. (line 3052) +-* BFD_RELOC_TILEPRO_RELATIVE: howto manager. (line 3043) +-* BFD_RELOC_TILEPRO_SHAMT_X0: howto manager. (line 3082) +-* BFD_RELOC_TILEPRO_SHAMT_X1: howto manager. (line 3083) +-* BFD_RELOC_TILEPRO_SHAMT_Y0: howto manager. (line 3084) +-* BFD_RELOC_TILEPRO_SHAMT_Y1: howto manager. (line 3085) +-* BFD_RELOC_TILEPRO_TLS_DTPMOD32: howto manager. (line 3108) +-* BFD_RELOC_TILEPRO_TLS_DTPOFF32: howto manager. (line 3109) +-* BFD_RELOC_TILEPRO_TLS_GD_CALL: howto manager. (line 3086) +-* BFD_RELOC_TILEPRO_TLS_IE_LOAD: howto manager. (line 3091) +-* BFD_RELOC_TILEPRO_TLS_TPOFF32: howto manager. (line 3110) +-* bfd_reloc_type_lookup: howto manager. (line 3255) +-* BFD_RELOC_V850_16_GOT: howto manager. (line 1394) +-* BFD_RELOC_V850_16_GOTOFF: howto manager. (line 1418) +-* BFD_RELOC_V850_16_PCREL: howto manager. (line 1364) +-* BFD_RELOC_V850_16_S1: howto manager. (line 1382) +-* BFD_RELOC_V850_16_SPLIT_OFFSET: howto manager. (line 1379) +-* BFD_RELOC_V850_17_PCREL: howto manager. (line 1367) +-* BFD_RELOC_V850_22_PCREL: howto manager. (line 1299) +-* BFD_RELOC_V850_22_PLT_PCREL: howto manager. (line 1400) +-* BFD_RELOC_V850_23: howto manager. (line 1370) +-* BFD_RELOC_V850_32_ABS: howto manager. (line 1376) +-* BFD_RELOC_V850_32_GOT: howto manager. (line 1397) +-* BFD_RELOC_V850_32_GOTOFF: howto manager. (line 1421) +-* BFD_RELOC_V850_32_GOTPCREL: howto manager. (line 1391) +-* BFD_RELOC_V850_32_PCREL: howto manager. (line 1373) +-* BFD_RELOC_V850_32_PLT_PCREL: howto manager. (line 1403) +-* BFD_RELOC_V850_9_PCREL: howto manager. (line 1296) +-* BFD_RELOC_V850_ALIGN: howto manager. (line 1357) +-* BFD_RELOC_V850_CALLT_15_16_OFFSET: howto manager. (line 1388) +-* BFD_RELOC_V850_CALLT_16_16_OFFSET: howto manager. (line 1348) +-* BFD_RELOC_V850_CALLT_6_7_OFFSET: howto manager. (line 1345) +-* BFD_RELOC_V850_CODE: howto manager. (line 1424) +-* BFD_RELOC_V850_COPY: howto manager. (line 1406) +-* BFD_RELOC_V850_DATA: howto manager. (line 1427) +-* BFD_RELOC_V850_GLOB_DAT: howto manager. (line 1409) +-* BFD_RELOC_V850_JMP_SLOT: howto manager. (line 1412) +-* BFD_RELOC_V850_LO16_S1: howto manager. (line 1385) +-* BFD_RELOC_V850_LO16_SPLIT_OFFSET: howto manager. (line 1360) +-* BFD_RELOC_V850_LONGCALL: howto manager. (line 1351) +-* BFD_RELOC_V850_LONGJUMP: howto manager. (line 1354) +-* BFD_RELOC_V850_RELATIVE: howto manager. (line 1415) +-* BFD_RELOC_V850_SDA_15_16_OFFSET: howto manager. (line 1305) +-* BFD_RELOC_V850_SDA_16_16_OFFSET: howto manager. (line 1302) +-* BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET: howto manager. (line 1337) +-* BFD_RELOC_V850_TDA_16_16_OFFSET: howto manager. (line 1327) +-* BFD_RELOC_V850_TDA_4_4_OFFSET: howto manager. (line 1334) +-* BFD_RELOC_V850_TDA_4_5_OFFSET: howto manager. (line 1330) +-* BFD_RELOC_V850_TDA_6_8_OFFSET: howto manager. (line 1316) +-* BFD_RELOC_V850_TDA_7_7_OFFSET: howto manager. (line 1324) +-* BFD_RELOC_V850_TDA_7_8_OFFSET: howto manager. (line 1320) +-* BFD_RELOC_V850_ZDA_15_16_OFFSET: howto manager. (line 1312) +-* BFD_RELOC_V850_ZDA_16_16_OFFSET: howto manager. (line 1309) +-* BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET: howto manager. (line 1341) +-* BFD_RELOC_VAX_GLOB_DAT: howto manager. (line 2425) +-* BFD_RELOC_VAX_JMP_SLOT: howto manager. (line 2426) +-* BFD_RELOC_VAX_RELATIVE: howto manager. (line 2427) +-* BFD_RELOC_VPE4KMATH_DATA: howto manager. (line 2001) +-* BFD_RELOC_VPE4KMATH_INSN: howto manager. (line 2002) +-* BFD_RELOC_VTABLE_ENTRY: howto manager. (line 2006) +-* BFD_RELOC_VTABLE_INHERIT: howto manager. (line 2005) +-* BFD_RELOC_X86_64_32S: howto manager. (line 608) +-* BFD_RELOC_X86_64_COPY: howto manager. (line 603) +-* BFD_RELOC_X86_64_DTPMOD64: howto manager. (line 609) +-* BFD_RELOC_X86_64_DTPOFF32: howto manager. (line 614) +-* BFD_RELOC_X86_64_DTPOFF64: howto manager. (line 610) +-* BFD_RELOC_X86_64_GLOB_DAT: howto manager. (line 604) +-* BFD_RELOC_X86_64_GOT32: howto manager. (line 601) +-* BFD_RELOC_X86_64_GOT64: howto manager. (line 619) +-* BFD_RELOC_X86_64_GOTOFF64: howto manager. (line 617) +-* BFD_RELOC_X86_64_GOTPC32: howto manager. (line 618) +-* BFD_RELOC_X86_64_GOTPC32_TLSDESC: howto manager. (line 624) +-* BFD_RELOC_X86_64_GOTPC64: howto manager. (line 621) +-* BFD_RELOC_X86_64_GOTPCREL: howto manager. (line 607) +-* BFD_RELOC_X86_64_GOTPCREL64: howto manager. (line 620) +-* BFD_RELOC_X86_64_GOTPLT64: howto manager. (line 622) +-* BFD_RELOC_X86_64_GOTTPOFF: howto manager. (line 615) +-* BFD_RELOC_X86_64_IRELATIVE: howto manager. (line 627) +-* BFD_RELOC_X86_64_JUMP_SLOT: howto manager. (line 605) +-* BFD_RELOC_X86_64_PC32_BND: howto manager. (line 628) +-* BFD_RELOC_X86_64_PLT32: howto manager. (line 602) +-* BFD_RELOC_X86_64_PLT32_BND: howto manager. (line 629) +-* BFD_RELOC_X86_64_PLTOFF64: howto manager. (line 623) +-* BFD_RELOC_X86_64_RELATIVE: howto manager. (line 606) +-* BFD_RELOC_X86_64_TLSDESC: howto manager. (line 626) +-* BFD_RELOC_X86_64_TLSDESC_CALL: howto manager. (line 625) +-* BFD_RELOC_X86_64_TLSGD: howto manager. (line 612) +-* BFD_RELOC_X86_64_TLSLD: howto manager. (line 613) +-* BFD_RELOC_X86_64_TPOFF32: howto manager. (line 616) +-* BFD_RELOC_X86_64_TPOFF64: howto manager. (line 611) +-* BFD_RELOC_XC16X_PAG: howto manager. (line 2419) +-* BFD_RELOC_XC16X_POF: howto manager. (line 2420) +-* BFD_RELOC_XC16X_SEG: howto manager. (line 2421) +-* BFD_RELOC_XC16X_SOF: howto manager. (line 2422) +-* BFD_RELOC_XGATE_24: howto manager. (line 2164) +-* BFD_RELOC_XGATE_GPAGE: howto manager. (line 2161) +-* BFD_RELOC_XGATE_IMM3: howto manager. (line 2181) +-* BFD_RELOC_XGATE_IMM4: howto manager. (line 2184) +-* BFD_RELOC_XGATE_IMM5: howto manager. (line 2187) +-* BFD_RELOC_XGATE_IMM8_HI: howto manager. (line 2177) +-* BFD_RELOC_XGATE_IMM8_LO: howto manager. (line 2173) +-* BFD_RELOC_XGATE_LO16: howto manager. (line 2157) +-* BFD_RELOC_XGATE_PCREL_10: howto manager. (line 2170) +-* BFD_RELOC_XGATE_PCREL_9: howto manager. (line 2167) +-* BFD_RELOC_XGATE_RL_GROUP: howto manager. (line 2152) +-* BFD_RELOC_XGATE_RL_JUMP: howto manager. (line 2148) +-* BFD_RELOC_XSTORMY16_12: howto manager. (line 2411) +-* BFD_RELOC_XSTORMY16_24: howto manager. (line 2412) +-* BFD_RELOC_XSTORMY16_FPTR16: howto manager. (line 2413) +-* BFD_RELOC_XSTORMY16_REL_12: howto manager. (line 2410) +-* BFD_RELOC_XTENSA_ASM_EXPAND: howto manager. (line 2582) +-* BFD_RELOC_XTENSA_ASM_SIMPLIFY: howto manager. (line 2587) +-* BFD_RELOC_XTENSA_DIFF16: howto manager. (line 2529) +-* BFD_RELOC_XTENSA_DIFF32: howto manager. (line 2530) +-* BFD_RELOC_XTENSA_DIFF8: howto manager. (line 2528) +-* BFD_RELOC_XTENSA_GLOB_DAT: howto manager. (line 2518) +-* BFD_RELOC_XTENSA_JMP_SLOT: howto manager. (line 2519) +-* BFD_RELOC_XTENSA_OP0: howto manager. (line 2576) +-* BFD_RELOC_XTENSA_OP1: howto manager. (line 2577) +-* BFD_RELOC_XTENSA_OP2: howto manager. (line 2578) +-* BFD_RELOC_XTENSA_PLT: howto manager. (line 2523) +-* BFD_RELOC_XTENSA_RELATIVE: howto manager. (line 2520) +-* BFD_RELOC_XTENSA_RTLD: howto manager. (line 2513) +-* BFD_RELOC_XTENSA_SLOT0_ALT: howto manager. (line 2558) +-* BFD_RELOC_XTENSA_SLOT0_OP: howto manager. (line 2538) +-* BFD_RELOC_XTENSA_SLOT10_ALT: howto manager. (line 2568) +-* BFD_RELOC_XTENSA_SLOT10_OP: howto manager. (line 2548) +-* BFD_RELOC_XTENSA_SLOT11_ALT: howto manager. (line 2569) +-* BFD_RELOC_XTENSA_SLOT11_OP: howto manager. (line 2549) +-* BFD_RELOC_XTENSA_SLOT12_ALT: howto manager. (line 2570) +-* BFD_RELOC_XTENSA_SLOT12_OP: howto manager. (line 2550) +-* BFD_RELOC_XTENSA_SLOT13_ALT: howto manager. (line 2571) +-* BFD_RELOC_XTENSA_SLOT13_OP: howto manager. (line 2551) +-* BFD_RELOC_XTENSA_SLOT14_ALT: howto manager. (line 2572) +-* BFD_RELOC_XTENSA_SLOT14_OP: howto manager. (line 2552) +-* BFD_RELOC_XTENSA_SLOT1_ALT: howto manager. (line 2559) +-* BFD_RELOC_XTENSA_SLOT1_OP: howto manager. (line 2539) +-* BFD_RELOC_XTENSA_SLOT2_ALT: howto manager. (line 2560) +-* BFD_RELOC_XTENSA_SLOT2_OP: howto manager. (line 2540) +-* BFD_RELOC_XTENSA_SLOT3_ALT: howto manager. (line 2561) +-* BFD_RELOC_XTENSA_SLOT3_OP: howto manager. (line 2541) +-* BFD_RELOC_XTENSA_SLOT4_ALT: howto manager. (line 2562) +-* BFD_RELOC_XTENSA_SLOT4_OP: howto manager. (line 2542) +-* BFD_RELOC_XTENSA_SLOT5_ALT: howto manager. (line 2563) +-* BFD_RELOC_XTENSA_SLOT5_OP: howto manager. (line 2543) +-* BFD_RELOC_XTENSA_SLOT6_ALT: howto manager. (line 2564) +-* BFD_RELOC_XTENSA_SLOT6_OP: howto manager. (line 2544) +-* BFD_RELOC_XTENSA_SLOT7_ALT: howto manager. (line 2565) +-* BFD_RELOC_XTENSA_SLOT7_OP: howto manager. (line 2545) +-* BFD_RELOC_XTENSA_SLOT8_ALT: howto manager. (line 2566) +-* BFD_RELOC_XTENSA_SLOT8_OP: howto manager. (line 2546) +-* BFD_RELOC_XTENSA_SLOT9_ALT: howto manager. (line 2567) +-* BFD_RELOC_XTENSA_SLOT9_OP: howto manager. (line 2547) +-* BFD_RELOC_XTENSA_TLS_ARG: howto manager. (line 2597) +-* BFD_RELOC_XTENSA_TLS_CALL: howto manager. (line 2598) +-* BFD_RELOC_XTENSA_TLS_DTPOFF: howto manager. (line 2594) +-* BFD_RELOC_XTENSA_TLS_FUNC: howto manager. (line 2596) +-* BFD_RELOC_XTENSA_TLS_TPOFF: howto manager. (line 2595) +-* BFD_RELOC_XTENSA_TLSDESC_ARG: howto manager. (line 2593) +-* BFD_RELOC_XTENSA_TLSDESC_FN: howto manager. (line 2592) +-* BFD_RELOC_Z80_DISP8: howto manager. (line 2601) +-* BFD_RELOC_Z8K_CALLR: howto manager. (line 2607) +-* BFD_RELOC_Z8K_DISP7: howto manager. (line 2604) +-* BFD_RELOC_Z8K_IMM4L: howto manager. (line 2610) +-* bfd_rename_section: section prototypes. (line 169) +-* bfd_scan_arch: Architectures. (line 500) +-* bfd_scan_vma: Miscellaneous. (line 124) +-* bfd_seach_for_target: bfd_target. (line 524) +-* bfd_section_already_linked: Writing the symbol table. +- (line 55) +-* bfd_section_list_clear: section prototypes. (line 8) +-* bfd_sections_find_if: section prototypes. (line 199) +-* bfd_set_arch_info: Architectures. (line 541) +-* bfd_set_archive_head: Archives. (line 75) +-* bfd_set_assert_handler: Error reporting. (line 141) +-* bfd_set_default_target: bfd_target. (line 463) +-* bfd_set_error: Error reporting. (line 57) +-* bfd_set_error_handler: Error reporting. (line 99) +-* bfd_set_error_program_name: Error reporting. (line 108) +-* bfd_set_file_flags: Miscellaneous. (line 44) +-* bfd_set_format: Formats. (line 68) +-* bfd_set_gp_size: Miscellaneous. (line 114) +-* bfd_set_private_flags: Miscellaneous. (line 191) +-* bfd_set_reloc: Miscellaneous. (line 34) +-* bfd_set_section_contents: section prototypes. (line 230) +-* bfd_set_section_flags: section prototypes. (line 154) +-* bfd_set_section_size: section prototypes. (line 216) +-* bfd_set_start_address: Miscellaneous. (line 93) +-* bfd_set_symtab: symbol handling functions. +- (line 60) +-* bfd_symbol_info: symbol handling functions. +- (line 130) +-* bfd_target_list: bfd_target. (line 515) +-* bfd_write_bigendian_4byte_int: Internal. (line 13) +-* bfd_zalloc: Opening and Closing. +- (line 236) +-* bfd_zalloc2: Opening and Closing. +- (line 245) +-* coff_symbol_type: coff. (line 245) +-* core_file_matches_executable_p: Core Files. (line 39) +-* find_separate_debug_file: Opening and Closing. +- (line 308) +-* generic_core_file_matches_executable_p: Core Files. (line 49) +-* Hash tables: Hash Tables. (line 6) +-* internal object-file format: Canonical format. (line 11) +-* Linker: Linker Functions. (line 6) +-* Other functions: Miscellaneous. (line 206) +-* separate_alt_debug_file_exists: Opening and Closing. +- (line 299) +-* separate_debug_file_exists: Opening and Closing. +- (line 290) +-* struct bfd_iovec: Miscellaneous. (line 370) +-* target vector (_bfd_final_link): Performing the Final Link. +- (line 6) +-* target vector (_bfd_link_add_symbols): Adding Symbols to the Hash Table. +- (line 6) +-* target vector (_bfd_link_hash_table_create): Creating a Linker Hash Table. +- (line 6) +-* The HOWTO Macro: typedef arelent. (line 288) +-* what is it?: Overview. (line 6) +- +- +- +-Tag Table: +-Node: Top1060 +-Node: Overview1399 +-Node: History2450 +-Node: How It Works3396 +-Node: What BFD Version 2 Can Do4939 +-Node: BFD information loss6254 +-Node: Canonical format8786 +-Node: BFD front end13158 +-Node: typedef bfd13582 +-Node: Error reporting24300 +-Node: Miscellaneous29167 +-Node: Memory Usage46310 +-Node: Initialization47538 +-Node: Sections47997 +-Node: Section Input48480 +-Node: Section Output49845 +-Node: typedef asection52331 +-Node: section prototypes77563 +-Node: Symbols87820 +-Node: Reading Symbols89415 +-Node: Writing Symbols90522 +-Node: Mini Symbols92263 +-Node: typedef asymbol93237 +-Node: symbol handling functions99296 +-Node: Archives104638 +-Node: Formats108667 +-Node: Relocations111615 +-Node: typedef arelent112342 +-Node: howto manager127978 +-Node: Core Files234626 +-Node: Targets236664 +-Node: bfd_target238634 +-Node: Architectures261856 +-Node: Opening and Closing288730 +-Node: Internal302076 +-Node: File Caching308421 +-Node: Linker Functions310335 +-Node: Creating a Linker Hash Table312008 +-Node: Adding Symbols to the Hash Table313746 +-Node: Differing file formats314646 +-Node: Adding symbols from an object file316371 +-Node: Adding symbols from an archive318522 +-Node: Performing the Final Link321451 +-Node: Information provided by the linker322693 +-Node: Relocating the section contents323847 +-Node: Writing the symbol table325598 +-Node: Hash Tables329982 +-Node: Creating and Freeing a Hash Table331180 +-Node: Looking Up or Entering a String332430 +-Node: Traversing a Hash Table333683 +-Node: Deriving a New Hash Table Type334472 +-Node: Define the Derived Structures335538 +-Node: Write the Derived Creation Routine336619 +-Node: Write Other Derived Routines339243 +-Node: BFD back ends340558 +-Node: What to Put Where340828 +-Node: aout341008 +-Node: coff347326 +-Node: elf375763 +-Node: mmo376164 +-Node: File layout377092 +-Node: Symbol-table382739 +-Node: mmo section mapping386508 +-Node: GNU Free Documentation License390160 +-Node: BFD Index415243 +- +-End Tag Table +diff -Nur binutils-2.24.orig/bfd/doc/bfdio.texi binutils-2.24/bfd/doc/bfdio.texi +--- binutils-2.24.orig/bfd/doc/bfdio.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/bfdio.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,95 +0,0 @@ +-@findex struct bfd_iovec +-@subsubsection @code{struct bfd_iovec} +-@strong{Description}@* +-The @code{struct bfd_iovec} contains the internal file I/O class. +-Each @code{BFD} has an instance of this class and all file I/O is +-routed through it (it is assumed that the instance implements +-all methods listed below). +-@example +-struct bfd_iovec +-@{ +- /* To avoid problems with macros, a "b" rather than "f" +- prefix is prepended to each method name. */ +- /* Attempt to read/write NBYTES on ABFD's IOSTREAM storing/fetching +- bytes starting at PTR. Return the number of bytes actually +- transfered (a read past end-of-file returns less than NBYTES), +- or -1 (setting @code{bfd_error}) if an error occurs. */ +- file_ptr (*bread) (struct bfd *abfd, void *ptr, file_ptr nbytes); +- file_ptr (*bwrite) (struct bfd *abfd, const void *ptr, +- file_ptr nbytes); +- /* Return the current IOSTREAM file offset, or -1 (setting @code{bfd_error} +- if an error occurs. */ +- file_ptr (*btell) (struct bfd *abfd); +- /* For the following, on successful completion a value of 0 is returned. +- Otherwise, a value of -1 is returned (and @code{bfd_error} is set). */ +- int (*bseek) (struct bfd *abfd, file_ptr offset, int whence); +- int (*bclose) (struct bfd *abfd); +- int (*bflush) (struct bfd *abfd); +- int (*bstat) (struct bfd *abfd, struct stat *sb); +- /* Mmap a part of the files. ADDR, LEN, PROT, FLAGS and OFFSET are the usual +- mmap parameter, except that LEN and OFFSET do not need to be page +- aligned. Returns (void *)-1 on failure, mmapped address on success. +- Also write in MAP_ADDR the address of the page aligned buffer and in +- MAP_LEN the size mapped (a page multiple). Use unmap with MAP_ADDR and +- MAP_LEN to unmap. */ +- void *(*bmmap) (struct bfd *abfd, void *addr, bfd_size_type len, +- int prot, int flags, file_ptr offset, +- void **map_addr, bfd_size_type *map_len); +-@}; +-extern const struct bfd_iovec _bfd_memory_iovec; +-@end example +- +-@findex bfd_get_mtime +-@subsubsection @code{bfd_get_mtime} +-@strong{Synopsis} +-@example +-long bfd_get_mtime (bfd *abfd); +-@end example +-@strong{Description}@* +-Return the file modification time (as read from the file system, or +-from the archive header for archive members). +- +-@findex bfd_get_size +-@subsubsection @code{bfd_get_size} +-@strong{Synopsis} +-@example +-file_ptr bfd_get_size (bfd *abfd); +-@end example +-@strong{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 @code{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 question, "is the +-size reasonable?". +- +-@findex bfd_mmap +-@subsubsection @code{bfd_mmap} +-@strong{Synopsis} +-@example +-void *bfd_mmap (bfd *abfd, void *addr, bfd_size_type len, +- int prot, int flags, file_ptr offset, +- void **map_addr, bfd_size_type *map_len); +-@end example +-@strong{Description}@* +-Return mmap()ed region of the file, if possible and implemented. +-LEN and OFFSET do not need to be page aligned. The page aligned +-address and length are written to MAP_ADDR and MAP_LEN. +- +diff -Nur binutils-2.24.orig/bfd/doc/bfdt.texi binutils-2.24/bfd/doc/bfdt.texi +--- binutils-2.24.orig/bfd/doc/bfdt.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/bfdt.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,888 +0,0 @@ +-@node typedef bfd, Error reporting, BFD front end, BFD front end +-@section @code{typedef bfd} +-A BFD has type @code{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 @code{bfd}. It +-contains the major data about the file and pointers +-to the rest of the data. +- +- +-@example +- +-enum bfd_direction +- @{ +- no_direction = 0, +- read_direction = 1, +- write_direction = 2, +- both_direction = 3 +- @}; +- +-struct bfd +-@{ +- /* A unique identifier of the BFD */ +- unsigned int id; +- +- /* The filename the application opened the BFD with. */ +- const char *filename; +- +- /* A pointer to the target jump table. */ +- const struct bfd_target *xvec; +- +- /* The IOSTREAM, and corresponding IO vector that provide access +- to the file backing the BFD. */ +- void *iostream; +- const struct bfd_iovec *iovec; +- +- /* 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... */ +- ufile_ptr where; +- +- /* 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 with which the BFD was opened. */ +- enum bfd_direction direction; +- +- /* Format_specific flags. */ +- flagword flags; +- +- /* 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). */ +- +-#define BFD_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 +- +- /* The sections in this BFD specify a memory page. */ +-#define HAS_LOAD_PAGE 0x1000 +- +- /* This BFD has been created by the linker and doesn't correspond +- to any input file. */ +-#define BFD_LINKER_CREATED 0x2000 +- +- /* This may be set before writing out a BFD to request that it +- be written using values for UIDs, GIDs, timestamps, etc. that +- will be consistent from run to run. */ +-#define BFD_DETERMINISTIC_OUTPUT 0x4000 +- +- /* Compress sections in this BFD. */ +-#define BFD_COMPRESS 0x8000 +- +- /* Decompress sections in this BFD. */ +-#define BFD_DECOMPRESS 0x10000 +- +- /* BFD is a dummy, for plugins. */ +-#define BFD_PLUGIN 0x20000 +- +- /* Flags bits to be saved in bfd_preserve_save. */ +-#define BFD_FLAGS_SAVED \ +- (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_PLUGIN) +- +- /* Flags bits which are for BFD use only. */ +-#define BFD_FLAGS_FOR_BFD_USE_MASK \ +- (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \ +- | BFD_PLUGIN | BFD_TRADITIONAL_FORMAT | BFD_DETERMINISTIC_OUTPUT) +- +- /* 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. */ +- ufile_ptr origin; +- +- /* The origin in the archive of the proxy entry. This will +- normally be the same as origin, except for thin archives, +- when it will contain the current offset of the proxy in the +- thin archive rather than the offset of the bfd in its actual +- container. */ +- ufile_ptr proxy_origin; +- +- /* A hash table for section names. */ +- struct bfd_hash_table section_htab; +- +- /* Pointer to linked list of sections. */ +- struct bfd_section *sections; +- +- /* The last section on the section list. */ +- struct bfd_section *section_last; +- +- /* 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). +- Also used by the linker to cache input BFD symbols. */ +- struct bfd_symbol **outsymbols; +- +- /* Used for slurped dynamic symbol tables. */ +- unsigned int dynsymcount; +- +- /* Pointer to structure which contains architecture information. */ +- const struct bfd_arch_info *arch_info; +- +- /* Stuff only useful for archives. */ +- void *arelt_data; +- struct bfd *my_archive; /* The containing archive BFD. */ +- struct bfd *archive_next; /* The next BFD in the archive. */ +- struct bfd *archive_head; /* The first BFD in the archive. */ +- struct bfd *nested_archives; /* List of nested archive in a flattened +- thin archive. */ +- +- /* 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 verilog_data_struct *verilog_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 mmo_data_struct *mmo_data; +- struct sun_core_struct *sun_core_data; +- struct sco5_core_struct *sco5_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; +- struct mach_o_data_struct *mach_o_data; +- struct mach_o_fat_data_struct *mach_o_fat_data; +- struct plugin_data_struct *plugin_data; +- struct bfd_pef_data_struct *pef_data; +- struct bfd_pef_xlib_data_struct *pef_xlib_data; +- struct bfd_sym_data_struct *sym_data; +- void *any; +- @} +- tdata; +- +- /* Used by the application to hold private data. */ +- void *usrdata; +- +- /* Where all the allocated stuff under this BFD goes. This is a +- struct objalloc *, but we use void * to avoid requiring the inclusion +- of objalloc.h. */ +- void *memory; +- +- /* Is the file descriptor being cached? That is, can it be closed as +- needed, and re-opened when accessed later? */ +- unsigned int cacheable : 1; +- +- /* 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. */ +- unsigned int target_defaulted : 1; +- +- /* ... and here: (``once'' means at least once). */ +- unsigned int opened_once : 1; +- +- /* Set if we have a locally maintained mtime value, rather than +- getting it from the file each time. */ +- unsigned int mtime_set : 1; +- +- /* Flag set if symbols from this BFD should not be exported. */ +- unsigned int no_export : 1; +- +- /* Remember when output has begun, to stop strange things +- from happening. */ +- unsigned int output_has_begun : 1; +- +- /* Have archive map. */ +- unsigned int has_armap : 1; +- +- /* Set if this is a thin archive. */ +- unsigned int is_thin_archive : 1; +- +- /* Set if only required symbols should be added in the link hash table for +- this object. Used by VMS linkers. */ +- unsigned int selective_search : 1; +-@}; +- +-@end example +-@node Error reporting, Miscellaneous, typedef bfd, BFD front end +-@section Error reporting +-Most BFD functions return nonzero on success (check their +-individual documentation for precise semantics). On an error, +-they call @code{bfd_set_error} to set an error condition that callers +-can check by calling @code{bfd_get_error}. +-If that returns @code{bfd_error_system_call}, then check +-@code{errno}. +- +-The easiest way to report a BFD error to the user is to +-use @code{bfd_perror}. +- +-@subsection Type @code{bfd_error_type} +-The values returned by @code{bfd_get_error} are defined by the +-enumerated type @code{bfd_error_type}. +- +- +-@example +- +-typedef enum bfd_error +-@{ +- bfd_error_no_error = 0, +- bfd_error_system_call, +- bfd_error_invalid_target, +- bfd_error_wrong_format, +- bfd_error_wrong_object_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_missing_dso, +- 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_on_input, +- bfd_error_invalid_error_code +-@} +-bfd_error_type; +- +-@end example +-@findex bfd_get_error +-@subsubsection @code{bfd_get_error} +-@strong{Synopsis} +-@example +-bfd_error_type bfd_get_error (void); +-@end example +-@strong{Description}@* +-Return the current BFD error condition. +- +-@findex bfd_set_error +-@subsubsection @code{bfd_set_error} +-@strong{Synopsis} +-@example +-void bfd_set_error (bfd_error_type error_tag, ...); +-@end example +-@strong{Description}@* +-Set the BFD error condition to be @var{error_tag}. +-If @var{error_tag} is bfd_error_on_input, then this function +-takes two more parameters, the input bfd where the error +-occurred, and the bfd_error_type error. +- +-@findex bfd_errmsg +-@subsubsection @code{bfd_errmsg} +-@strong{Synopsis} +-@example +-const char *bfd_errmsg (bfd_error_type error_tag); +-@end example +-@strong{Description}@* +-Return a string describing the error @var{error_tag}, or +-the system error if @var{error_tag} is @code{bfd_error_system_call}. +- +-@findex bfd_perror +-@subsubsection @code{bfd_perror} +-@strong{Synopsis} +-@example +-void bfd_perror (const char *message); +-@end example +-@strong{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. +- +-@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 overridden by the program. +- +-The BFD error handler acts like printf. +- +- +-@example +- +-typedef void (*bfd_error_handler_type) (const char *, ...); +- +-@end example +-@findex bfd_set_error_handler +-@subsubsection @code{bfd_set_error_handler} +-@strong{Synopsis} +-@example +-bfd_error_handler_type bfd_set_error_handler (bfd_error_handler_type); +-@end example +-@strong{Description}@* +-Set the BFD error handler function. Returns the previous +-function. +- +-@findex bfd_set_error_program_name +-@subsubsection @code{bfd_set_error_program_name} +-@strong{Synopsis} +-@example +-void bfd_set_error_program_name (const char *); +-@end example +-@strong{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. +- +-@findex bfd_get_error_handler +-@subsubsection @code{bfd_get_error_handler} +-@strong{Synopsis} +-@example +-bfd_error_handler_type bfd_get_error_handler (void); +-@end example +-@strong{Description}@* +-Return the BFD error handler function. +- +-@subsection BFD assert handler +-If BFD finds an internal inconsistency, the bfd assert +-handler is called with information on the BFD version, BFD +-source file and line. If this happens, most programs linked +-against BFD are expected to want to exit with an error, or mark +-the current BFD operation as failed, so it is recommended to +-override the default handler, which just calls +-_bfd_error_handler and continues. +- +- +-@example +- +-typedef void (*bfd_assert_handler_type) (const char *bfd_formatmsg, +- const char *bfd_version, +- const char *bfd_file, +- int bfd_line); +- +-@end example +-@findex bfd_set_assert_handler +-@subsubsection @code{bfd_set_assert_handler} +-@strong{Synopsis} +-@example +-bfd_assert_handler_type bfd_set_assert_handler (bfd_assert_handler_type); +-@end example +-@strong{Description}@* +-Set the BFD assert handler function. Returns the previous +-function. +- +-@findex bfd_get_assert_handler +-@subsubsection @code{bfd_get_assert_handler} +-@strong{Synopsis} +-@example +-bfd_assert_handler_type bfd_get_assert_handler (void); +-@end example +-@strong{Description}@* +-Return the BFD assert handler function. +- +-@node Miscellaneous, Memory Usage, Error reporting, BFD front end +-@section Miscellaneous +- +- +-@subsection Miscellaneous functions +- +- +-@findex bfd_get_reloc_upper_bound +-@subsubsection @code{bfd_get_reloc_upper_bound} +-@strong{Synopsis} +-@example +-long bfd_get_reloc_upper_bound (bfd *abfd, asection *sect); +-@end example +-@strong{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. +- +-@findex bfd_canonicalize_reloc +-@subsubsection @code{bfd_canonicalize_reloc} +-@strong{Synopsis} +-@example +-long bfd_canonicalize_reloc +- (bfd *abfd, asection *sec, arelent **loc, asymbol **syms); +-@end example +-@strong{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 +-@code{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. +- +-@findex bfd_set_reloc +-@subsubsection @code{bfd_set_reloc} +-@strong{Synopsis} +-@example +-void bfd_set_reloc +- (bfd *abfd, asection *sec, arelent **rel, unsigned int count); +-@end example +-@strong{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. +- +-@findex bfd_set_file_flags +-@subsubsection @code{bfd_set_file_flags} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_set_file_flags (bfd *abfd, flagword flags); +-@end example +-@strong{Description}@* +-Set the flag word in the BFD @var{abfd} to the value @var{flags}. +- +-Possible errors are: +-@itemize @bullet +- +-@item +-@code{bfd_error_wrong_format} - The target bfd was not of object format. +-@item +-@code{bfd_error_invalid_operation} - The target bfd was open for reading. +-@item +-@code{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 @code{D_PAGED} bit +-on a BFD format which does not support demand paging. +-@end itemize +- +-@findex bfd_get_arch_size +-@subsubsection @code{bfd_get_arch_size} +-@strong{Synopsis} +-@example +-int bfd_get_arch_size (bfd *abfd); +-@end example +-@strong{Description}@* +-Returns the architecture address size, in bits, as determined +-by the object file's format. For ELF, this information is +-included in the header. +- +-@strong{Returns}@* +-Returns the arch size in bits if known, @code{-1} otherwise. +- +-@findex bfd_get_sign_extend_vma +-@subsubsection @code{bfd_get_sign_extend_vma} +-@strong{Synopsis} +-@example +-int bfd_get_sign_extend_vma (bfd *abfd); +-@end example +-@strong{Description}@* +-Indicates if the target architecture "naturally" sign extends +-an address. Some architectures implicitly sign extend address +-values when they are converted to types larger than the size +-of an address. For instance, bfd_get_start_address() will +-return an address sign extended to fill a bfd_vma when this is +-the case. +- +-@strong{Returns}@* +-Returns @code{1} if the target architecture is known to sign +-extend addresses, @code{0} if the target architecture is known to +-not sign extend addresses, and @code{-1} otherwise. +- +-@findex bfd_set_start_address +-@subsubsection @code{bfd_set_start_address} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_set_start_address (bfd *abfd, bfd_vma vma); +-@end example +-@strong{Description}@* +-Make @var{vma} the entry point of output BFD @var{abfd}. +- +-@strong{Returns}@* +-Returns @code{TRUE} on success, @code{FALSE} otherwise. +- +-@findex bfd_get_gp_size +-@subsubsection @code{bfd_get_gp_size} +-@strong{Synopsis} +-@example +-unsigned int bfd_get_gp_size (bfd *abfd); +-@end example +-@strong{Description}@* +-Return the maximum size of objects to be optimized using the GP +-register under MIPS ECOFF. This is typically set by the @code{-G} +-argument to the compiler, assembler or linker. +- +-@findex bfd_set_gp_size +-@subsubsection @code{bfd_set_gp_size} +-@strong{Synopsis} +-@example +-void bfd_set_gp_size (bfd *abfd, unsigned int i); +-@end example +-@strong{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 @code{-G} argument to the compiler, assembler or linker. +- +-@findex bfd_scan_vma +-@subsubsection @code{bfd_scan_vma} +-@strong{Synopsis} +-@example +-bfd_vma bfd_scan_vma (const char *string, const char **end, int base); +-@end example +-@strong{Description}@* +-Convert, like @code{strtoul}, a numerical expression +-@var{string} into a @code{bfd_vma} integer, and return that integer. +-(Though without as many bells and whistles as @code{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. +- +-If the value would overflow, the maximum @code{bfd_vma} value is +-returned. +- +-@findex bfd_copy_private_header_data +-@subsubsection @code{bfd_copy_private_header_data} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_copy_private_header_data (bfd *ibfd, bfd *obfd); +-@end example +-@strong{Description}@* +-Copy private BFD header information from the BFD @var{ibfd} to the +-the BFD @var{obfd}. This copies information that may require +-sections to exist, but does not require symbol tables. Return +-@code{true} on success, @code{false} on error. +-Possible error returns are: +- +-@itemize @bullet +- +-@item +-@code{bfd_error_no_memory} - +-Not enough memory exists to create private data for @var{obfd}. +-@end itemize +-@example +-#define bfd_copy_private_header_data(ibfd, obfd) \ +- BFD_SEND (obfd, _bfd_copy_private_header_data, \ +- (ibfd, obfd)) +-@end example +- +-@findex bfd_copy_private_bfd_data +-@subsubsection @code{bfd_copy_private_bfd_data} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd); +-@end example +-@strong{Description}@* +-Copy private BFD information from the BFD @var{ibfd} to the +-the BFD @var{obfd}. Return @code{TRUE} on success, @code{FALSE} on error. +-Possible error returns are: +- +-@itemize @bullet +- +-@item +-@code{bfd_error_no_memory} - +-Not enough memory exists to create private data for @var{obfd}. +-@end itemize +-@example +-#define bfd_copy_private_bfd_data(ibfd, obfd) \ +- BFD_SEND (obfd, _bfd_copy_private_bfd_data, \ +- (ibfd, obfd)) +-@end example +- +-@findex bfd_merge_private_bfd_data +-@subsubsection @code{bfd_merge_private_bfd_data} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_merge_private_bfd_data (bfd *ibfd, bfd *obfd); +-@end example +-@strong{Description}@* +-Merge private BFD information from the BFD @var{ibfd} to the +-the output file BFD @var{obfd} when linking. Return @code{TRUE} +-on success, @code{FALSE} on error. Possible error returns are: +- +-@itemize @bullet +- +-@item +-@code{bfd_error_no_memory} - +-Not enough memory exists to create private data for @var{obfd}. +-@end itemize +-@example +-#define bfd_merge_private_bfd_data(ibfd, obfd) \ +- BFD_SEND (obfd, _bfd_merge_private_bfd_data, \ +- (ibfd, obfd)) +-@end example +- +-@findex bfd_set_private_flags +-@subsubsection @code{bfd_set_private_flags} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_set_private_flags (bfd *abfd, flagword flags); +-@end example +-@strong{Description}@* +-Set private BFD flag information in the BFD @var{abfd}. +-Return @code{TRUE} on success, @code{FALSE} on error. Possible error +-returns are: +- +-@itemize @bullet +- +-@item +-@code{bfd_error_no_memory} - +-Not enough memory exists to create private data for @var{obfd}. +-@end itemize +-@example +-#define bfd_set_private_flags(abfd, flags) \ +- BFD_SEND (abfd, _bfd_set_private_flags, (abfd, flags)) +-@end example +- +-@findex Other functions +-@subsubsection @code{Other functions} +-@strong{Description}@* +-The following functions exist but have not yet been documented. +-@example +-#define bfd_sizeof_headers(abfd, info) \ +- BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, info)) +- +-#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)) +- +-#define bfd_find_nearest_line_discriminator(abfd, sec, syms, off, file, func, \ +- line, disc) \ +- BFD_SEND (abfd, _bfd_find_nearest_line_discriminator, \ +- (abfd, sec, syms, off, file, func, line, disc)) +- +-#define bfd_find_line(abfd, syms, sym, file, line) \ +- BFD_SEND (abfd, _bfd_find_line, \ +- (abfd, syms, sym, file, line)) +- +-#define bfd_find_inliner_info(abfd, file, func, line) \ +- BFD_SEND (abfd, _bfd_find_inliner_info, \ +- (abfd, file, func, line)) +- +-#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_gc_sections(abfd, link_info) \ +- BFD_SEND (abfd, _bfd_gc_sections, (abfd, link_info)) +- +-#define bfd_lookup_section_flags(link_info, flag_info, section) \ +- BFD_SEND (abfd, _bfd_lookup_section_flags, (link_info, flag_info, section)) +- +-#define bfd_merge_sections(abfd, link_info) \ +- BFD_SEND (abfd, _bfd_merge_sections, (abfd, link_info)) +- +-#define bfd_is_group_section(abfd, sec) \ +- BFD_SEND (abfd, _bfd_is_group_section, (abfd, sec)) +- +-#define bfd_discard_group(abfd, sec) \ +- BFD_SEND (abfd, _bfd_discard_group, (abfd, sec)) +- +-#define bfd_link_hash_table_create(abfd) \ +- BFD_SEND (abfd, _bfd_link_hash_table_create, (abfd)) +- +-#define bfd_link_hash_table_free(abfd, hash) \ +- BFD_SEND (abfd, _bfd_link_hash_table_free, (hash)) +- +-#define bfd_link_add_symbols(abfd, info) \ +- BFD_SEND (abfd, _bfd_link_add_symbols, (abfd, info)) +- +-#define bfd_link_just_syms(abfd, sec, info) \ +- BFD_SEND (abfd, _bfd_link_just_syms, (sec, 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_synthetic_symtab(abfd, count, syms, dyncount, dynsyms, ret) \ +- BFD_SEND (abfd, _bfd_get_synthetic_symtab, (abfd, count, syms, \ +- dyncount, dynsyms, ret)) +- +-#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 +- (bfd *, struct bfd_link_info *, struct bfd_link_order *, bfd_byte *, +- bfd_boolean, asymbol **); +- +-@end example +- +-@findex bfd_alt_mach_code +-@subsubsection @code{bfd_alt_mach_code} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_alt_mach_code (bfd *abfd, int alternative); +-@end example +-@strong{Description}@* +-When more than one machine code number is available for the +-same machine type, this function can be used to switch between +-the preferred one (alternative == 0) and any others. Currently, +-only ELF supports this feature, with up to two alternate +-machine codes. +- +-@findex bfd_emul_get_maxpagesize +-@subsubsection @code{bfd_emul_get_maxpagesize} +-@strong{Synopsis} +-@example +-bfd_vma bfd_emul_get_maxpagesize (const char *); +-@end example +-@strong{Description}@* +-Returns the maximum page size, in bytes, as determined by +-emulation. +- +-@strong{Returns}@* +-Returns the maximum page size in bytes for ELF, 0 otherwise. +- +-@findex bfd_emul_set_maxpagesize +-@subsubsection @code{bfd_emul_set_maxpagesize} +-@strong{Synopsis} +-@example +-void bfd_emul_set_maxpagesize (const char *, bfd_vma); +-@end example +-@strong{Description}@* +-For ELF, set the maximum page size for the emulation. It is +-a no-op for other formats. +- +-@findex bfd_emul_get_commonpagesize +-@subsubsection @code{bfd_emul_get_commonpagesize} +-@strong{Synopsis} +-@example +-bfd_vma bfd_emul_get_commonpagesize (const char *); +-@end example +-@strong{Description}@* +-Returns the common page size, in bytes, as determined by +-emulation. +- +-@strong{Returns}@* +-Returns the common page size in bytes for ELF, 0 otherwise. +- +-@findex bfd_emul_set_commonpagesize +-@subsubsection @code{bfd_emul_set_commonpagesize} +-@strong{Synopsis} +-@example +-void bfd_emul_set_commonpagesize (const char *, bfd_vma); +-@end example +-@strong{Description}@* +-For ELF, set the common page size for the emulation. It is +-a no-op for other formats. +- +-@findex bfd_demangle +-@subsubsection @code{bfd_demangle} +-@strong{Synopsis} +-@example +-char *bfd_demangle (bfd *, const char *, int); +-@end example +-@strong{Description}@* +-Wrapper around cplus_demangle. Strips leading underscores and +-other such chars that would otherwise confuse the demangler. +-If passed a g++ v3 ABI mangled name, returns a buffer allocated +-with malloc holding the demangled name. Returns NULL otherwise +-and on memory alloc failure. +- +diff -Nur binutils-2.24.orig/bfd/doc/bfdver.texi binutils-2.24/bfd/doc/bfdver.texi +--- binutils-2.24.orig/bfd/doc/bfdver.texi 2013-12-02 10:32:19.000000000 +0100 ++++ binutils-2.24/bfd/doc/bfdver.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,4 +0,0 @@ +-@set VERSION 2.24 +-@set VERSION_PACKAGE (GNU Binutils) +-@set UPDATED December 2013 +-@set BUGURL @uref{http://www.sourceware.org/bugzilla/} +diff -Nur binutils-2.24.orig/bfd/doc/bfdwin.texi binutils-2.24/bfd/doc/bfdwin.texi +--- binutils-2.24.orig/bfd/doc/bfdwin.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/bfdwin.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,2 +0,0 @@ +-@findex +-@subsubsection @code{} +diff -Nur binutils-2.24.orig/bfd/doc/cache.texi binutils-2.24/bfd/doc/cache.texi +--- binutils-2.24.orig/bfd/doc/cache.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/cache.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,65 +0,0 @@ +-@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 +-@code{cache.c} maintains a least recently used list of +-@code{bfd_cache_max_open} files, and exports the name +-@code{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. +- +-@subsection Caching functions +- +- +-@findex bfd_cache_init +-@subsubsection @code{bfd_cache_init} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_cache_init (bfd *abfd); +-@end example +-@strong{Description}@* +-Add a newly opened BFD to the cache. +- +-@findex bfd_cache_close +-@subsubsection @code{bfd_cache_close} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_cache_close (bfd *abfd); +-@end example +-@strong{Description}@* +-Remove the BFD @var{abfd} from the cache. If the attached file is open, +-then close it too. +- +-@strong{Returns}@* +-@code{FALSE} is returned if closing the file fails, @code{TRUE} is +-returned if all is well. +- +-@findex bfd_cache_close_all +-@subsubsection @code{bfd_cache_close_all} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_cache_close_all (void); +-@end example +-@strong{Description}@* +-Remove all BFDs from the cache. If the attached file is open, +-then close it too. +- +-@strong{Returns}@* +-@code{FALSE} is returned if closing one of the file fails, @code{TRUE} is +-returned if all is well. +- +-@findex bfd_open_file +-@subsubsection @code{bfd_open_file} +-@strong{Synopsis} +-@example +-FILE* bfd_open_file (bfd *abfd); +-@end example +-@strong{Description}@* +-Call the OS to open a file for @var{abfd}. Return the @code{FILE *} +-(possibly @code{NULL}) that results from this operation. Set up the +-BFD so that future accesses know the file is open. If the @code{FILE *} +-returned is @code{NULL}, then it won't have been put in the +-cache, so it won't have to be removed from it. +- +diff -Nur binutils-2.24.orig/bfd/doc/coffcode.texi binutils-2.24/bfd/doc/coffcode.texi +--- binutils-2.24.orig/bfd/doc/coffcode.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/coffcode.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,686 +0,0 @@ +-@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 Coff long section names +-In the standard Coff object format, section names are limited to +-the eight bytes available in the @code{s_name} field of the +-@code{SCNHDR} section header structure. The format requires the +-field to be NUL-padded, but not necessarily NUL-terminated, so +-the longest section names permitted are a full eight characters. +- +-The Microsoft PE variants of the Coff object file format add +-an extension to support the use of long section names. This +-extension is defined in section 4 of the Microsoft PE/COFF +-specification (rev 8.1). If a section name is too long to fit +-into the section header's @code{s_name} field, it is instead +-placed into the string table, and the @code{s_name} field is +-filled with a slash ("/") followed by the ASCII decimal +-representation of the offset of the full name relative to the +-string table base. +- +-Note that this implies that the extension can only be used in object +-files, as executables do not contain a string table. The standard +-specifies that long section names from objects emitted into executable +-images are to be truncated. +- +-However, as a GNU extension, BFD can generate executable images +-that contain a string table and long section names. This +-would appear to be technically valid, as the standard only says +-that Coff debugging information is deprecated, not forbidden, +-and in practice it works, although some tools that parse PE files +-expecting the MS standard format may become confused; @file{PEview} is +-one known example. +- +-The functionality is supported in BFD by code implemented under +-the control of the macro @code{COFF_LONG_SECTION_NAMES}. If not +-defined, the format does not support long section names in any way. +-If defined, it is used to initialise a flag, +-@code{_bfd_coff_long_section_names}, and a hook function pointer, +-@code{_bfd_coff_set_long_section_names}, in the Coff backend data +-structure. The flag controls the generation of long section names +-in output BFDs at runtime; if it is false, as it will be by default +-when generating an executable image, long section names are truncated; +-if true, the long section names extension is employed. The hook +-points to a function that allows the value of the flag to be altered +-at runtime, on formats that support long section names at all; on +-other formats it points to a stub that returns an error indication. +- +-With input BFDs, the flag is set according to whether any long section +-names are detected while reading the section headers. For a completely +-new BFD, the flag is set to the default for the target format. This +-information can be used by a client of the BFD library when deciding +-what output format to generate, and means that a BFD that is opened +-for read and subsequently converted to a writeable BFD and modified +-in-place will retain whatever format it had on input. +- +-If @code{COFF_LONG_SECTION_NAMES} is simply defined (blank), or is +-defined to the value "1", then long section names are enabled by +-default; if it is defined to the value zero, they are disabled by +-default (but still accepted in input BFDs). The header @file{coffcode.h} +-defines a macro, @code{COFF_DEFAULT_LONG_SECTION_NAMES}, which is +-used in the backends to initialise the backend data structure fields +-appropriately; see the comments for further detail. +- +-@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_lineno_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 +-(@code{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 +-@code{output_section} field of the @code{asymbol}'s +-@code{asection} @xref{Sections}. +- +-@itemize @bullet +- +-@item +-@code{coff_mangle_symbols} +-@end itemize +-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 hierarchy required by coff. It changes each pointer +-to a symbol into the index into the symbol table of the asymbol. +- +-@itemize @bullet +- +-@item +-@code{coff_write_symbols} +-@end itemize +-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. +- +-@findex coff_symbol_type +-@subsubsection @code{coff_symbol_type} +-@strong{Description}@* +-The hidden information for an @code{asymbol} is described in a +-@code{combined_entry_type}: +- +- +-@example +- +-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 ? */ +- bfd_boolean done_lineno; +-@} coff_symbol_type; +-@end example +-@findex bfd_coff_backend_data +-@subsubsection @code{bfd_coff_backend_data} +- +-@example +-/* COFF symbol classifications. */ +- +-enum coff_symbol_classification +-@{ +- /* Global symbol. */ +- COFF_SYMBOL_GLOBAL, +- /* Common symbol. */ +- COFF_SYMBOL_COMMON, +- /* Undefined symbol. */ +- COFF_SYMBOL_UNDEFINED, +- /* Local symbol. */ +- COFF_SYMBOL_LOCAL, +- /* PE section symbol. */ +- COFF_SYMBOL_PE_SECTION +-@}; +- +-@end example +-Special entry points for gdb to swap in coff symbol table parts: +-@example +-typedef struct +-@{ +- void (*_bfd_coff_swap_aux_in) +- (bfd *, void *, int, int, int, int, void *); +- +- void (*_bfd_coff_swap_sym_in) +- (bfd *, void *, void *); +- +- void (*_bfd_coff_swap_lineno_in) +- (bfd *, void *, void *); +- +- unsigned int (*_bfd_coff_swap_aux_out) +- (bfd *, void *, int, int, int, int, void *); +- +- unsigned int (*_bfd_coff_swap_sym_out) +- (bfd *, void *, void *); +- +- unsigned int (*_bfd_coff_swap_lineno_out) +- (bfd *, void *, void *); +- +- unsigned int (*_bfd_coff_swap_reloc_out) +- (bfd *, void *, void *); +- +- unsigned int (*_bfd_coff_swap_filehdr_out) +- (bfd *, void *, void *); +- +- unsigned int (*_bfd_coff_swap_aouthdr_out) +- (bfd *, void *, void *); +- +- unsigned int (*_bfd_coff_swap_scnhdr_out) +- (bfd *, void *, void *); +- +- 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; +- unsigned int _bfd_filnmlen; +- bfd_boolean _bfd_coff_long_filenames; +- +- bfd_boolean _bfd_coff_long_section_names; +- bfd_boolean (*_bfd_coff_set_long_section_names) +- (bfd *, int); +- +- unsigned int _bfd_coff_default_section_alignment_power; +- bfd_boolean _bfd_coff_force_symnames_in_strings; +- unsigned int _bfd_coff_debug_string_prefix_length; +- +- void (*_bfd_coff_swap_filehdr_in) +- (bfd *, void *, void *); +- +- void (*_bfd_coff_swap_aouthdr_in) +- (bfd *, void *, void *); +- +- void (*_bfd_coff_swap_scnhdr_in) +- (bfd *, void *, void *); +- +- void (*_bfd_coff_swap_reloc_in) +- (bfd *abfd, void *, void *); +- +- bfd_boolean (*_bfd_coff_bad_format_hook) +- (bfd *, void *); +- +- bfd_boolean (*_bfd_coff_set_arch_mach_hook) +- (bfd *, void *); +- +- void * (*_bfd_coff_mkobject_hook) +- (bfd *, void *, void *); +- +- bfd_boolean (*_bfd_styp_to_sec_flags_hook) +- (bfd *, void *, const char *, asection *, flagword *); +- +- void (*_bfd_set_alignment_hook) +- (bfd *, asection *, void *); +- +- bfd_boolean (*_bfd_coff_slurp_symbol_table) +- (bfd *); +- +- bfd_boolean (*_bfd_coff_symname_in_debug) +- (bfd *, struct internal_syment *); +- +- bfd_boolean (*_bfd_coff_pointerize_aux_hook) +- (bfd *, combined_entry_type *, combined_entry_type *, +- unsigned int, combined_entry_type *); +- +- bfd_boolean (*_bfd_coff_print_aux) +- (bfd *, FILE *, combined_entry_type *, combined_entry_type *, +- combined_entry_type *, unsigned int); +- +- void (*_bfd_coff_reloc16_extra_cases) +- (bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *, +- bfd_byte *, unsigned int *, unsigned int *); +- +- int (*_bfd_coff_reloc16_estimate) +- (bfd *, asection *, arelent *, unsigned int, +- struct bfd_link_info *); +- +- enum coff_symbol_classification (*_bfd_coff_classify_symbol) +- (bfd *, struct internal_syment *); +- +- bfd_boolean (*_bfd_coff_compute_section_file_positions) +- (bfd *); +- +- bfd_boolean (*_bfd_coff_start_final_link) +- (bfd *, struct bfd_link_info *); +- +- bfd_boolean (*_bfd_coff_relocate_section) +- (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, +- struct internal_reloc *, struct internal_syment *, asection **); +- +- reloc_howto_type *(*_bfd_coff_rtype_to_howto) +- (bfd *, asection *, struct internal_reloc *, +- struct coff_link_hash_entry *, struct internal_syment *, +- bfd_vma *); +- +- bfd_boolean (*_bfd_coff_adjust_symndx) +- (bfd *, struct bfd_link_info *, bfd *, asection *, +- struct internal_reloc *, bfd_boolean *); +- +- bfd_boolean (*_bfd_coff_link_add_one_symbol) +- (struct bfd_link_info *, bfd *, const char *, flagword, +- asection *, bfd_vma, const char *, bfd_boolean, bfd_boolean, +- struct bfd_link_hash_entry **); +- +- bfd_boolean (*_bfd_coff_link_output_has_begun) +- (bfd *, struct coff_final_link_info *); +- +- bfd_boolean (*_bfd_coff_final_link_postscript) +- (bfd *, struct coff_final_link_info *); +- +- bfd_boolean (*_bfd_coff_print_pdata) +- (bfd *, void *); +- +-@} 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_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen) +-#define bfd_coff_long_filenames(abfd) \ +- (coff_backend_info (abfd)->_bfd_coff_long_filenames) +-#define bfd_coff_long_section_names(abfd) \ +- (coff_backend_info (abfd)->_bfd_coff_long_section_names) +-#define bfd_coff_set_long_section_names(abfd, enable) \ +- ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable)) +-#define bfd_coff_default_section_alignment_power(abfd) \ +- (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power) +-#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, section, flags_ptr)\ +- ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\ +- (abfd, scnhdr, name, section, flags_ptr)) +- +-#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_force_symnames_in_strings(abfd)\ +- (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings) +- +-#define bfd_coff_debug_string_prefix_length(abfd)\ +- (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length) +- +-#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_classify_symbol(abfd, sym)\ +- ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\ +- (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)) +- +-#define bfd_coff_link_output_has_begun(a,p) \ +- ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a, p)) +-#define bfd_coff_final_link_postscript(a,p) \ +- ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a, p)) +- +-#define bfd_coff_have_print_pdata(a) \ +- (coff_backend_info (a)->_bfd_coff_print_pdata) +-#define bfd_coff_print_pdata(a,p) \ +- ((coff_backend_info (a)->_bfd_coff_print_pdata) (a, p)) +- +-/* Macro: Returns true if the bfd is a PE executable as opposed to a +- PE object file. */ +-#define bfd_pei_p(abfd) \ +- (CONST_STRNEQ ((abfd)->xvec->name, "pei-")) +-@end example +-@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. +- +-@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. +- +-Note: The PE format uses line number 0 for a flag indicating a +-new source file. +- +-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 ? +- +-@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: +- +-@itemize @bullet +- +-@item +-Read the entire coff relocation table into memory. +- +-@item +-Process each relocation in turn; first swap it from the +-external to the internal form. +- +-@item +-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. +- +-@item +-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. +-@end itemize +- +diff -Nur binutils-2.24.orig/bfd/doc/core.texi binutils-2.24/bfd/doc/core.texi +--- binutils-2.24.orig/bfd/doc/core.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/core.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,70 +0,0 @@ +-@section Core files +- +- +-@subsection Core file functions +- +- +-@strong{Description}@* +-These are functions pertaining to core files. +- +-@findex bfd_core_file_failing_command +-@subsubsection @code{bfd_core_file_failing_command} +-@strong{Synopsis} +-@example +-const char *bfd_core_file_failing_command (bfd *abfd); +-@end example +-@strong{Description}@* +-Return a read-only string explaining which program was running +-when it failed and produced the core file @var{abfd}. +- +-@findex bfd_core_file_failing_signal +-@subsubsection @code{bfd_core_file_failing_signal} +-@strong{Synopsis} +-@example +-int bfd_core_file_failing_signal (bfd *abfd); +-@end example +-@strong{Description}@* +-Returns the signal number which caused the core dump which +-generated the file the BFD @var{abfd} is attached to. +- +-@findex bfd_core_file_pid +-@subsubsection @code{bfd_core_file_pid} +-@strong{Synopsis} +-@example +-int bfd_core_file_pid (bfd *abfd); +-@end example +-@strong{Description}@* +-Returns the PID of the process the core dump the BFD +-@var{abfd} is attached to was generated from. +- +-@findex core_file_matches_executable_p +-@subsubsection @code{core_file_matches_executable_p} +-@strong{Synopsis} +-@example +-bfd_boolean core_file_matches_executable_p +- (bfd *core_bfd, bfd *exec_bfd); +-@end example +-@strong{Description}@* +-Return @code{TRUE} if the core file attached to @var{core_bfd} +-was generated by a run of the executable file attached to +-@var{exec_bfd}, @code{FALSE} otherwise. +- +-@findex generic_core_file_matches_executable_p +-@subsubsection @code{generic_core_file_matches_executable_p} +-@strong{Synopsis} +-@example +-bfd_boolean generic_core_file_matches_executable_p +- (bfd *core_bfd, bfd *exec_bfd); +-@end example +-@strong{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}. The match is based on executable +-basenames only. +- +-Note: When not able to determine the core file failing +-command or the executable name, we still return TRUE even +-though we're not sure that core file and executable match. +-This is to avoid generating a false warning in situations +-where we really don't know whether they match or not. +- +diff -Nur binutils-2.24.orig/bfd/doc/elf.texi binutils-2.24/bfd/doc/elf.texi +--- binutils-2.24.orig/bfd/doc/elf.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/elf.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,9 +0,0 @@ +-@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. +- +diff -Nur binutils-2.24.orig/bfd/doc/format.texi binutils-2.24/bfd/doc/format.texi +--- binutils-2.24.orig/bfd/doc/format.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/format.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,112 +0,0 @@ +-@section File formats +-A format is a BFD concept of high level file contents type. The +-formats supported by BFD are: +- +-@itemize @bullet +- +-@item +-@code{bfd_object} +-@end itemize +-The BFD may contain data, symbols, relocations and debug info. +- +-@itemize @bullet +- +-@item +-@code{bfd_archive} +-@end itemize +-The BFD contains other BFDs and an optional index. +- +-@itemize @bullet +- +-@item +-@code{bfd_core} +-@end itemize +-The BFD contains the result of an executable core dump. +- +-@subsection File format functions +- +- +-@findex bfd_check_format +-@subsubsection @code{bfd_check_format} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_check_format (bfd *abfd, bfd_format format); +-@end example +-@strong{Description}@* +-Verify if the file attached to the BFD @var{abfd} is compatible +-with the format @var{format} (i.e., one of @code{bfd_object}, +-@code{bfd_archive} or @code{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 +-@code{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 @code{TRUE} on success, otherwise @code{FALSE} +-with one of the following error codes: +- +-@itemize @bullet +- +-@item +-@code{bfd_error_invalid_operation} - +-if @code{format} is not one of @code{bfd_object}, @code{bfd_archive} or +-@code{bfd_core}. +- +-@item +-@code{bfd_error_system_call} - +-if an error occured during a read - even some file mismatches +-can cause bfd_error_system_calls. +- +-@item +-@code{file_not_recognised} - +-none of the backends recognised the file format. +- +-@item +-@code{bfd_error_file_ambiguously_recognized} - +-more than one backend recognised the file format. +-@end itemize +- +-@findex bfd_check_format_matches +-@subsubsection @code{bfd_check_format_matches} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_check_format_matches +- (bfd *abfd, bfd_format format, char ***matching); +-@end example +-@strong{Description}@* +-Like @code{bfd_check_format}, except when it returns FALSE with +-@code{bfd_errno} set to @code{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 @code{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. +- +-@findex bfd_set_format +-@subsubsection @code{bfd_set_format} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_set_format (bfd *abfd, bfd_format format); +-@end example +-@strong{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. +- +-@findex bfd_format_string +-@subsubsection @code{bfd_format_string} +-@strong{Synopsis} +-@example +-const char *bfd_format_string (bfd_format format); +-@end example +-@strong{Description}@* +-Return a pointer to a const string +-@code{invalid}, @code{object}, @code{archive}, @code{core}, or @code{unknown}, +-depending upon the value of @var{format}. +- +diff -Nur binutils-2.24.orig/bfd/doc/hash.texi binutils-2.24/bfd/doc/hash.texi +--- binutils-2.24.orig/bfd/doc/hash.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/hash.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,247 +0,0 @@ +-@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 @code{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 +- +-@node 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 @code{struct +-bfd_hash_table} (defined in @code{bfd.h}) and call +-@code{bfd_hash_table_init} (if you know approximately how many +-entries you will need, the function @code{bfd_hash_table_init_n}, +-which takes a @var{size} argument, may be used). +-@code{bfd_hash_table_init} returns @code{FALSE} if some sort of +-error occurs. +- +-@findex bfd_hash_newfunc +-The function @code{bfd_hash_table_init} take as an argument a +-function to use to create new entries. For a basic hash +-table, use the function @code{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 +-@code{bfd_hash_table_init} will create an objalloc which will be +-used to allocate new entries. You may allocate memory on this +-objalloc using @code{bfd_hash_allocate}. +- +-@findex bfd_hash_table_free +-Use @code{bfd_hash_table_free} to free up all the memory that has +-been allocated for a hash table. This will not free up the +-@code{struct bfd_hash_table} itself, which you must provide. +- +-@findex bfd_hash_set_default_size +-Use @code{bfd_hash_set_default_size} to set the default size of +-hash table to use. +- +-@node 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 @code{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 @code{FALSE}, @code{bfd_hash_lookup} +-will look up a string. If the string is found, it will +-returns a pointer to a @code{struct bfd_hash_entry}. If the +-string is not found in the table @code{bfd_hash_lookup} will +-return @code{NULL}. You should not modify any of the fields in +-the returns @code{struct bfd_hash_entry}. +- +-If the @var{create} argument is @code{TRUE}, the string will be +-entered into the hash table if it is not already there. +-Either way a pointer to a @code{struct bfd_hash_entry} will be +-returned, either to the existing structure or to a newly +-created one. In this case, a @code{NULL} return means that an +-error occurred. +- +-If the @var{create} argument is @code{TRUE}, and a new entry is +-created, the @var{copy} argument is used to decide whether to +-copy the string onto the hash table objalloc or not. If +-@var{copy} is passed as @code{FALSE}, you must be careful not to +-deallocate or modify the string as long as the hash table +-exists. +- +-@node 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 @code{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. +- +-@code{bfd_hash_traverse} takes as arguments a function and a +-generic @code{void *} pointer. The function is called with a +-hash table entry (a @code{struct bfd_hash_entry *}) and the +-generic pointer passed to @code{bfd_hash_traverse}. The function +-must return a @code{boolean} value, which indicates whether to +-continue traversing the hash table. If the function returns +-@code{FALSE}, @code{bfd_hash_traverse} will stop the traversal and +-return immediately. +- +-@node 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 @code{bfdlink.h}. The +-functions are in @code{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 +- +-@node 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 @code{struct bfd_hash_entry}, which is defined in +-@code{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 @code{struct bfd_hash_table}. +- +-For example, the linker hash table defines @code{struct +-bfd_link_hash_entry} (in @code{bfdlink.h}). The first field, +-@code{root}, is of type @code{struct bfd_hash_entry}. Similarly, +-the first field in @code{struct bfd_link_hash_table}, @code{table}, +-is of type @code{struct bfd_hash_table}. +- +-@node 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 @code{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 @code{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} (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 == NULL) +- @{ +- ret = bfd_hash_allocate (table, sizeof (* ret)); +- if (ret == 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; +-@} +-@end example +-@strong{Description}@* +-The creation routine for the linker hash table, which is in +-@code{linker.c}, looks just like this example. +-@var{function_name} is @code{_bfd_link_hash_newfunc}. +-@var{entry_type} is @code{struct bfd_link_hash_entry}. +-@var{base_newfunc} is @code{bfd_hash_newfunc}, the creation +-routine for a basic hash table. +- +-@code{_bfd_link_hash_newfunc} also initializes the local fields +-in a linker hash table entry: @code{type}, @code{written} and +-@code{next}. +- +-@node 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 @code{_bfd_link_hash_table_init} in @code{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 @code{bfd_link_hash_lookup} in +-@code{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 +-@code{bfd_link_hash_traverse} in @code{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 @code{aout_link_hash_lookup} and +-@code{aout_link_hash_traverse} in aoutx.h. +- +diff -Nur binutils-2.24.orig/bfd/doc/init.texi binutils-2.24/bfd/doc/init.texi +--- binutils-2.24.orig/bfd/doc/init.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/init.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,16 +0,0 @@ +-@section Initialization +- +- +-@subsection Initialization functions +-These are the functions that handle initializing a BFD. +- +-@findex bfd_init +-@subsubsection @code{bfd_init} +-@strong{Synopsis} +-@example +-void bfd_init (void); +-@end example +-@strong{Description}@* +-This routine must be called before any other BFD function to +-initialize magical internal data structures. +- +diff -Nur binutils-2.24.orig/bfd/doc/libbfd.texi binutils-2.24/bfd/doc/libbfd.texi +--- binutils-2.24.orig/bfd/doc/libbfd.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/libbfd.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,179 +0,0 @@ +-@section Implementation details +- +- +-@subsection Internal functions +- +- +-@strong{Description}@* +-These routines are used within BFD. +-They are not intended for export, but are documented here for +-completeness. +- +-@findex bfd_write_bigendian_4byte_int +-@subsubsection @code{bfd_write_bigendian_4byte_int} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int); +-@end example +-@strong{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. +- +-@findex bfd_put_size +-@subsubsection @code{bfd_put_size} +-@findex bfd_get_size +-@subsubsection @code{bfd_get_size} +-@strong{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 @code{GET_WORD} +-to either @code{bfd_get_32} or @code{bfd_get_64}. +- +-In the put routines, @var{val} must be a @code{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 @code{lint} +-or @code{gcc -Wall} from detecting sins such as passing a pointer. +-To detect calling these with less than a @code{bfd_vma}, use +-@code{gcc -Wconversion} on a host with 64 bit @code{bfd_vma}'s. +-@example +- +-/* Byte swapping macros for user section data. */ +- +-#define bfd_put_8(abfd, val, ptr) \ +- ((void) (*((unsigned char *) (ptr)) = (val) & 0xff)) +-#define bfd_put_signed_8 \ +- bfd_put_8 +-#define bfd_get_8(abfd, ptr) \ +- (*(const unsigned char *) (ptr) & 0xff) +-#define bfd_get_signed_8(abfd, ptr) \ +- (((*(const unsigned char *) (ptr) & 0xff) ^ 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)) +- +-#define bfd_get(bits, abfd, ptr) \ +- ((bits) == 8 ? (bfd_vma) bfd_get_8 (abfd, ptr) \ +- : (bits) == 16 ? bfd_get_16 (abfd, ptr) \ +- : (bits) == 32 ? bfd_get_32 (abfd, ptr) \ +- : (bits) == 64 ? bfd_get_64 (abfd, ptr) \ +- : (abort (), (bfd_vma) - 1)) +- +-#define bfd_put(bits, abfd, val, ptr) \ +- ((bits) == 8 ? bfd_put_8 (abfd, val, ptr) \ +- : (bits) == 16 ? bfd_put_16 (abfd, val, ptr) \ +- : (bits) == 32 ? bfd_put_32 (abfd, val, ptr) \ +- : (bits) == 64 ? bfd_put_64 (abfd, val, ptr) \ +- : (abort (), (void) 0)) +- +-@end example +- +-@findex bfd_h_put_size +-@subsubsection @code{bfd_h_put_size} +-@strong{Description}@* +-These macros have the same function as their @code{bfd_get_x} +-brethren, 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. +-@example +- +-/* 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)) +- +-/* Aliases for the above, which should eventually go away. */ +- +-#define H_PUT_64 bfd_h_put_64 +-#define H_PUT_32 bfd_h_put_32 +-#define H_PUT_16 bfd_h_put_16 +-#define H_PUT_8 bfd_h_put_8 +-#define H_PUT_S64 bfd_h_put_signed_64 +-#define H_PUT_S32 bfd_h_put_signed_32 +-#define H_PUT_S16 bfd_h_put_signed_16 +-#define H_PUT_S8 bfd_h_put_signed_8 +-#define H_GET_64 bfd_h_get_64 +-#define H_GET_32 bfd_h_get_32 +-#define H_GET_16 bfd_h_get_16 +-#define H_GET_8 bfd_h_get_8 +-#define H_GET_S64 bfd_h_get_signed_64 +-#define H_GET_S32 bfd_h_get_signed_32 +-#define H_GET_S16 bfd_h_get_signed_16 +-#define H_GET_S8 bfd_h_get_signed_8 +- +- +-@end example +- +-@findex bfd_log2 +-@subsubsection @code{bfd_log2} +-@strong{Synopsis} +-@example +-unsigned int bfd_log2 (bfd_vma x); +-@end example +-@strong{Description}@* +-Return the log base 2 of the value supplied, rounded up. E.g., an +-@var{x} of 1025 returns 11. A @var{x} of 0 returns 0. +- +diff -Nur binutils-2.24.orig/bfd/doc/linker.texi binutils-2.24/bfd/doc/linker.texi +--- binutils-2.24.orig/bfd/doc/linker.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/linker.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,432 +0,0 @@ +-@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 @code{struct bfd_link_info} structure (defined in +-@code{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 @code{linker.c}, and use the +-header file @code{genlink.h}. As of this writing, the only back +-ends which have implemented versions of these routines are +-a.out (in @code{aoutx.h}) and ECOFF (in @code{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 +- +-@node 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 @code{struct bfd_link_hash_table} described in +-@code{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 @code{_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 @code{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 relocatable +-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 @code{struct bfd_link_hash_table}. The a.out linker +-hash table is created by the function +-@code{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. +- +-@node 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 @code{_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 +-@code{NAME(aout,link_add_symbols)}. +- +-@menu +-* Differing file formats:: +-* Adding symbols from an object file:: +-* Adding symbols from an archive:: +-@end menu +- +-@node 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 +-@code{_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 +-@code{_bfd_link_hash_table_create} vector. All the +-@code{_bfd_link_add_symbols} function can assume about the hash +-table is that it is derived from @code{struct +-bfd_link_hash_table}. +- +-Sometimes the @code{_bfd_link_add_symbols} function must store +-some information in the hash table entry to be used by the +-@code{_bfd_final_link} function. In such a case the output bfd +-xvec must be checked to make sure that the hash table was +-created by an object file of the same format. +- +-The @code{_bfd_final_link} routine must be prepared to handle a +-hash entry without any extra information added by the +-@code{_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 @code{ecoff_link_add_externals} for an example of how to +-check the output bfd before saving information (in this +-case, the ECOFF external symbol debugging information) in a +-hash table entry. +- +-@node 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 @code{_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 +-@code{_bfd_generic_link_add_one_symbol}. The +-@code{_bfd_link_add_symbols} routine is responsible for reading +-all the symbols from the object file and passing the correct +-information to @code{_bfd_generic_link_add_one_symbol}. +- +-The @code{_bfd_link_add_symbols} routine should not use +-@code{bfd_canonicalize_symtab} to read the symbols. The point of +-providing this routine is to avoid the overhead of converting +-the symbols into generic @code{asymbol} structures. +- +-@findex _bfd_generic_link_add_one_symbol +-@code{_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 @code{BSF_WEAK} or +-@code{BSF_INDIRECT}. The section is a section in the object +-file, or something like @code{bfd_und_section_ptr} for an undefined +-symbol or @code{bfd_com_section_ptr} for a common symbol. +- +-If the @code{_bfd_final_link} routine is also going to need to +-read the symbol information, the @code{_bfd_link_add_symbols} +-routine should save it somewhere attached to the object file +-BFD. However, the information should only be saved if the +-@code{keep_memory} field of the @code{info} argument is TRUE, so +-that the @code{-no-keep-memory} linker switch is effective. +- +-The a.out function which adds symbols from an object file is +-@code{aout_link_add_object_symbols}, and most of the interesting +-work is in @code{aout_link_add_symbols}. The latter saves +-pointers to the hash tables entries created by +-@code{_bfd_generic_link_add_one_symbol} indexed by symbol number, +-so that the @code{_bfd_final_link} routine does not have to call +-the hash table lookup routine to locate the entry. +- +-@node 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 @code{_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 +-@code{add_archive_element} linker callback, and it must add the +-symbols from the object file to the linker hash table. (The +-callback may in fact indicate that a replacement BFD should be +-used, in which case the symbols from that BFD should be added +-to the linker hash table instead.) +- +-@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 +-@code{_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. +-@code{_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 +-@code{_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 @code{add_archive_element} linker callback +-routine must be called with the element as an argument, and +-the element's symbols must be added to the linker hash table +-just as though the element had itself been passed to the +-@code{_bfd_link_add_symbols} function. The @code{add_archive_element} +-callback has the option to indicate that it would like to +-replace the element archive with a substitute BFD, in which +-case it is the symbols of that substitute BFD that must be +-added to the linker hash table instead. +- +-When the a.out @code{_bfd_link_add_symbols} function receives an +-archive, it calls @code{_bfd_generic_link_add_archive_symbols} +-passing @code{aout_link_check_archive_element} as the function +-argument. @code{aout_link_check_archive_element} calls +-@code{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 @code{add_archive_element} callback and then +-@code{aout_link_check_archive_element} calls +-@code{aout_link_add_symbols} to actually add the symbols to the +-linker hash table - possibly those of a substitute BFD, if the +-@code{add_archive_element} callback avails itself of that option. +- +-The ECOFF back end is unusual in that it does not normally +-call @code{_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. +- +-@node 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 @code{_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 relocatable 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 @code{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 +-@code{_bfd_final_link} routine is @code{NAME(aout,final_link)}. +- +-@menu +-* Information provided by the linker:: +-* Relocating the section contents:: +-* Writing the symbol table:: +-@end menu +- +-@node 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 @code{_bfd_final_link} entry point, +-it sets up some data structures for the function to use. +- +-The @code{input_bfds} field of the @code{bfd_link_info} structure +-will point to a list of all the input files included in the +-link. These files are linked through the @code{link_next} field +-of the @code{bfd} structure. +- +-Each section in the output file will have a list of +-@code{link_order} structures attached to the @code{map_head.link_order} +-field (the @code{link_order} structure is defined in +-@code{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 relocatable object file. +- +-@node Relocating the section contents, Writing the symbol table, Information provided by the linker, Performing the Final Link +-@subsubsection Relocating the section contents +-The @code{_bfd_final_link} function should look through the +-@code{link_order} structures attached to each section of the +-output file. Each @code{link_order} structure should either be +-handled specially, or it should be passed to the function +-@code{_bfd_default_link_order} which will do the right thing +-(@code{_bfd_default_link_order} is defined in @code{linker.c}). +- +-For efficiency, a @code{link_order} of type +-@code{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 @code{link_order} describes part of an +-output section in terms of a section belonging to one of the +-input files. The @code{_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 relocatable link, the +-relocs themselves must also be modified and written out. +- +-@findex _bfd_relocate_contents +-@findex _bfd_final_link_relocate +-The functions @code{_bfd_relocate_contents} and +-@code{_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 @code{reloc_howto_type} argument +-which describes the relocation to perform. These functions +-are defined in @code{reloc.c}. +- +-The a.out function which handles reading, relocating, and +-writing section contents is @code{aout_link_input_section}. The +-actual relocation is done in @code{aout_link_input_section_std} +-and @code{aout_link_input_section_ext}. +- +-@node Writing the symbol table, , Relocating the section contents, Performing the Final Link +-@subsubsection Writing the symbol table +-The @code{_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 @code{strip} and @code{discard} fields of the +-@code{bfd_link_info} structure. +- +-The local symbols of the input files will not have been +-entered into the linker hash table. The @code{_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 @code{link_order} structures, or it may be +-done by stepping through the @code{input_bfds} list. +- +-The @code{_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 @code{strip} field of the @code{bfd_link_info} structure +-controls which symbols are written out. The possible values +-are listed in @code{bfdlink.h}. If the value is @code{strip_some}, +-then the @code{keep_hash} field of the @code{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 @code{strip} field of the @code{bfd_link_info} structure +-permits local symbols to be written out, the @code{discard} field +-is used to further controls which local symbols are included +-in the output file. If the value is @code{discard_l}, then all +-local symbols which begin with a certain prefix are discarded; +-this is controlled by the @code{bfd_is_local_label_name} entry point. +- +-The a.out backend handles symbols by calling +-@code{aout_link_write_symbols} on each input BFD and then +-traversing the global hash table with the function +-@code{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 @code{NAME(aout,final_link)}. +- +-@findex bfd_link_split_section +-@subsubsection @code{bfd_link_split_section} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_link_split_section (bfd *abfd, asection *sec); +-@end example +-@strong{Description}@* +-Return nonzero if @var{sec} should be split during a +-reloceatable or final link. +-@example +-#define bfd_link_split_section(abfd, sec) \ +- BFD_SEND (abfd, _bfd_link_split_section, (abfd, sec)) +- +-@end example +- +-@findex bfd_section_already_linked +-@subsubsection @code{bfd_section_already_linked} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_section_already_linked (bfd *abfd, +- asection *sec, +- struct bfd_link_info *info); +-@end example +-@strong{Description}@* +-Check if @var{data} has been already linked during a reloceatable +-or final link. Return TRUE if it has. +-@example +-#define bfd_section_already_linked(abfd, sec, info) \ +- BFD_SEND (abfd, _section_already_linked, (abfd, sec, info)) +- +-@end example +- +-@findex bfd_generic_define_common_symbol +-@subsubsection @code{bfd_generic_define_common_symbol} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_generic_define_common_symbol +- (bfd *output_bfd, struct bfd_link_info *info, +- struct bfd_link_hash_entry *h); +-@end example +-@strong{Description}@* +-Convert common symbol @var{h} into a defined symbol. +-Return TRUE on success and FALSE on failure. +-@example +-#define bfd_define_common_symbol(output_bfd, info, h) \ +- BFD_SEND (output_bfd, _bfd_define_common_symbol, (output_bfd, info, h)) +- +-@end example +- +-@findex bfd_find_version_for_sym +-@subsubsection @code{bfd_find_version_for_sym} +-@strong{Synopsis} +-@example +-struct bfd_elf_version_tree * bfd_find_version_for_sym +- (struct bfd_elf_version_tree *verdefs, +- const char *sym_name, bfd_boolean *hide); +-@end example +-@strong{Description}@* +-Search an elf version script tree for symbol versioning +-info and export / don't-export status for a given symbol. +-Return non-NULL on success and NULL on failure; also sets +-the output @samp{hide} boolean parameter. +- +-@findex bfd_hide_sym_by_version +-@subsubsection @code{bfd_hide_sym_by_version} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_hide_sym_by_version +- (struct bfd_elf_version_tree *verdefs, const char *sym_name); +-@end example +-@strong{Description}@* +-Search an elf version script tree for symbol versioning +-info for a given symbol. Return TRUE if the symbol is hidden. +- +diff -Nur binutils-2.24.orig/bfd/doc/mmo.texi binutils-2.24/bfd/doc/mmo.texi +--- binutils-2.24.orig/bfd/doc/mmo.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/mmo.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,365 +0,0 @@ +-@section mmo backend +-The mmo object format is used exclusively together with Professor +-Donald E.@: Knuth's educational 64-bit processor MMIX. The simulator +-@command{mmix} which is available at +-@url{http://www-cs-faculty.stanford.edu/~knuth/programs/mmix.tar.gz} +-understands this format. That package also includes a combined +-assembler and linker called @command{mmixal}. The mmo format has +-no advantages feature-wise compared to e.g. ELF. It is a simple +-non-relocatable object format with no support for archives or +-debugging information, except for symbol value information and +-line numbers (which is not yet implemented in BFD). See +-@url{http://www-cs-faculty.stanford.edu/~knuth/mmix.html} for more +-information about MMIX. The ELF format is used for intermediate +-object files in the BFD implementation. +- +-@c We want to xref the symbol table node. A feature in "chew" +-@c requires that "commands" do not contain spaces in the +-@c arguments. Hence the hyphen in "Symbol-table". +-@menu +-* File layout:: +-* Symbol-table:: +-* mmo section mapping:: +-@end menu +- +-@node File layout, Symbol-table, mmo, mmo +-@subsection File layout +-The mmo file contents is not partitioned into named sections as +-with e.g.@: ELF. Memory areas is formed by specifying the +-location of the data that follows. Only the memory area +-@samp{0x0000@dots{}00} to @samp{0x01ff@dots{}ff} is executable, so +-it is used for code (and constants) and the area +-@samp{0x2000@dots{}00} to @samp{0x20ff@dots{}ff} is used for +-writable data. @xref{mmo section mapping}. +- +-There is provision for specifying ``special data'' of 65536 +-different types. We use type 80 (decimal), arbitrarily chosen the +-same as the ELF @code{e_machine} number for MMIX, filling it with +-section information normally found in ELF objects. @xref{mmo +-section mapping}. +- +-Contents is entered as 32-bit words, xor:ed over previous +-contents, always zero-initialized. A word that starts with the +-byte @samp{0x98} forms a command called a @samp{lopcode}, where +-the next byte distinguished between the thirteen lopcodes. The +-two remaining bytes, called the @samp{Y} and @samp{Z} fields, or +-the @samp{YZ} field (a 16-bit big-endian number), are used for +-various purposes different for each lopcode. As documented in +-@url{http://www-cs-faculty.stanford.edu/~knuth/mmixal-intro.ps.gz}, +-the lopcodes are: +- +-@table @code +-@item lop_quote +-0x98000001. The next word is contents, regardless of whether it +-starts with 0x98 or not. +- +-@item lop_loc +-0x9801YYZZ, where @samp{Z} is 1 or 2. This is a location +-directive, setting the location for the next data to the next +-32-bit word (for @math{Z = 1}) or 64-bit word (for @math{Z = 2}), +-plus @math{Y * 2^56}. Normally @samp{Y} is 0 for the text segment +-and 2 for the data segment. +- +-@item lop_skip +-0x9802YYZZ. Increase the current location by @samp{YZ} bytes. +- +-@item lop_fixo +-0x9803YYZZ, where @samp{Z} is 1 or 2. Store the current location +-as 64 bits into the location pointed to by the next 32-bit +-(@math{Z = 1}) or 64-bit (@math{Z = 2}) word, plus @math{Y * +-2^56}. +- +-@item lop_fixr +-0x9804YYZZ. @samp{YZ} is stored into the current location plus +-@math{2 - 4 * YZ}. +- +-@item lop_fixrx +-0x980500ZZ. @samp{Z} is 16 or 24. A value @samp{L} derived from +-the following 32-bit word are used in a manner similar to +-@samp{YZ} in lop_fixr: it is xor:ed into the current location +-minus @math{4 * L}. The first byte of the word is 0 or 1. If it +-is 1, then @math{L = (@var{lowest 24 bits of word}) - 2^Z}, if 0, +-then @math{L = (@var{lowest 24 bits of word})}. +- +-@item lop_file +-0x9806YYZZ. @samp{Y} is the file number, @samp{Z} is count of +-32-bit words. Set the file number to @samp{Y} and the line +-counter to 0. The next @math{Z * 4} bytes contain the file name, +-padded with zeros if the count is not a multiple of four. The +-same @samp{Y} may occur multiple times, but @samp{Z} must be 0 for +-all but the first occurrence. +- +-@item lop_line +-0x9807YYZZ. @samp{YZ} is the line number. Together with +-lop_file, it forms the source location for the next 32-bit word. +-Note that for each non-lopcode 32-bit word, line numbers are +-assumed incremented by one. +- +-@item lop_spec +-0x9808YYZZ. @samp{YZ} is the type number. Data until the next +-lopcode other than lop_quote forms special data of type @samp{YZ}. +-@xref{mmo section mapping}. +- +-Other types than 80, (or type 80 with a content that does not +-parse) is stored in sections named @code{.MMIX.spec_data.@var{n}} +-where @var{n} is the @samp{YZ}-type. The flags for such a +-sections say not to allocate or load the data. The vma is 0. +-Contents of multiple occurrences of special data @var{n} is +-concatenated to the data of the previous lop_spec @var{n}s. The +-location in data or code at which the lop_spec occurred is lost. +- +-@item lop_pre +-0x980901ZZ. The first lopcode in a file. The @samp{Z} field forms the +-length of header information in 32-bit words, where the first word +-tells the time in seconds since @samp{00:00:00 GMT Jan 1 1970}. +- +-@item lop_post +-0x980a00ZZ. @math{Z > 32}. This lopcode follows after all +-content-generating lopcodes in a program. The @samp{Z} field +-denotes the value of @samp{rG} at the beginning of the program. +-The following @math{256 - Z} big-endian 64-bit words are loaded +-into global registers @samp{$G} @dots{} @samp{$255}. +- +-@item lop_stab +-0x980b0000. The next-to-last lopcode in a program. Must follow +-immediately after the lop_post lopcode and its data. After this +-lopcode follows all symbols in a compressed format +-(@pxref{Symbol-table}). +- +-@item lop_end +-0x980cYYZZ. The last lopcode in a program. It must follow the +-lop_stab lopcode and its data. The @samp{YZ} field contains the +-number of 32-bit words of symbol table information after the +-preceding lop_stab lopcode. +-@end table +- +-Note that the lopcode "fixups"; @code{lop_fixr}, @code{lop_fixrx} and +-@code{lop_fixo} are not generated by BFD, but are handled. They are +-generated by @code{mmixal}. +- +-This trivial one-label, one-instruction file: +- +-@example +- :Main TRAP 1,2,3 +-@end example +- +-can be represented this way in mmo: +- +-@example +- 0x98090101 - lop_pre, one 32-bit word with timestamp. +- +- 0x98010002 - lop_loc, text segment, using a 64-bit address. +- Note that mmixal does not emit this for the file above. +- 0x00000000 - Address, high 32 bits. +- 0x00000000 - Address, low 32 bits. +- 0x98060002 - lop_file, 2 32-bit words for file-name. +- 0x74657374 - "test" +- 0x2e730000 - ".s\0\0" +- 0x98070001 - lop_line, line 1. +- 0x00010203 - TRAP 1,2,3 +- 0x980a00ff - lop_post, setting $255 to 0. +- 0x00000000 +- 0x00000000 +- 0x980b0000 - lop_stab for ":Main" = 0, serial 1. +- 0x203a4040 @xref{Symbol-table}. +- 0x10404020 +- 0x4d206120 +- 0x69016e00 +- 0x81000000 +- 0x980c0005 - lop_end; symbol table contained five 32-bit words. +-@end example +-@node Symbol-table, mmo section mapping, File layout, mmo +-@subsection Symbol table format +-From mmixal.w (or really, the generated mmixal.tex) in +-@url{http://www-cs-faculty.stanford.edu/~knuth/programs/mmix.tar.gz}): +-``Symbols are stored and retrieved by means of a @samp{ternary +-search trie}, following ideas of Bentley and Sedgewick. (See +-ACM--SIAM Symp.@: on Discrete Algorithms @samp{8} (1997), 360--369; +-R.@:Sedgewick, @samp{Algorithms in C} (Reading, Mass.@: +-Addison--Wesley, 1998), @samp{15.4}.) Each trie node stores a +-character, and there are branches to subtries for the cases where +-a given character is less than, equal to, or greater than the +-character in the trie. There also is a pointer to a symbol table +-entry if a symbol ends at the current node.'' +- +-So it's a tree encoded as a stream of bytes. The stream of bytes +-acts on a single virtual global symbol, adding and removing +-characters and signalling complete symbol points. Here, we read +-the stream and create symbols at the completion points. +- +-First, there's a control byte @code{m}. If any of the listed bits +-in @code{m} is nonzero, we execute what stands at the right, in +-the listed order: +- +-@example +- (MMO3_LEFT) +- 0x40 - Traverse left trie. +- (Read a new command byte and recurse.) +- +- (MMO3_SYMBITS) +- 0x2f - Read the next byte as a character and store it in the +- current character position; increment character position. +- Test the bits of @code{m}: +- +- (MMO3_WCHAR) +- 0x80 - The character is 16-bit (so read another byte, +- merge into current character. +- +- (MMO3_TYPEBITS) +- 0xf - We have a complete symbol; parse the type, value +- and serial number and do what should be done +- with a symbol. The type and length information +- is in j = (m & 0xf). +- +- (MMO3_REGQUAL_BITS) +- j == 0xf: A register variable. The following +- byte tells which register. +- j <= 8: An absolute symbol. Read j bytes as the +- big-endian number the symbol equals. +- A j = 2 with two zero bytes denotes an +- unknown symbol. +- j > 8: As with j <= 8, but add (0x20 << 56) +- to the value in the following j - 8 +- bytes. +- +- Then comes the serial number, as a variant of +- uleb128, but better named ubeb128: +- Read bytes and shift the previous value left 7 +- (multiply by 128). Add in the new byte, repeat +- until a byte has bit 7 set. The serial number +- is the computed value minus 128. +- +- (MMO3_MIDDLE) +- 0x20 - Traverse middle trie. (Read a new command byte +- and recurse.) Decrement character position. +- +- (MMO3_RIGHT) +- 0x10 - Traverse right trie. (Read a new command byte and +- recurse.) +-@end example +- +-Let's look again at the @code{lop_stab} for the trivial file +-(@pxref{File layout}). +- +-@example +- 0x980b0000 - lop_stab for ":Main" = 0, serial 1. +- 0x203a4040 +- 0x10404020 +- 0x4d206120 +- 0x69016e00 +- 0x81000000 +-@end example +- +-This forms the trivial trie (note that the path between ``:'' and +-``M'' is redundant): +- +-@example +- 203a ":" +- 40 / +- 40 / +- 10 \ +- 40 / +- 40 / +- 204d "M" +- 2061 "a" +- 2069 "i" +- 016e "n" is the last character in a full symbol, and +- with a value represented in one byte. +- 00 The value is 0. +- 81 The serial number is 1. +-@end example +- +-@node mmo section mapping, , Symbol-table, mmo +-@subsection mmo section mapping +-The implementation in BFD uses special data type 80 (decimal) to +-encapsulate and describe named sections, containing e.g.@: debug +-information. If needed, any datum in the encapsulation will be +-quoted using lop_quote. First comes a 32-bit word holding the +-number of 32-bit words containing the zero-terminated zero-padded +-segment name. After the name there's a 32-bit word holding flags +-describing the section type. Then comes a 64-bit big-endian word +-with the section length (in bytes), then another with the section +-start address. Depending on the type of section, the contents +-might follow, zero-padded to 32-bit boundary. For a loadable +-section (such as data or code), the contents might follow at some +-later point, not necessarily immediately, as a lop_loc with the +-same start address as in the section description, followed by the +-contents. This in effect forms a descriptor that must be emitted +-before the actual contents. Sections described this way must not +-overlap. +- +-For areas that don't have such descriptors, synthetic sections are +-formed by BFD. Consecutive contents in the two memory areas +-@samp{0x0000@dots{}00} to @samp{0x01ff@dots{}ff} and +-@samp{0x2000@dots{}00} to @samp{0x20ff@dots{}ff} are entered in +-sections named @code{.text} and @code{.data} respectively. If an area +-is not otherwise described, but would together with a neighboring +-lower area be less than @samp{0x40000000} bytes long, it is joined +-with the lower area and the gap is zero-filled. For other cases, +-a new section is formed, named @code{.MMIX.sec.@var{n}}. Here, +-@var{n} is a number, a running count through the mmo file, +-starting at 0. +- +-A loadable section specified as: +- +-@example +- .section secname,"ax" +- TETRA 1,2,3,4,-1,-2009 +- BYTE 80 +-@end example +- +-and linked to address @samp{0x4}, is represented by the sequence: +- +-@example +- 0x98080050 - lop_spec 80 +- 0x00000002 - two 32-bit words for the section name +- 0x7365636e - "secn" +- 0x616d6500 - "ame\0" +- 0x00000033 - flags CODE, READONLY, LOAD, ALLOC +- 0x00000000 - high 32 bits of section length +- 0x0000001c - section length is 28 bytes; 6 * 4 + 1 + alignment to 32 bits +- 0x00000000 - high 32 bits of section address +- 0x00000004 - section address is 4 +- 0x98010002 - 64 bits with address of following data +- 0x00000000 - high 32 bits of address +- 0x00000004 - low 32 bits: data starts at address 4 +- 0x00000001 - 1 +- 0x00000002 - 2 +- 0x00000003 - 3 +- 0x00000004 - 4 +- 0xffffffff - -1 +- 0xfffff827 - -2009 +- 0x50000000 - 80 as a byte, padded with zeros. +-@end example +- +-Note that the lop_spec wrapping does not include the section +-contents. Compare this to a non-loaded section specified as: +- +-@example +- .section thirdsec +- TETRA 200001,100002 +- BYTE 38,40 +-@end example +- +-This, when linked to address @samp{0x200000000000001c}, is +-represented by: +- +-@example +- 0x98080050 - lop_spec 80 +- 0x00000002 - two 32-bit words for the section name +- 0x7365636e - "thir" +- 0x616d6500 - "dsec" +- 0x00000010 - flag READONLY +- 0x00000000 - high 32 bits of section length +- 0x0000000c - section length is 12 bytes; 2 * 4 + 2 + alignment to 32 bits +- 0x20000000 - high 32 bits of address +- 0x0000001c - low 32 bits of address 0x200000000000001c +- 0x00030d41 - 200001 +- 0x000186a2 - 100002 +- 0x26280000 - 38, 40 as bytes, padded with zeros +-@end example +- +-For the latter example, the section contents must not be +-loaded in memory, and is therefore specified as part of the +-special data. The address is usually unimportant but might +-provide information for e.g.@: the DWARF 2 debugging format. +diff -Nur binutils-2.24.orig/bfd/doc/opncls.texi binutils-2.24/bfd/doc/opncls.texi +--- binutils-2.24.orig/bfd/doc/opncls.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/opncls.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,432 +0,0 @@ +- +-@example +-/* Set to N to open the next N BFDs using an alternate id space. */ +-extern unsigned int bfd_use_reserved_id; +-@end example +-@section Opening and closing BFDs +- +- +-@subsection Functions for opening and closing +- +- +-@findex bfd_fopen +-@subsubsection @code{bfd_fopen} +-@strong{Synopsis} +-@example +-bfd *bfd_fopen (const char *filename, const char *target, +- const char *mode, int fd); +-@end example +-@strong{Description}@* +-Open the file @var{filename} with the target @var{target}. +-Return a pointer to the created BFD. If @var{fd} is not -1, +-then @code{fdopen} is used to open the file; otherwise, @code{fopen} +-is used. @var{mode} is passed directly to @code{fopen} or +-@code{fdopen}. +- +-Calls @code{bfd_find_target}, so @var{target} is interpreted as by +-that function. +- +-The new BFD is marked as cacheable iff @var{fd} is -1. +- +-If @code{NULL} is returned then an error has occured. Possible errors +-are @code{bfd_error_no_memory}, @code{bfd_error_invalid_target} or +-@code{system_call} error. +- +-On error, @var{fd} is always closed. +- +-@findex bfd_openr +-@subsubsection @code{bfd_openr} +-@strong{Synopsis} +-@example +-bfd *bfd_openr (const char *filename, const char *target); +-@end example +-@strong{Description}@* +-Open the file @var{filename} (using @code{fopen}) with the target +-@var{target}. Return a pointer to the created BFD. +- +-Calls @code{bfd_find_target}, so @var{target} is interpreted as by +-that function. +- +-If @code{NULL} is returned then an error has occured. Possible errors +-are @code{bfd_error_no_memory}, @code{bfd_error_invalid_target} or +-@code{system_call} error. +- +-@findex bfd_fdopenr +-@subsubsection @code{bfd_fdopenr} +-@strong{Synopsis} +-@example +-bfd *bfd_fdopenr (const char *filename, const char *target, int fd); +-@end example +-@strong{Description}@* +-@code{bfd_fdopenr} is to @code{bfd_fopenr} much like @code{fdopen} is to +-@code{fopen}. It opens a BFD on a file already described by the +-@var{fd} supplied. +- +-When the file is later @code{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 caching; the file descriptor will remain open +-until @code{bfd_close}, and will not be affected by BFD operations +-on other files. +- +-Possible errors are @code{bfd_error_no_memory}, +-@code{bfd_error_invalid_target} and @code{bfd_error_system_call}. +- +-On error, @var{fd} is closed. +- +-@findex bfd_openstreamr +-@subsubsection @code{bfd_openstreamr} +-@strong{Synopsis} +-@example +-bfd *bfd_openstreamr (const char *, const char *, void *); +-@end example +-@strong{Description}@* +-Open a BFD for read access on an existing stdio stream. When +-the BFD is passed to @code{bfd_close}, the stream will be closed. +- +-@findex bfd_openr_iovec +-@subsubsection @code{bfd_openr_iovec} +-@strong{Synopsis} +-@example +-bfd *bfd_openr_iovec (const char *filename, const char *target, +- void *(*open_func) (struct bfd *nbfd, +- void *open_closure), +- void *open_closure, +- file_ptr (*pread_func) (struct bfd *nbfd, +- void *stream, +- void *buf, +- file_ptr nbytes, +- file_ptr offset), +- int (*close_func) (struct bfd *nbfd, +- void *stream), +- int (*stat_func) (struct bfd *abfd, +- void *stream, +- struct stat *sb)); +-@end example +-@strong{Description}@* +-Create and return a BFD backed by a read-only @var{stream}. +-The @var{stream} is created using @var{open_func}, accessed using +-@var{pread_func} and destroyed using @var{close_func}. +- +-Calls @code{bfd_find_target}, so @var{target} is interpreted as by +-that function. +- +-Calls @var{open_func} (which can call @code{bfd_zalloc} and +-@code{bfd_get_filename}) to obtain the read-only stream backing +-the BFD. @var{open_func} either succeeds returning the +-non-@code{NULL} @var{stream}, or fails returning @code{NULL} +-(setting @code{bfd_error}). +- +-Calls @var{pread_func} to request @var{nbytes} of data from +-@var{stream} starting at @var{offset} (e.g., via a call to +-@code{bfd_read}). @var{pread_func} either succeeds returning the +-number of bytes read (which can be less than @var{nbytes} when +-end-of-file), or fails returning -1 (setting @code{bfd_error}). +- +-Calls @var{close_func} when the BFD is later closed using +-@code{bfd_close}. @var{close_func} either succeeds returning 0, or +-fails returning -1 (setting @code{bfd_error}). +- +-Calls @var{stat_func} to fill in a stat structure for bfd_stat, +-bfd_get_size, and bfd_get_mtime calls. @var{stat_func} returns 0 +-on success, or returns -1 on failure (setting @code{bfd_error}). +- +-If @code{bfd_openr_iovec} returns @code{NULL} then an error has +-occurred. Possible errors are @code{bfd_error_no_memory}, +-@code{bfd_error_invalid_target} and @code{bfd_error_system_call}. +- +-@findex bfd_openw +-@subsubsection @code{bfd_openw} +-@strong{Synopsis} +-@example +-bfd *bfd_openw (const char *filename, const char *target); +-@end example +-@strong{Description}@* +-Create a BFD, associated with file @var{filename}, using the +-file format @var{target}, and return a pointer to it. +- +-Possible errors are @code{bfd_error_system_call}, @code{bfd_error_no_memory}, +-@code{bfd_error_invalid_target}. +- +-@findex bfd_close +-@subsubsection @code{bfd_close} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_close (bfd *abfd); +-@end example +-@strong{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 @code{chmod} is called +-to mark it as such. +- +-All memory attached to the BFD is released. +- +-The file descriptor associated with the BFD is closed (even +-if it was passed in to BFD by @code{bfd_fdopenr}). +- +-@strong{Returns}@* +-@code{TRUE} is returned if all is ok, otherwise @code{FALSE}. +- +-@findex bfd_close_all_done +-@subsubsection @code{bfd_close_all_done} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_close_all_done (bfd *); +-@end example +-@strong{Description}@* +-Close a BFD. Differs from @code{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 @code{chmod} is called +-to mark it as such. +- +-All memory attached to the BFD is released. +- +-@strong{Returns}@* +-@code{TRUE} is returned if all is ok, otherwise @code{FALSE}. +- +-@findex bfd_create +-@subsubsection @code{bfd_create} +-@strong{Synopsis} +-@example +-bfd *bfd_create (const char *filename, bfd *templ); +-@end example +-@strong{Description}@* +-Create a new BFD in the manner of @code{bfd_openw}, but without +-opening a file. The new BFD takes the target from the target +-used by @var{templ}. The format is always set to @code{bfd_object}. +- +-@findex bfd_make_writable +-@subsubsection @code{bfd_make_writable} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_make_writable (bfd *abfd); +-@end example +-@strong{Description}@* +-Takes a BFD as created by @code{bfd_create} and converts it +-into one like as returned by @code{bfd_openw}. It does this +-by converting the BFD to BFD_IN_MEMORY. It's assumed that +-you will call @code{bfd_make_readable} on this bfd later. +- +-@strong{Returns}@* +-@code{TRUE} is returned if all is ok, otherwise @code{FALSE}. +- +-@findex bfd_make_readable +-@subsubsection @code{bfd_make_readable} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_make_readable (bfd *abfd); +-@end example +-@strong{Description}@* +-Takes a BFD as created by @code{bfd_create} and +-@code{bfd_make_writable} and converts it into one like as +-returned by @code{bfd_openr}. It does this by writing the +-contents out to the memory buffer, then reversing the +-direction. +- +-@strong{Returns}@* +-@code{TRUE} is returned if all is ok, otherwise @code{FALSE}. +- +-@findex bfd_alloc +-@subsubsection @code{bfd_alloc} +-@strong{Synopsis} +-@example +-void *bfd_alloc (bfd *abfd, bfd_size_type wanted); +-@end example +-@strong{Description}@* +-Allocate a block of @var{wanted} bytes of memory attached to +-@code{abfd} and return a pointer to it. +- +-@findex bfd_alloc2 +-@subsubsection @code{bfd_alloc2} +-@strong{Synopsis} +-@example +-void *bfd_alloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size); +-@end example +-@strong{Description}@* +-Allocate a block of @var{nmemb} elements of @var{size} bytes each +-of memory attached to @code{abfd} and return a pointer to it. +- +-@findex bfd_zalloc +-@subsubsection @code{bfd_zalloc} +-@strong{Synopsis} +-@example +-void *bfd_zalloc (bfd *abfd, bfd_size_type wanted); +-@end example +-@strong{Description}@* +-Allocate a block of @var{wanted} bytes of zeroed memory +-attached to @code{abfd} and return a pointer to it. +- +-@findex bfd_zalloc2 +-@subsubsection @code{bfd_zalloc2} +-@strong{Synopsis} +-@example +-void *bfd_zalloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size); +-@end example +-@strong{Description}@* +-Allocate a block of @var{nmemb} elements of @var{size} bytes each +-of zeroed memory attached to @code{abfd} and return a pointer to it. +- +-@findex bfd_calc_gnu_debuglink_crc32 +-@subsubsection @code{bfd_calc_gnu_debuglink_crc32} +-@strong{Synopsis} +-@example +-unsigned long bfd_calc_gnu_debuglink_crc32 +- (unsigned long crc, const unsigned char *buf, bfd_size_type len); +-@end example +-@strong{Description}@* +-Computes a CRC value as used in the .gnu_debuglink section. +-Advances the previously computed @var{crc} value by computing +-and adding in the crc32 for @var{len} bytes of @var{buf}. +- +-@strong{Returns}@* +-Return the updated CRC32 value. +- +-@findex bfd_get_debug_link_info +-@subsubsection @code{bfd_get_debug_link_info} +-@strong{Synopsis} +-@example +-char *bfd_get_debug_link_info (bfd *abfd, unsigned long *crc32_out); +-@end example +-@strong{Description}@* +-fetch the filename and CRC32 value for any separate debuginfo +-associated with @var{abfd}. Return NULL if no such info found, +-otherwise return filename and update @var{crc32_out}. The +-returned filename is allocated with @code{malloc}; freeing it +-is the responsibility of the caller. +- +-@findex bfd_get_alt_debug_link_info +-@subsubsection @code{bfd_get_alt_debug_link_info} +-@strong{Synopsis} +-@example +-char *bfd_get_alt_debug_link_info (bfd *abfd, unsigned long *crc32_out); +-@end example +-@strong{Description}@* +-Fetch the filename and BuildID value for any alternate debuginfo +-associated with @var{abfd}. Return NULL if no such info found, +-otherwise return filename and update @var{buildid_out}. The +-returned filename is allocated with @code{malloc}; freeing it +-is the responsibility of the caller. +- +-@findex separate_debug_file_exists +-@subsubsection @code{separate_debug_file_exists} +-@strong{Synopsis} +-@example +-bfd_boolean separate_debug_file_exists +- (char *name, unsigned long crc32); +-@end example +-@strong{Description}@* +-Checks to see if @var{name} is a file and if its contents +-match @var{crc32}. +- +-@findex separate_alt_debug_file_exists +-@subsubsection @code{separate_alt_debug_file_exists} +-@strong{Synopsis} +-@example +-bfd_boolean separate_alt_debug_file_exists +- (char *name, unsigned long crc32); +-@end example +-@strong{Description}@* +-Checks to see if @var{name} is a file and if its BuildID +-matches @var{buildid}. +- +-@findex find_separate_debug_file +-@subsubsection @code{find_separate_debug_file} +-@strong{Synopsis} +-@example +-char *find_separate_debug_file (bfd *abfd); +-@end example +-@strong{Description}@* +-Searches @var{abfd} for a section called @var{section_name} which +-is expected to contain a reference to a file containing separate +-debugging information. The function scans various locations in +-the filesystem, including the file tree rooted at +-@var{debug_file_directory}, and returns the first matching +-filename that it finds. If @var{check_crc} is TRUE then the +-contents of the file must also match the CRC value contained in +-@var{section_name}. Returns NULL if no valid file could be found. +- +-@findex bfd_follow_gnu_debuglink +-@subsubsection @code{bfd_follow_gnu_debuglink} +-@strong{Synopsis} +-@example +-char *bfd_follow_gnu_debuglink (bfd *abfd, const char *dir); +-@end example +-@strong{Description}@* +-Takes a BFD and searches it for a .gnu_debuglink section. If this +-section is found, it examines the section for the name and checksum +-of a '.debug' file containing auxiliary debugging information. It +-then searches the filesystem for this .debug file in some standard +-locations, including the directory tree rooted at @var{dir}, and if +-found returns the full filename. +- +-If @var{dir} is NULL, it will search a default path configured into +-libbfd at build time. [XXX this feature is not currently +-implemented]. +- +-@strong{Returns}@* +-@code{NULL} on any errors or failure to locate the .debug file, +-otherwise a pointer to a heap-allocated string containing the +-filename. The caller is responsible for freeing this string. +- +-@findex bfd_follow_gnu_debugaltlink +-@subsubsection @code{bfd_follow_gnu_debugaltlink} +-@strong{Synopsis} +-@example +-char *bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir); +-@end example +-@strong{Description}@* +-Takes a BFD and searches it for a .gnu_debugaltlink section. If this +-section is found, it examines the section for the name of a file +-containing auxiliary debugging information. It then searches the +-filesystem for this file in a set of standard locations, including +-the directory tree rooted at @var{dir}, and if found returns the +-full filename. +- +-If @var{dir} is NULL, it will search a default path configured into +-libbfd at build time. [FIXME: This feature is not currently +-implemented]. +- +-@strong{Returns}@* +-@code{NULL} on any errors or failure to locate the debug file, +-otherwise a pointer to a heap-allocated string containing the +-filename. The caller is responsible for freeing this string. +- +-@findex bfd_create_gnu_debuglink_section +-@subsubsection @code{bfd_create_gnu_debuglink_section} +-@strong{Synopsis} +-@example +-struct bfd_section *bfd_create_gnu_debuglink_section +- (bfd *abfd, const char *filename); +-@end example +-@strong{Description}@* +-Takes a @var{BFD} and adds a .gnu_debuglink section to it. The section is sized +-to be big enough to contain a link to the specified @var{filename}. +- +-@strong{Returns}@* +-A pointer to the new section is returned if all is ok. Otherwise @code{NULL} is +-returned and bfd_error is set. +- +-@findex bfd_fill_in_gnu_debuglink_section +-@subsubsection @code{bfd_fill_in_gnu_debuglink_section} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_fill_in_gnu_debuglink_section +- (bfd *abfd, struct bfd_section *sect, const char *filename); +-@end example +-@strong{Description}@* +-Takes a @var{BFD} and containing a .gnu_debuglink section @var{SECT} +-and fills in the contents of the section to contain a link to the +-specified @var{filename}. The filename should be relative to the +-current directory. +- +-@strong{Returns}@* +-@code{TRUE} is returned if all is ok. Otherwise @code{FALSE} is returned +-and bfd_error is set. +- +diff -Nur binutils-2.24.orig/bfd/doc/reloc.texi binutils-2.24/bfd/doc/reloc.texi +--- binutils-2.24.orig/bfd/doc/reloc.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/reloc.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,3849 +0,0 @@ +-@section Relocations +-BFD maintains relocations in much the same way it maintains +-symbols: they are left alone until required, then read in +-en-masse and translated into an internal form. A common +-routine @code{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 @code{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 +- +- +-@node typedef arelent, howto manager, Relocations, Relocations +-@subsection typedef arelent +-This is the structure of a relocation entry: +- +- +-@example +- +-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 bfd_symbol **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; +- +-@end example +-@strong{Description}@* +-Here is a description of each of the fields within an @code{arelent}: +- +-@itemize @bullet +- +-@item +-@code{sym_ptr_ptr} +-@end itemize +-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 +-@code{canonicalize_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. +- +-@itemize @bullet +- +-@item +-@code{address} +-@end itemize +-The @code{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. +- +-@itemize @bullet +- +-@item +-@code{addend} +-@end itemize +-The @code{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: +- +-@example +- char foo[]; +- main() +- @{ +- return foo[0x12345678]; +- @} +-@end example +- +-Could be compiled into: +- +-@example +- linkw fp,#-4 +- moveb @@#12345678,d0 +- extbl d0 +- unlk fp +- rts +-@end example +- +-This could create a reloc pointing to @code{foo}, but leave the +-offset in the data, something like: +- +-@example +-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 +-@end example +- +-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: +- +-@example +- or.u r13,r0,hi16(_foo+0x12345678) +- ld.b r2,r13,lo16(_foo+0x12345678) +- jmp r1 +-@end example +- +-This should create two relocs, both pointing to @code{_foo}, and with +-0x12340000 in their addend field. The data would consist of: +- +-@example +-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 +-@end example +- +-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 @code{_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. +- +-@example +- save %sp,-112,%sp +- sethi %hi(_foo+0x12345678),%g2 +- ldsb [%g2+%lo(_foo+0x12345678)],%i0 +- ret +- restore +-@end example +- +-Both relocs contain a pointer to @code{foo}, and the offsets +-contain junk. +- +-@example +-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 +-@end example +- +-@itemize @bullet +- +-@item +-@code{howto} +-@end itemize +-The @code{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 @code{enum complain_overflow} +-Indicates what sort of overflow checking should be done when +-performing a relocation. +- +- +-@example +- +-enum complain_overflow +-@{ +- /* Do not complain on overflow. */ +- complain_overflow_dont, +- +- /* Complain if the value overflows when considered as a signed +- number one bit larger than the field. ie. A bitfield of N bits +- is allowed to represent -2**n to 2**n-1. */ +- complain_overflow_bitfield, +- +- /* Complain if the value overflows when considered as a signed +- number. */ +- complain_overflow_signed, +- +- /* Complain if the value overflows when considered as an +- unsigned number. */ +- complain_overflow_unsigned +-@}; +-@end example +-@subsubsection @code{reloc_howto_type} +-The @code{reloc_howto_type} is a structure which contains all the +-information that libbfd needs to know to tie up a back end's data. +- +- +-@example +-struct bfd_symbol; /* Forward declaration. */ +- +-struct reloc_howto_struct +-@{ +- /* The type field has mainly a documentary 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; +- +- /* The relocation is relative to the field being relocated. */ +- bfd_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 accommodated (e.g., i960 callj +- instructions). */ +- bfd_reloc_status_type (*special_function) +- (bfd *, arelent *, struct bfd_symbol *, void *, asection *, +- bfd *, char **); +- +- /* The textual name of the relocation type. */ +- char *name; +- +- /* Some formats record a relocation addend in the section contents +- rather than with the relocation. For ELF formats this is the +- distinction between USE_REL and USE_RELA (though the code checks +- for USE_REL == 1/0). The value of this field is TRUE if the +- addend is recorded with the section contents; when performing a +- partial link (ld -r) the section contents (the data) will be +- modified. The value of this field is FALSE if addends are +- recorded with the relocation (in arelent.addend); when performing +- a partial link the relocation will be modified. +- All relocations for all ELF USE_RELA targets should set this field +- to FALSE (values of TRUE should be looked on with suspicion). +- However, the converse is not true: not all relocations of all ELF +- USE_REL targets set this field to TRUE. Why this is so is peculiar +- to each particular target. For relocs that aren't used in partial +- links (e.g. GOT stuff) it doesn't matter what this is set to. */ +- bfd_boolean partial_inplace; +- +- /* src_mask selects the part of the instruction (or data) to be used +- in the relocation sum. If the target relocations don't have an +- addend in the reloc, eg. ELF USE_REL, src_mask will normally equal +- dst_mask to extract the addend from the section contents. If +- relocations do have an addend in the reloc, eg. ELF USE_RELA, this +- field should be zero. Non-zero values for ELF USE_RELA targets are +- bogus as in those cases the value in the dst_mask part of the +- section contents should be treated as garbage. */ +- bfd_vma src_mask; +- +- /* dst_mask selects which parts of the instruction (or data) are +- replaced with a relocated value. */ +- 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. */ +- bfd_boolean pcrel_offset; +-@}; +- +-@end example +-@findex The HOWTO Macro +-@subsubsection @code{The HOWTO Macro} +-@strong{Description}@* +-The HOWTO define is horrible and will go away. +-@example +-#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 @} +-@end example +- +-@strong{Description}@* +-And will be replaced with the totally magic way. But for the +-moment, we are compatible, so do it this way. +-@example +-#define NEWHOWTO(FUNCTION, NAME, SIZE, REL, IN) \ +- HOWTO (0, 0, SIZE, 0, REL, 0, complain_overflow_dont, FUNCTION, \ +- NAME, FALSE, 0, 0, IN) +- +-@end example +- +-@strong{Description}@* +-This is used to fill in an empty howto entry in an array. +-@example +-#define EMPTY_HOWTO(C) \ +- HOWTO ((C), 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL, \ +- NULL, FALSE, 0, 0, FALSE) +- +-@end example +- +-@strong{Description}@* +-Helper routine to turn a symbol into a relocation value. +-@example +-#define HOWTO_PREPARE(relocation, symbol) \ +- @{ \ +- if (symbol != NULL) \ +- @{ \ +- if (bfd_is_com_section (symbol->section)) \ +- @{ \ +- relocation = 0; \ +- @} \ +- else \ +- @{ \ +- relocation = symbol->value; \ +- @} \ +- @} \ +- @} +- +-@end example +- +-@findex bfd_get_reloc_size +-@subsubsection @code{bfd_get_reloc_size} +-@strong{Synopsis} +-@example +-unsigned int bfd_get_reloc_size (reloc_howto_type *); +-@end example +-@strong{Description}@* +-For a reloc_howto_type that operates on a fixed number of bytes, +-this returns the number of bytes operated on. +- +-@findex arelent_chain +-@subsubsection @code{arelent_chain} +-@strong{Description}@* +-How relocs are tied together in an @code{asection}: +-@example +-typedef struct relent_chain +-@{ +- arelent relent; +- struct relent_chain *next; +-@} +-arelent_chain; +- +-@end example +- +-@findex bfd_check_overflow +-@subsubsection @code{bfd_check_overflow} +-@strong{Synopsis} +-@example +-bfd_reloc_status_type bfd_check_overflow +- (enum complain_overflow how, +- unsigned int bitsize, +- unsigned int rightshift, +- unsigned int addrsize, +- bfd_vma relocation); +-@end example +-@strong{Description}@* +-Perform overflow checking on @var{relocation} which has +-@var{bitsize} significant bits and will be shifted right by +-@var{rightshift} bits, on a machine with addresses containing +-@var{addrsize} significant bits. The result is either of +-@code{bfd_reloc_ok} or @code{bfd_reloc_overflow}. +- +-@findex bfd_perform_relocation +-@subsubsection @code{bfd_perform_relocation} +-@strong{Synopsis} +-@example +-bfd_reloc_status_type bfd_perform_relocation +- (bfd *abfd, +- arelent *reloc_entry, +- void *data, +- asection *input_section, +- bfd *output_bfd, +- char **error_message); +-@end example +-@strong{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}. +- +-@findex bfd_install_relocation +-@subsubsection @code{bfd_install_relocation} +-@strong{Synopsis} +-@example +-bfd_reloc_status_type bfd_install_relocation +- (bfd *abfd, +- arelent *reloc_entry, +- void *data, bfd_vma data_start, +- asection *input_section, +- char **error_message); +-@end example +-@strong{Description}@* +-This looks remarkably like @code{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. +- +- +-@node howto manager, , typedef arelent, Relocations +-@subsection 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. +- +-@findex bfd_reloc_code_type +-@subsubsection @code{bfd_reloc_code_type} +-@strong{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 @code{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. +- +-Here are the possible values for @code{enum bfd_reloc_code_real}: +- +-@deffn {} BFD_RELOC_64 +-@deffnx {} BFD_RELOC_32 +-@deffnx {} BFD_RELOC_26 +-@deffnx {} BFD_RELOC_24 +-@deffnx {} BFD_RELOC_16 +-@deffnx {} BFD_RELOC_14 +-@deffnx {} BFD_RELOC_8 +-Basic absolute relocations of N bits. +-@end deffn +-@deffn {} BFD_RELOC_64_PCREL +-@deffnx {} BFD_RELOC_32_PCREL +-@deffnx {} BFD_RELOC_24_PCREL +-@deffnx {} BFD_RELOC_16_PCREL +-@deffnx {} BFD_RELOC_12_PCREL +-@deffnx {} BFD_RELOC_8_PCREL +-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. +-@end deffn +-@deffn {} BFD_RELOC_32_SECREL +-Section relative relocations. Some targets need this for DWARF2. +-@end deffn +-@deffn {} BFD_RELOC_32_GOT_PCREL +-@deffnx {} BFD_RELOC_16_GOT_PCREL +-@deffnx {} BFD_RELOC_8_GOT_PCREL +-@deffnx {} BFD_RELOC_32_GOTOFF +-@deffnx {} BFD_RELOC_16_GOTOFF +-@deffnx {} BFD_RELOC_LO16_GOTOFF +-@deffnx {} BFD_RELOC_HI16_GOTOFF +-@deffnx {} BFD_RELOC_HI16_S_GOTOFF +-@deffnx {} BFD_RELOC_8_GOTOFF +-@deffnx {} BFD_RELOC_64_PLT_PCREL +-@deffnx {} BFD_RELOC_32_PLT_PCREL +-@deffnx {} BFD_RELOC_24_PLT_PCREL +-@deffnx {} BFD_RELOC_16_PLT_PCREL +-@deffnx {} BFD_RELOC_8_PLT_PCREL +-@deffnx {} BFD_RELOC_64_PLTOFF +-@deffnx {} BFD_RELOC_32_PLTOFF +-@deffnx {} BFD_RELOC_16_PLTOFF +-@deffnx {} BFD_RELOC_LO16_PLTOFF +-@deffnx {} BFD_RELOC_HI16_PLTOFF +-@deffnx {} BFD_RELOC_HI16_S_PLTOFF +-@deffnx {} BFD_RELOC_8_PLTOFF +-For ELF. +-@end deffn +-@deffn {} BFD_RELOC_SIZE32 +-@deffnx {} BFD_RELOC_SIZE64 +-Size relocations. +-@end deffn +-@deffn {} BFD_RELOC_68K_GLOB_DAT +-@deffnx {} BFD_RELOC_68K_JMP_SLOT +-@deffnx {} BFD_RELOC_68K_RELATIVE +-@deffnx {} BFD_RELOC_68K_TLS_GD32 +-@deffnx {} BFD_RELOC_68K_TLS_GD16 +-@deffnx {} BFD_RELOC_68K_TLS_GD8 +-@deffnx {} BFD_RELOC_68K_TLS_LDM32 +-@deffnx {} BFD_RELOC_68K_TLS_LDM16 +-@deffnx {} BFD_RELOC_68K_TLS_LDM8 +-@deffnx {} BFD_RELOC_68K_TLS_LDO32 +-@deffnx {} BFD_RELOC_68K_TLS_LDO16 +-@deffnx {} BFD_RELOC_68K_TLS_LDO8 +-@deffnx {} BFD_RELOC_68K_TLS_IE32 +-@deffnx {} BFD_RELOC_68K_TLS_IE16 +-@deffnx {} BFD_RELOC_68K_TLS_IE8 +-@deffnx {} BFD_RELOC_68K_TLS_LE32 +-@deffnx {} BFD_RELOC_68K_TLS_LE16 +-@deffnx {} BFD_RELOC_68K_TLS_LE8 +-Relocations used by 68K ELF. +-@end deffn +-@deffn {} BFD_RELOC_32_BASEREL +-@deffnx {} BFD_RELOC_16_BASEREL +-@deffnx {} BFD_RELOC_LO16_BASEREL +-@deffnx {} BFD_RELOC_HI16_BASEREL +-@deffnx {} BFD_RELOC_HI16_S_BASEREL +-@deffnx {} BFD_RELOC_8_BASEREL +-@deffnx {} BFD_RELOC_RVA +-Linkage-table relative. +-@end deffn +-@deffn {} BFD_RELOC_8_FFnn +-Absolute 8-bit relocation, but used to form an address like 0xFFnn. +-@end deffn +-@deffn {} BFD_RELOC_32_PCREL_S2 +-@deffnx {} BFD_RELOC_16_PCREL_S2 +-@deffnx {} BFD_RELOC_23_PCREL_S2 +-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 <>.) The +-signed 16-bit displacement is used on the MIPS, and the 23-bit +-displacement is used on the Alpha. +-@end deffn +-@deffn {} BFD_RELOC_HI22 +-@deffnx {} BFD_RELOC_LO10 +-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. +-@end deffn +-@deffn {} BFD_RELOC_GPREL16 +-@deffnx {} BFD_RELOC_GPREL32 +-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. +-@end deffn +-@deffn {} BFD_RELOC_I960_CALLJ +-Reloc types used for i960/b.out. +-@end deffn +-@deffn {} BFD_RELOC_NONE +-@deffnx {} BFD_RELOC_SPARC_WDISP22 +-@deffnx {} BFD_RELOC_SPARC22 +-@deffnx {} BFD_RELOC_SPARC13 +-@deffnx {} BFD_RELOC_SPARC_GOT10 +-@deffnx {} BFD_RELOC_SPARC_GOT13 +-@deffnx {} BFD_RELOC_SPARC_GOT22 +-@deffnx {} BFD_RELOC_SPARC_PC10 +-@deffnx {} BFD_RELOC_SPARC_PC22 +-@deffnx {} BFD_RELOC_SPARC_WPLT30 +-@deffnx {} BFD_RELOC_SPARC_COPY +-@deffnx {} BFD_RELOC_SPARC_GLOB_DAT +-@deffnx {} BFD_RELOC_SPARC_JMP_SLOT +-@deffnx {} BFD_RELOC_SPARC_RELATIVE +-@deffnx {} BFD_RELOC_SPARC_UA16 +-@deffnx {} BFD_RELOC_SPARC_UA32 +-@deffnx {} BFD_RELOC_SPARC_UA64 +-@deffnx {} BFD_RELOC_SPARC_GOTDATA_HIX22 +-@deffnx {} BFD_RELOC_SPARC_GOTDATA_LOX10 +-@deffnx {} BFD_RELOC_SPARC_GOTDATA_OP_HIX22 +-@deffnx {} BFD_RELOC_SPARC_GOTDATA_OP_LOX10 +-@deffnx {} BFD_RELOC_SPARC_GOTDATA_OP +-@deffnx {} BFD_RELOC_SPARC_JMP_IREL +-@deffnx {} BFD_RELOC_SPARC_IRELATIVE +-SPARC ELF relocations. There is probably some overlap with other +-relocation types already defined. +-@end deffn +-@deffn {} BFD_RELOC_SPARC_BASE13 +-@deffnx {} BFD_RELOC_SPARC_BASE22 +-I think these are specific to SPARC a.out (e.g., Sun 4). +-@end deffn +-@deffn {} BFD_RELOC_SPARC_64 +-@deffnx {} BFD_RELOC_SPARC_10 +-@deffnx {} BFD_RELOC_SPARC_11 +-@deffnx {} BFD_RELOC_SPARC_OLO10 +-@deffnx {} BFD_RELOC_SPARC_HH22 +-@deffnx {} BFD_RELOC_SPARC_HM10 +-@deffnx {} BFD_RELOC_SPARC_LM22 +-@deffnx {} BFD_RELOC_SPARC_PC_HH22 +-@deffnx {} BFD_RELOC_SPARC_PC_HM10 +-@deffnx {} BFD_RELOC_SPARC_PC_LM22 +-@deffnx {} BFD_RELOC_SPARC_WDISP16 +-@deffnx {} BFD_RELOC_SPARC_WDISP19 +-@deffnx {} BFD_RELOC_SPARC_7 +-@deffnx {} BFD_RELOC_SPARC_6 +-@deffnx {} BFD_RELOC_SPARC_5 +-@deffnx {} BFD_RELOC_SPARC_DISP64 +-@deffnx {} BFD_RELOC_SPARC_PLT32 +-@deffnx {} BFD_RELOC_SPARC_PLT64 +-@deffnx {} BFD_RELOC_SPARC_HIX22 +-@deffnx {} BFD_RELOC_SPARC_LOX10 +-@deffnx {} BFD_RELOC_SPARC_H44 +-@deffnx {} BFD_RELOC_SPARC_M44 +-@deffnx {} BFD_RELOC_SPARC_L44 +-@deffnx {} BFD_RELOC_SPARC_REGISTER +-@deffnx {} BFD_RELOC_SPARC_H34 +-@deffnx {} BFD_RELOC_SPARC_SIZE32 +-@deffnx {} BFD_RELOC_SPARC_SIZE64 +-@deffnx {} BFD_RELOC_SPARC_WDISP10 +-SPARC64 relocations +-@end deffn +-@deffn {} BFD_RELOC_SPARC_REV32 +-SPARC little endian relocation +-@end deffn +-@deffn {} BFD_RELOC_SPARC_TLS_GD_HI22 +-@deffnx {} BFD_RELOC_SPARC_TLS_GD_LO10 +-@deffnx {} BFD_RELOC_SPARC_TLS_GD_ADD +-@deffnx {} BFD_RELOC_SPARC_TLS_GD_CALL +-@deffnx {} BFD_RELOC_SPARC_TLS_LDM_HI22 +-@deffnx {} BFD_RELOC_SPARC_TLS_LDM_LO10 +-@deffnx {} BFD_RELOC_SPARC_TLS_LDM_ADD +-@deffnx {} BFD_RELOC_SPARC_TLS_LDM_CALL +-@deffnx {} BFD_RELOC_SPARC_TLS_LDO_HIX22 +-@deffnx {} BFD_RELOC_SPARC_TLS_LDO_LOX10 +-@deffnx {} BFD_RELOC_SPARC_TLS_LDO_ADD +-@deffnx {} BFD_RELOC_SPARC_TLS_IE_HI22 +-@deffnx {} BFD_RELOC_SPARC_TLS_IE_LO10 +-@deffnx {} BFD_RELOC_SPARC_TLS_IE_LD +-@deffnx {} BFD_RELOC_SPARC_TLS_IE_LDX +-@deffnx {} BFD_RELOC_SPARC_TLS_IE_ADD +-@deffnx {} BFD_RELOC_SPARC_TLS_LE_HIX22 +-@deffnx {} BFD_RELOC_SPARC_TLS_LE_LOX10 +-@deffnx {} BFD_RELOC_SPARC_TLS_DTPMOD32 +-@deffnx {} BFD_RELOC_SPARC_TLS_DTPMOD64 +-@deffnx {} BFD_RELOC_SPARC_TLS_DTPOFF32 +-@deffnx {} BFD_RELOC_SPARC_TLS_DTPOFF64 +-@deffnx {} BFD_RELOC_SPARC_TLS_TPOFF32 +-@deffnx {} BFD_RELOC_SPARC_TLS_TPOFF64 +-SPARC TLS relocations +-@end deffn +-@deffn {} BFD_RELOC_SPU_IMM7 +-@deffnx {} BFD_RELOC_SPU_IMM8 +-@deffnx {} BFD_RELOC_SPU_IMM10 +-@deffnx {} BFD_RELOC_SPU_IMM10W +-@deffnx {} BFD_RELOC_SPU_IMM16 +-@deffnx {} BFD_RELOC_SPU_IMM16W +-@deffnx {} BFD_RELOC_SPU_IMM18 +-@deffnx {} BFD_RELOC_SPU_PCREL9a +-@deffnx {} BFD_RELOC_SPU_PCREL9b +-@deffnx {} BFD_RELOC_SPU_PCREL16 +-@deffnx {} BFD_RELOC_SPU_LO16 +-@deffnx {} BFD_RELOC_SPU_HI16 +-@deffnx {} BFD_RELOC_SPU_PPU32 +-@deffnx {} BFD_RELOC_SPU_PPU64 +-@deffnx {} BFD_RELOC_SPU_ADD_PIC +-SPU Relocations. +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_GPDISP_HI16 +-Alpha ECOFF and ELF 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). +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_GPDISP_LO16 +-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. +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_GPDISP +-The ELF GPDISP relocation is exactly the same as the GPDISP_HI16 +-relocation except that there is no accompanying GPDISP_LO16 +-relocation. +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_LITERAL +-@deffnx {} BFD_RELOC_ALPHA_ELF_LITERAL +-@deffnx {} BFD_RELOC_ALPHA_LITUSE +-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 ELF_LITERAL reloc is somewhere between 16_GOTOFF and GPDISP_LO16. +-It should refer to the symbol to be referenced, as with 16_GOTOFF, +-but it generates output not based on the position within the .got +-section, but relative to the GP value chosen for the file during the +-final link stage. +- +-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) +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_HINT +-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. +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_LINKAGE +-The LINKAGE relocation outputs a linkage pair in the object file, +-which is filled by the linker. +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_CODEADDR +-The CODEADDR relocation outputs a STO_CA in the object file, +-which is filled by the linker. +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_GPREL_HI16 +-@deffnx {} BFD_RELOC_ALPHA_GPREL_LO16 +-The GPREL_HI/LO relocations together form a 32-bit offset from the +-GP register. +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_BRSGP +-Like BFD_RELOC_23_PCREL_S2, except that the source and target must +-share a common GP, and the target address is adjusted for +-STO_ALPHA_STD_GPLOAD. +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_NOP +-The NOP relocation outputs a NOP if the longword displacement +-between two procedure entry points is < 2^21. +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_BSR +-The BSR relocation outputs a BSR if the longword displacement +-between two procedure entry points is < 2^21. +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_LDA +-The LDA relocation outputs a LDA if the longword displacement +-between two procedure entry points is < 2^16. +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_BOH +-The BOH relocation outputs a BSR if the longword displacement +-between two procedure entry points is < 2^21, or else a hint. +-@end deffn +-@deffn {} BFD_RELOC_ALPHA_TLSGD +-@deffnx {} BFD_RELOC_ALPHA_TLSLDM +-@deffnx {} BFD_RELOC_ALPHA_DTPMOD64 +-@deffnx {} BFD_RELOC_ALPHA_GOTDTPREL16 +-@deffnx {} BFD_RELOC_ALPHA_DTPREL64 +-@deffnx {} BFD_RELOC_ALPHA_DTPREL_HI16 +-@deffnx {} BFD_RELOC_ALPHA_DTPREL_LO16 +-@deffnx {} BFD_RELOC_ALPHA_DTPREL16 +-@deffnx {} BFD_RELOC_ALPHA_GOTTPREL16 +-@deffnx {} BFD_RELOC_ALPHA_TPREL64 +-@deffnx {} BFD_RELOC_ALPHA_TPREL_HI16 +-@deffnx {} BFD_RELOC_ALPHA_TPREL_LO16 +-@deffnx {} BFD_RELOC_ALPHA_TPREL16 +-Alpha thread-local storage relocations. +-@end deffn +-@deffn {} BFD_RELOC_MIPS_JMP +-@deffnx {} BFD_RELOC_MICROMIPS_JMP +-The MIPS jump instruction. +-@end deffn +-@deffn {} BFD_RELOC_MIPS16_JMP +-The MIPS16 jump instruction. +-@end deffn +-@deffn {} BFD_RELOC_MIPS16_GPREL +-MIPS16 GP relative reloc. +-@end deffn +-@deffn {} BFD_RELOC_HI16 +-High 16 bits of 32-bit value; simple reloc. +-@end deffn +-@deffn {} BFD_RELOC_HI16_S +-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. +-@end deffn +-@deffn {} BFD_RELOC_LO16 +-Low 16 bits. +-@end deffn +-@deffn {} BFD_RELOC_HI16_PCREL +-High 16 bits of 32-bit pc-relative value +-@end deffn +-@deffn {} BFD_RELOC_HI16_S_PCREL +-High 16 bits of 32-bit pc-relative value, adjusted +-@end deffn +-@deffn {} BFD_RELOC_LO16_PCREL +-Low 16 bits of pc-relative value +-@end deffn +-@deffn {} BFD_RELOC_MIPS16_GOT16 +-@deffnx {} BFD_RELOC_MIPS16_CALL16 +-Equivalent of BFD_RELOC_MIPS_*, but with the MIPS16 layout of +-16-bit immediate fields +-@end deffn +-@deffn {} BFD_RELOC_MIPS16_HI16 +-MIPS16 high 16 bits of 32-bit value. +-@end deffn +-@deffn {} BFD_RELOC_MIPS16_HI16_S +-MIPS16 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. +-@end deffn +-@deffn {} BFD_RELOC_MIPS16_LO16 +-MIPS16 low 16 bits. +-@end deffn +-@deffn {} BFD_RELOC_MIPS16_TLS_GD +-@deffnx {} BFD_RELOC_MIPS16_TLS_LDM +-@deffnx {} BFD_RELOC_MIPS16_TLS_DTPREL_HI16 +-@deffnx {} BFD_RELOC_MIPS16_TLS_DTPREL_LO16 +-@deffnx {} BFD_RELOC_MIPS16_TLS_GOTTPREL +-@deffnx {} BFD_RELOC_MIPS16_TLS_TPREL_HI16 +-@deffnx {} BFD_RELOC_MIPS16_TLS_TPREL_LO16 +-MIPS16 TLS relocations +-@end deffn +-@deffn {} BFD_RELOC_MIPS_LITERAL +-@deffnx {} BFD_RELOC_MICROMIPS_LITERAL +-Relocation against a MIPS literal section. +-@end deffn +-@deffn {} BFD_RELOC_MICROMIPS_7_PCREL_S1 +-@deffnx {} BFD_RELOC_MICROMIPS_10_PCREL_S1 +-@deffnx {} BFD_RELOC_MICROMIPS_16_PCREL_S1 +-microMIPS PC-relative relocations. +-@end deffn +-@deffn {} BFD_RELOC_MICROMIPS_GPREL16 +-@deffnx {} BFD_RELOC_MICROMIPS_HI16 +-@deffnx {} BFD_RELOC_MICROMIPS_HI16_S +-@deffnx {} BFD_RELOC_MICROMIPS_LO16 +-microMIPS versions of generic BFD relocs. +-@end deffn +-@deffn {} BFD_RELOC_MIPS_GOT16 +-@deffnx {} BFD_RELOC_MICROMIPS_GOT16 +-@deffnx {} BFD_RELOC_MIPS_CALL16 +-@deffnx {} BFD_RELOC_MICROMIPS_CALL16 +-@deffnx {} BFD_RELOC_MIPS_GOT_HI16 +-@deffnx {} BFD_RELOC_MICROMIPS_GOT_HI16 +-@deffnx {} BFD_RELOC_MIPS_GOT_LO16 +-@deffnx {} BFD_RELOC_MICROMIPS_GOT_LO16 +-@deffnx {} BFD_RELOC_MIPS_CALL_HI16 +-@deffnx {} BFD_RELOC_MICROMIPS_CALL_HI16 +-@deffnx {} BFD_RELOC_MIPS_CALL_LO16 +-@deffnx {} BFD_RELOC_MICROMIPS_CALL_LO16 +-@deffnx {} BFD_RELOC_MIPS_SUB +-@deffnx {} BFD_RELOC_MICROMIPS_SUB +-@deffnx {} BFD_RELOC_MIPS_GOT_PAGE +-@deffnx {} BFD_RELOC_MICROMIPS_GOT_PAGE +-@deffnx {} BFD_RELOC_MIPS_GOT_OFST +-@deffnx {} BFD_RELOC_MICROMIPS_GOT_OFST +-@deffnx {} BFD_RELOC_MIPS_GOT_DISP +-@deffnx {} BFD_RELOC_MICROMIPS_GOT_DISP +-@deffnx {} BFD_RELOC_MIPS_SHIFT5 +-@deffnx {} BFD_RELOC_MIPS_SHIFT6 +-@deffnx {} BFD_RELOC_MIPS_INSERT_A +-@deffnx {} BFD_RELOC_MIPS_INSERT_B +-@deffnx {} BFD_RELOC_MIPS_DELETE +-@deffnx {} BFD_RELOC_MIPS_HIGHEST +-@deffnx {} BFD_RELOC_MICROMIPS_HIGHEST +-@deffnx {} BFD_RELOC_MIPS_HIGHER +-@deffnx {} BFD_RELOC_MICROMIPS_HIGHER +-@deffnx {} BFD_RELOC_MIPS_SCN_DISP +-@deffnx {} BFD_RELOC_MICROMIPS_SCN_DISP +-@deffnx {} BFD_RELOC_MIPS_REL16 +-@deffnx {} BFD_RELOC_MIPS_RELGOT +-@deffnx {} BFD_RELOC_MIPS_JALR +-@deffnx {} BFD_RELOC_MICROMIPS_JALR +-@deffnx {} BFD_RELOC_MIPS_TLS_DTPMOD32 +-@deffnx {} BFD_RELOC_MIPS_TLS_DTPREL32 +-@deffnx {} BFD_RELOC_MIPS_TLS_DTPMOD64 +-@deffnx {} BFD_RELOC_MIPS_TLS_DTPREL64 +-@deffnx {} BFD_RELOC_MIPS_TLS_GD +-@deffnx {} BFD_RELOC_MICROMIPS_TLS_GD +-@deffnx {} BFD_RELOC_MIPS_TLS_LDM +-@deffnx {} BFD_RELOC_MICROMIPS_TLS_LDM +-@deffnx {} BFD_RELOC_MIPS_TLS_DTPREL_HI16 +-@deffnx {} BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16 +-@deffnx {} BFD_RELOC_MIPS_TLS_DTPREL_LO16 +-@deffnx {} BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16 +-@deffnx {} BFD_RELOC_MIPS_TLS_GOTTPREL +-@deffnx {} BFD_RELOC_MICROMIPS_TLS_GOTTPREL +-@deffnx {} BFD_RELOC_MIPS_TLS_TPREL32 +-@deffnx {} BFD_RELOC_MIPS_TLS_TPREL64 +-@deffnx {} BFD_RELOC_MIPS_TLS_TPREL_HI16 +-@deffnx {} BFD_RELOC_MICROMIPS_TLS_TPREL_HI16 +-@deffnx {} BFD_RELOC_MIPS_TLS_TPREL_LO16 +-@deffnx {} BFD_RELOC_MICROMIPS_TLS_TPREL_LO16 +-@deffnx {} BFD_RELOC_MIPS_EH +-MIPS ELF relocations. +-@end deffn +-@deffn {} BFD_RELOC_MIPS_COPY +-@deffnx {} BFD_RELOC_MIPS_JUMP_SLOT +-MIPS ELF relocations (VxWorks and PLT extensions). +-@end deffn +-@deffn {} BFD_RELOC_MOXIE_10_PCREL +-Moxie ELF relocations. +-@end deffn +-@deffn {} BFD_RELOC_FRV_LABEL16 +-@deffnx {} BFD_RELOC_FRV_LABEL24 +-@deffnx {} BFD_RELOC_FRV_LO16 +-@deffnx {} BFD_RELOC_FRV_HI16 +-@deffnx {} BFD_RELOC_FRV_GPREL12 +-@deffnx {} BFD_RELOC_FRV_GPRELU12 +-@deffnx {} BFD_RELOC_FRV_GPREL32 +-@deffnx {} BFD_RELOC_FRV_GPRELHI +-@deffnx {} BFD_RELOC_FRV_GPRELLO +-@deffnx {} BFD_RELOC_FRV_GOT12 +-@deffnx {} BFD_RELOC_FRV_GOTHI +-@deffnx {} BFD_RELOC_FRV_GOTLO +-@deffnx {} BFD_RELOC_FRV_FUNCDESC +-@deffnx {} BFD_RELOC_FRV_FUNCDESC_GOT12 +-@deffnx {} BFD_RELOC_FRV_FUNCDESC_GOTHI +-@deffnx {} BFD_RELOC_FRV_FUNCDESC_GOTLO +-@deffnx {} BFD_RELOC_FRV_FUNCDESC_VALUE +-@deffnx {} BFD_RELOC_FRV_FUNCDESC_GOTOFF12 +-@deffnx {} BFD_RELOC_FRV_FUNCDESC_GOTOFFHI +-@deffnx {} BFD_RELOC_FRV_FUNCDESC_GOTOFFLO +-@deffnx {} BFD_RELOC_FRV_GOTOFF12 +-@deffnx {} BFD_RELOC_FRV_GOTOFFHI +-@deffnx {} BFD_RELOC_FRV_GOTOFFLO +-@deffnx {} BFD_RELOC_FRV_GETTLSOFF +-@deffnx {} BFD_RELOC_FRV_TLSDESC_VALUE +-@deffnx {} BFD_RELOC_FRV_GOTTLSDESC12 +-@deffnx {} BFD_RELOC_FRV_GOTTLSDESCHI +-@deffnx {} BFD_RELOC_FRV_GOTTLSDESCLO +-@deffnx {} BFD_RELOC_FRV_TLSMOFF12 +-@deffnx {} BFD_RELOC_FRV_TLSMOFFHI +-@deffnx {} BFD_RELOC_FRV_TLSMOFFLO +-@deffnx {} BFD_RELOC_FRV_GOTTLSOFF12 +-@deffnx {} BFD_RELOC_FRV_GOTTLSOFFHI +-@deffnx {} BFD_RELOC_FRV_GOTTLSOFFLO +-@deffnx {} BFD_RELOC_FRV_TLSOFF +-@deffnx {} BFD_RELOC_FRV_TLSDESC_RELAX +-@deffnx {} BFD_RELOC_FRV_GETTLSOFF_RELAX +-@deffnx {} BFD_RELOC_FRV_TLSOFF_RELAX +-@deffnx {} BFD_RELOC_FRV_TLSMOFF +-Fujitsu Frv Relocations. +-@end deffn +-@deffn {} BFD_RELOC_MN10300_GOTOFF24 +-This is a 24bit GOT-relative reloc for the mn10300. +-@end deffn +-@deffn {} BFD_RELOC_MN10300_GOT32 +-This is a 32bit GOT-relative reloc for the mn10300, offset by two bytes +-in the instruction. +-@end deffn +-@deffn {} BFD_RELOC_MN10300_GOT24 +-This is a 24bit GOT-relative reloc for the mn10300, offset by two bytes +-in the instruction. +-@end deffn +-@deffn {} BFD_RELOC_MN10300_GOT16 +-This is a 16bit GOT-relative reloc for the mn10300, offset by two bytes +-in the instruction. +-@end deffn +-@deffn {} BFD_RELOC_MN10300_COPY +-Copy symbol at runtime. +-@end deffn +-@deffn {} BFD_RELOC_MN10300_GLOB_DAT +-Create GOT entry. +-@end deffn +-@deffn {} BFD_RELOC_MN10300_JMP_SLOT +-Create PLT entry. +-@end deffn +-@deffn {} BFD_RELOC_MN10300_RELATIVE +-Adjust by program base. +-@end deffn +-@deffn {} BFD_RELOC_MN10300_SYM_DIFF +-Together with another reloc targeted at the same location, +-allows for a value that is the difference of two symbols +-in the same section. +-@end deffn +-@deffn {} BFD_RELOC_MN10300_ALIGN +-The addend of this reloc is an alignment power that must +-be honoured at the offset's location, regardless of linker +-relaxation. +-@end deffn +-@deffn {} BFD_RELOC_MN10300_TLS_GD +-@deffnx {} BFD_RELOC_MN10300_TLS_LD +-@deffnx {} BFD_RELOC_MN10300_TLS_LDO +-@deffnx {} BFD_RELOC_MN10300_TLS_GOTIE +-@deffnx {} BFD_RELOC_MN10300_TLS_IE +-@deffnx {} BFD_RELOC_MN10300_TLS_LE +-@deffnx {} BFD_RELOC_MN10300_TLS_DTPMOD +-@deffnx {} BFD_RELOC_MN10300_TLS_DTPOFF +-@deffnx {} BFD_RELOC_MN10300_TLS_TPOFF +-Various TLS-related relocations. +-@end deffn +-@deffn {} BFD_RELOC_MN10300_32_PCREL +-This is a 32bit pcrel reloc for the mn10300, offset by two bytes in the +-instruction. +-@end deffn +-@deffn {} BFD_RELOC_MN10300_16_PCREL +-This is a 16bit pcrel reloc for the mn10300, offset by two bytes in the +-instruction. +-@end deffn +-@deffn {} BFD_RELOC_386_GOT32 +-@deffnx {} BFD_RELOC_386_PLT32 +-@deffnx {} BFD_RELOC_386_COPY +-@deffnx {} BFD_RELOC_386_GLOB_DAT +-@deffnx {} BFD_RELOC_386_JUMP_SLOT +-@deffnx {} BFD_RELOC_386_RELATIVE +-@deffnx {} BFD_RELOC_386_GOTOFF +-@deffnx {} BFD_RELOC_386_GOTPC +-@deffnx {} BFD_RELOC_386_TLS_TPOFF +-@deffnx {} BFD_RELOC_386_TLS_IE +-@deffnx {} BFD_RELOC_386_TLS_GOTIE +-@deffnx {} BFD_RELOC_386_TLS_LE +-@deffnx {} BFD_RELOC_386_TLS_GD +-@deffnx {} BFD_RELOC_386_TLS_LDM +-@deffnx {} BFD_RELOC_386_TLS_LDO_32 +-@deffnx {} BFD_RELOC_386_TLS_IE_32 +-@deffnx {} BFD_RELOC_386_TLS_LE_32 +-@deffnx {} BFD_RELOC_386_TLS_DTPMOD32 +-@deffnx {} BFD_RELOC_386_TLS_DTPOFF32 +-@deffnx {} BFD_RELOC_386_TLS_TPOFF32 +-@deffnx {} BFD_RELOC_386_TLS_GOTDESC +-@deffnx {} BFD_RELOC_386_TLS_DESC_CALL +-@deffnx {} BFD_RELOC_386_TLS_DESC +-@deffnx {} BFD_RELOC_386_IRELATIVE +-i386/elf relocations +-@end deffn +-@deffn {} BFD_RELOC_X86_64_GOT32 +-@deffnx {} BFD_RELOC_X86_64_PLT32 +-@deffnx {} BFD_RELOC_X86_64_COPY +-@deffnx {} BFD_RELOC_X86_64_GLOB_DAT +-@deffnx {} BFD_RELOC_X86_64_JUMP_SLOT +-@deffnx {} BFD_RELOC_X86_64_RELATIVE +-@deffnx {} BFD_RELOC_X86_64_GOTPCREL +-@deffnx {} BFD_RELOC_X86_64_32S +-@deffnx {} BFD_RELOC_X86_64_DTPMOD64 +-@deffnx {} BFD_RELOC_X86_64_DTPOFF64 +-@deffnx {} BFD_RELOC_X86_64_TPOFF64 +-@deffnx {} BFD_RELOC_X86_64_TLSGD +-@deffnx {} BFD_RELOC_X86_64_TLSLD +-@deffnx {} BFD_RELOC_X86_64_DTPOFF32 +-@deffnx {} BFD_RELOC_X86_64_GOTTPOFF +-@deffnx {} BFD_RELOC_X86_64_TPOFF32 +-@deffnx {} BFD_RELOC_X86_64_GOTOFF64 +-@deffnx {} BFD_RELOC_X86_64_GOTPC32 +-@deffnx {} BFD_RELOC_X86_64_GOT64 +-@deffnx {} BFD_RELOC_X86_64_GOTPCREL64 +-@deffnx {} BFD_RELOC_X86_64_GOTPC64 +-@deffnx {} BFD_RELOC_X86_64_GOTPLT64 +-@deffnx {} BFD_RELOC_X86_64_PLTOFF64 +-@deffnx {} BFD_RELOC_X86_64_GOTPC32_TLSDESC +-@deffnx {} BFD_RELOC_X86_64_TLSDESC_CALL +-@deffnx {} BFD_RELOC_X86_64_TLSDESC +-@deffnx {} BFD_RELOC_X86_64_IRELATIVE +-@deffnx {} BFD_RELOC_X86_64_PC32_BND +-@deffnx {} BFD_RELOC_X86_64_PLT32_BND +-x86-64/elf relocations +-@end deffn +-@deffn {} BFD_RELOC_NS32K_IMM_8 +-@deffnx {} BFD_RELOC_NS32K_IMM_16 +-@deffnx {} BFD_RELOC_NS32K_IMM_32 +-@deffnx {} BFD_RELOC_NS32K_IMM_8_PCREL +-@deffnx {} BFD_RELOC_NS32K_IMM_16_PCREL +-@deffnx {} BFD_RELOC_NS32K_IMM_32_PCREL +-@deffnx {} BFD_RELOC_NS32K_DISP_8 +-@deffnx {} BFD_RELOC_NS32K_DISP_16 +-@deffnx {} BFD_RELOC_NS32K_DISP_32 +-@deffnx {} BFD_RELOC_NS32K_DISP_8_PCREL +-@deffnx {} BFD_RELOC_NS32K_DISP_16_PCREL +-@deffnx {} BFD_RELOC_NS32K_DISP_32_PCREL +-ns32k relocations +-@end deffn +-@deffn {} BFD_RELOC_PDP11_DISP_8_PCREL +-@deffnx {} BFD_RELOC_PDP11_DISP_6_PCREL +-PDP11 relocations +-@end deffn +-@deffn {} BFD_RELOC_PJ_CODE_HI16 +-@deffnx {} BFD_RELOC_PJ_CODE_LO16 +-@deffnx {} BFD_RELOC_PJ_CODE_DIR16 +-@deffnx {} BFD_RELOC_PJ_CODE_DIR32 +-@deffnx {} BFD_RELOC_PJ_CODE_REL16 +-@deffnx {} BFD_RELOC_PJ_CODE_REL32 +-Picojava relocs. Not all of these appear in object files. +-@end deffn +-@deffn {} BFD_RELOC_PPC_B26 +-@deffnx {} BFD_RELOC_PPC_BA26 +-@deffnx {} BFD_RELOC_PPC_TOC16 +-@deffnx {} BFD_RELOC_PPC_B16 +-@deffnx {} BFD_RELOC_PPC_B16_BRTAKEN +-@deffnx {} BFD_RELOC_PPC_B16_BRNTAKEN +-@deffnx {} BFD_RELOC_PPC_BA16 +-@deffnx {} BFD_RELOC_PPC_BA16_BRTAKEN +-@deffnx {} BFD_RELOC_PPC_BA16_BRNTAKEN +-@deffnx {} BFD_RELOC_PPC_COPY +-@deffnx {} BFD_RELOC_PPC_GLOB_DAT +-@deffnx {} BFD_RELOC_PPC_JMP_SLOT +-@deffnx {} BFD_RELOC_PPC_RELATIVE +-@deffnx {} BFD_RELOC_PPC_LOCAL24PC +-@deffnx {} BFD_RELOC_PPC_EMB_NADDR32 +-@deffnx {} BFD_RELOC_PPC_EMB_NADDR16 +-@deffnx {} BFD_RELOC_PPC_EMB_NADDR16_LO +-@deffnx {} BFD_RELOC_PPC_EMB_NADDR16_HI +-@deffnx {} BFD_RELOC_PPC_EMB_NADDR16_HA +-@deffnx {} BFD_RELOC_PPC_EMB_SDAI16 +-@deffnx {} BFD_RELOC_PPC_EMB_SDA2I16 +-@deffnx {} BFD_RELOC_PPC_EMB_SDA2REL +-@deffnx {} BFD_RELOC_PPC_EMB_SDA21 +-@deffnx {} BFD_RELOC_PPC_EMB_MRKREF +-@deffnx {} BFD_RELOC_PPC_EMB_RELSEC16 +-@deffnx {} BFD_RELOC_PPC_EMB_RELST_LO +-@deffnx {} BFD_RELOC_PPC_EMB_RELST_HI +-@deffnx {} BFD_RELOC_PPC_EMB_RELST_HA +-@deffnx {} BFD_RELOC_PPC_EMB_BIT_FLD +-@deffnx {} BFD_RELOC_PPC_EMB_RELSDA +-@deffnx {} BFD_RELOC_PPC_VLE_REL8 +-@deffnx {} BFD_RELOC_PPC_VLE_REL15 +-@deffnx {} BFD_RELOC_PPC_VLE_REL24 +-@deffnx {} BFD_RELOC_PPC_VLE_LO16A +-@deffnx {} BFD_RELOC_PPC_VLE_LO16D +-@deffnx {} BFD_RELOC_PPC_VLE_HI16A +-@deffnx {} BFD_RELOC_PPC_VLE_HI16D +-@deffnx {} BFD_RELOC_PPC_VLE_HA16A +-@deffnx {} BFD_RELOC_PPC_VLE_HA16D +-@deffnx {} BFD_RELOC_PPC_VLE_SDA21 +-@deffnx {} BFD_RELOC_PPC_VLE_SDA21_LO +-@deffnx {} BFD_RELOC_PPC_VLE_SDAREL_LO16A +-@deffnx {} BFD_RELOC_PPC_VLE_SDAREL_LO16D +-@deffnx {} BFD_RELOC_PPC_VLE_SDAREL_HI16A +-@deffnx {} BFD_RELOC_PPC_VLE_SDAREL_HI16D +-@deffnx {} BFD_RELOC_PPC_VLE_SDAREL_HA16A +-@deffnx {} BFD_RELOC_PPC_VLE_SDAREL_HA16D +-@deffnx {} BFD_RELOC_PPC64_HIGHER +-@deffnx {} BFD_RELOC_PPC64_HIGHER_S +-@deffnx {} BFD_RELOC_PPC64_HIGHEST +-@deffnx {} BFD_RELOC_PPC64_HIGHEST_S +-@deffnx {} BFD_RELOC_PPC64_TOC16_LO +-@deffnx {} BFD_RELOC_PPC64_TOC16_HI +-@deffnx {} BFD_RELOC_PPC64_TOC16_HA +-@deffnx {} BFD_RELOC_PPC64_TOC +-@deffnx {} BFD_RELOC_PPC64_PLTGOT16 +-@deffnx {} BFD_RELOC_PPC64_PLTGOT16_LO +-@deffnx {} BFD_RELOC_PPC64_PLTGOT16_HI +-@deffnx {} BFD_RELOC_PPC64_PLTGOT16_HA +-@deffnx {} BFD_RELOC_PPC64_ADDR16_DS +-@deffnx {} BFD_RELOC_PPC64_ADDR16_LO_DS +-@deffnx {} BFD_RELOC_PPC64_GOT16_DS +-@deffnx {} BFD_RELOC_PPC64_GOT16_LO_DS +-@deffnx {} BFD_RELOC_PPC64_PLT16_LO_DS +-@deffnx {} BFD_RELOC_PPC64_SECTOFF_DS +-@deffnx {} BFD_RELOC_PPC64_SECTOFF_LO_DS +-@deffnx {} BFD_RELOC_PPC64_TOC16_DS +-@deffnx {} BFD_RELOC_PPC64_TOC16_LO_DS +-@deffnx {} BFD_RELOC_PPC64_PLTGOT16_DS +-@deffnx {} BFD_RELOC_PPC64_PLTGOT16_LO_DS +-@deffnx {} BFD_RELOC_PPC64_ADDR16_HIGH +-@deffnx {} BFD_RELOC_PPC64_ADDR16_HIGHA +-Power(rs6000) and PowerPC relocations. +-@end deffn +-@deffn {} BFD_RELOC_PPC_TLS +-@deffnx {} BFD_RELOC_PPC_TLSGD +-@deffnx {} BFD_RELOC_PPC_TLSLD +-@deffnx {} BFD_RELOC_PPC_DTPMOD +-@deffnx {} BFD_RELOC_PPC_TPREL16 +-@deffnx {} BFD_RELOC_PPC_TPREL16_LO +-@deffnx {} BFD_RELOC_PPC_TPREL16_HI +-@deffnx {} BFD_RELOC_PPC_TPREL16_HA +-@deffnx {} BFD_RELOC_PPC_TPREL +-@deffnx {} BFD_RELOC_PPC_DTPREL16 +-@deffnx {} BFD_RELOC_PPC_DTPREL16_LO +-@deffnx {} BFD_RELOC_PPC_DTPREL16_HI +-@deffnx {} BFD_RELOC_PPC_DTPREL16_HA +-@deffnx {} BFD_RELOC_PPC_DTPREL +-@deffnx {} BFD_RELOC_PPC_GOT_TLSGD16 +-@deffnx {} BFD_RELOC_PPC_GOT_TLSGD16_LO +-@deffnx {} BFD_RELOC_PPC_GOT_TLSGD16_HI +-@deffnx {} BFD_RELOC_PPC_GOT_TLSGD16_HA +-@deffnx {} BFD_RELOC_PPC_GOT_TLSLD16 +-@deffnx {} BFD_RELOC_PPC_GOT_TLSLD16_LO +-@deffnx {} BFD_RELOC_PPC_GOT_TLSLD16_HI +-@deffnx {} BFD_RELOC_PPC_GOT_TLSLD16_HA +-@deffnx {} BFD_RELOC_PPC_GOT_TPREL16 +-@deffnx {} BFD_RELOC_PPC_GOT_TPREL16_LO +-@deffnx {} BFD_RELOC_PPC_GOT_TPREL16_HI +-@deffnx {} BFD_RELOC_PPC_GOT_TPREL16_HA +-@deffnx {} BFD_RELOC_PPC_GOT_DTPREL16 +-@deffnx {} BFD_RELOC_PPC_GOT_DTPREL16_LO +-@deffnx {} BFD_RELOC_PPC_GOT_DTPREL16_HI +-@deffnx {} BFD_RELOC_PPC_GOT_DTPREL16_HA +-@deffnx {} BFD_RELOC_PPC64_TPREL16_DS +-@deffnx {} BFD_RELOC_PPC64_TPREL16_LO_DS +-@deffnx {} BFD_RELOC_PPC64_TPREL16_HIGHER +-@deffnx {} BFD_RELOC_PPC64_TPREL16_HIGHERA +-@deffnx {} BFD_RELOC_PPC64_TPREL16_HIGHEST +-@deffnx {} BFD_RELOC_PPC64_TPREL16_HIGHESTA +-@deffnx {} BFD_RELOC_PPC64_DTPREL16_DS +-@deffnx {} BFD_RELOC_PPC64_DTPREL16_LO_DS +-@deffnx {} BFD_RELOC_PPC64_DTPREL16_HIGHER +-@deffnx {} BFD_RELOC_PPC64_DTPREL16_HIGHERA +-@deffnx {} BFD_RELOC_PPC64_DTPREL16_HIGHEST +-@deffnx {} BFD_RELOC_PPC64_DTPREL16_HIGHESTA +-@deffnx {} BFD_RELOC_PPC64_TPREL16_HIGH +-@deffnx {} BFD_RELOC_PPC64_TPREL16_HIGHA +-@deffnx {} BFD_RELOC_PPC64_DTPREL16_HIGH +-@deffnx {} BFD_RELOC_PPC64_DTPREL16_HIGHA +-PowerPC and PowerPC64 thread-local storage relocations. +-@end deffn +-@deffn {} BFD_RELOC_I370_D12 +-IBM 370/390 relocations +-@end deffn +-@deffn {} BFD_RELOC_CTOR +-The type of reloc used to build a constructor 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. +-@end deffn +-@deffn {} BFD_RELOC_ARM_PCREL_BRANCH +-ARM 26 bit pc-relative branch. The lowest two bits must be zero and are +-not stored in the instruction. +-@end deffn +-@deffn {} BFD_RELOC_ARM_PCREL_BLX +-ARM 26 bit pc-relative branch. The lowest bit must be zero and is +-not stored in the instruction. The 2nd lowest bit comes from a 1 bit +-field in the instruction. +-@end deffn +-@deffn {} BFD_RELOC_THUMB_PCREL_BLX +-Thumb 22 bit pc-relative branch. The lowest bit must be zero and is +-not stored in the instruction. The 2nd lowest bit comes from a 1 bit +-field in the instruction. +-@end deffn +-@deffn {} BFD_RELOC_ARM_PCREL_CALL +-ARM 26-bit pc-relative branch for an unconditional BL or BLX instruction. +-@end deffn +-@deffn {} BFD_RELOC_ARM_PCREL_JUMP +-ARM 26-bit pc-relative branch for B or conditional BL instruction. +-@end deffn +-@deffn {} BFD_RELOC_THUMB_PCREL_BRANCH7 +-@deffnx {} BFD_RELOC_THUMB_PCREL_BRANCH9 +-@deffnx {} BFD_RELOC_THUMB_PCREL_BRANCH12 +-@deffnx {} BFD_RELOC_THUMB_PCREL_BRANCH20 +-@deffnx {} BFD_RELOC_THUMB_PCREL_BRANCH23 +-@deffnx {} BFD_RELOC_THUMB_PCREL_BRANCH25 +-Thumb 7-, 9-, 12-, 20-, 23-, and 25-bit pc-relative branches. +-The lowest bit must be zero and is not stored in the instruction. +-Note that the corresponding ELF R_ARM_THM_JUMPnn constant has an +-"nn" one smaller in all cases. Note further that BRANCH23 +-corresponds to R_ARM_THM_CALL. +-@end deffn +-@deffn {} BFD_RELOC_ARM_OFFSET_IMM +-12-bit immediate offset, used in ARM-format ldr and str instructions. +-@end deffn +-@deffn {} BFD_RELOC_ARM_THUMB_OFFSET +-5-bit immediate offset, used in Thumb-format ldr and str instructions. +-@end deffn +-@deffn {} BFD_RELOC_ARM_TARGET1 +-Pc-relative or absolute relocation depending on target. Used for +-entries in .init_array sections. +-@end deffn +-@deffn {} BFD_RELOC_ARM_ROSEGREL32 +-Read-only segment base relative address. +-@end deffn +-@deffn {} BFD_RELOC_ARM_SBREL32 +-Data segment base relative address. +-@end deffn +-@deffn {} BFD_RELOC_ARM_TARGET2 +-This reloc is used for references to RTTI data from exception handling +-tables. The actual definition depends on the target. It may be a +-pc-relative or some form of GOT-indirect relocation. +-@end deffn +-@deffn {} BFD_RELOC_ARM_PREL31 +-31-bit PC relative address. +-@end deffn +-@deffn {} BFD_RELOC_ARM_MOVW +-@deffnx {} BFD_RELOC_ARM_MOVT +-@deffnx {} BFD_RELOC_ARM_MOVW_PCREL +-@deffnx {} BFD_RELOC_ARM_MOVT_PCREL +-@deffnx {} BFD_RELOC_ARM_THUMB_MOVW +-@deffnx {} BFD_RELOC_ARM_THUMB_MOVT +-@deffnx {} BFD_RELOC_ARM_THUMB_MOVW_PCREL +-@deffnx {} BFD_RELOC_ARM_THUMB_MOVT_PCREL +-Low and High halfword relocations for MOVW and MOVT instructions. +-@end deffn +-@deffn {} BFD_RELOC_ARM_JUMP_SLOT +-@deffnx {} BFD_RELOC_ARM_GLOB_DAT +-@deffnx {} BFD_RELOC_ARM_GOT32 +-@deffnx {} BFD_RELOC_ARM_PLT32 +-@deffnx {} BFD_RELOC_ARM_RELATIVE +-@deffnx {} BFD_RELOC_ARM_GOTOFF +-@deffnx {} BFD_RELOC_ARM_GOTPC +-@deffnx {} BFD_RELOC_ARM_GOT_PREL +-Relocations for setting up GOTs and PLTs for shared libraries. +-@end deffn +-@deffn {} BFD_RELOC_ARM_TLS_GD32 +-@deffnx {} BFD_RELOC_ARM_TLS_LDO32 +-@deffnx {} BFD_RELOC_ARM_TLS_LDM32 +-@deffnx {} BFD_RELOC_ARM_TLS_DTPOFF32 +-@deffnx {} BFD_RELOC_ARM_TLS_DTPMOD32 +-@deffnx {} BFD_RELOC_ARM_TLS_TPOFF32 +-@deffnx {} BFD_RELOC_ARM_TLS_IE32 +-@deffnx {} BFD_RELOC_ARM_TLS_LE32 +-@deffnx {} BFD_RELOC_ARM_TLS_GOTDESC +-@deffnx {} BFD_RELOC_ARM_TLS_CALL +-@deffnx {} BFD_RELOC_ARM_THM_TLS_CALL +-@deffnx {} BFD_RELOC_ARM_TLS_DESCSEQ +-@deffnx {} BFD_RELOC_ARM_THM_TLS_DESCSEQ +-@deffnx {} BFD_RELOC_ARM_TLS_DESC +-ARM thread-local storage relocations. +-@end deffn +-@deffn {} BFD_RELOC_ARM_ALU_PC_G0_NC +-@deffnx {} BFD_RELOC_ARM_ALU_PC_G0 +-@deffnx {} BFD_RELOC_ARM_ALU_PC_G1_NC +-@deffnx {} BFD_RELOC_ARM_ALU_PC_G1 +-@deffnx {} BFD_RELOC_ARM_ALU_PC_G2 +-@deffnx {} BFD_RELOC_ARM_LDR_PC_G0 +-@deffnx {} BFD_RELOC_ARM_LDR_PC_G1 +-@deffnx {} BFD_RELOC_ARM_LDR_PC_G2 +-@deffnx {} BFD_RELOC_ARM_LDRS_PC_G0 +-@deffnx {} BFD_RELOC_ARM_LDRS_PC_G1 +-@deffnx {} BFD_RELOC_ARM_LDRS_PC_G2 +-@deffnx {} BFD_RELOC_ARM_LDC_PC_G0 +-@deffnx {} BFD_RELOC_ARM_LDC_PC_G1 +-@deffnx {} BFD_RELOC_ARM_LDC_PC_G2 +-@deffnx {} BFD_RELOC_ARM_ALU_SB_G0_NC +-@deffnx {} BFD_RELOC_ARM_ALU_SB_G0 +-@deffnx {} BFD_RELOC_ARM_ALU_SB_G1_NC +-@deffnx {} BFD_RELOC_ARM_ALU_SB_G1 +-@deffnx {} BFD_RELOC_ARM_ALU_SB_G2 +-@deffnx {} BFD_RELOC_ARM_LDR_SB_G0 +-@deffnx {} BFD_RELOC_ARM_LDR_SB_G1 +-@deffnx {} BFD_RELOC_ARM_LDR_SB_G2 +-@deffnx {} BFD_RELOC_ARM_LDRS_SB_G0 +-@deffnx {} BFD_RELOC_ARM_LDRS_SB_G1 +-@deffnx {} BFD_RELOC_ARM_LDRS_SB_G2 +-@deffnx {} BFD_RELOC_ARM_LDC_SB_G0 +-@deffnx {} BFD_RELOC_ARM_LDC_SB_G1 +-@deffnx {} BFD_RELOC_ARM_LDC_SB_G2 +-ARM group relocations. +-@end deffn +-@deffn {} BFD_RELOC_ARM_V4BX +-Annotation of BX instructions. +-@end deffn +-@deffn {} BFD_RELOC_ARM_IRELATIVE +-ARM support for STT_GNU_IFUNC. +-@end deffn +-@deffn {} BFD_RELOC_ARM_IMMEDIATE +-@deffnx {} BFD_RELOC_ARM_ADRL_IMMEDIATE +-@deffnx {} BFD_RELOC_ARM_T32_IMMEDIATE +-@deffnx {} BFD_RELOC_ARM_T32_ADD_IMM +-@deffnx {} BFD_RELOC_ARM_T32_IMM12 +-@deffnx {} BFD_RELOC_ARM_T32_ADD_PC12 +-@deffnx {} BFD_RELOC_ARM_SHIFT_IMM +-@deffnx {} BFD_RELOC_ARM_SMC +-@deffnx {} BFD_RELOC_ARM_HVC +-@deffnx {} BFD_RELOC_ARM_SWI +-@deffnx {} BFD_RELOC_ARM_MULTI +-@deffnx {} BFD_RELOC_ARM_CP_OFF_IMM +-@deffnx {} BFD_RELOC_ARM_CP_OFF_IMM_S2 +-@deffnx {} BFD_RELOC_ARM_T32_CP_OFF_IMM +-@deffnx {} BFD_RELOC_ARM_T32_CP_OFF_IMM_S2 +-@deffnx {} BFD_RELOC_ARM_ADR_IMM +-@deffnx {} BFD_RELOC_ARM_LDR_IMM +-@deffnx {} BFD_RELOC_ARM_LITERAL +-@deffnx {} BFD_RELOC_ARM_IN_POOL +-@deffnx {} BFD_RELOC_ARM_OFFSET_IMM8 +-@deffnx {} BFD_RELOC_ARM_T32_OFFSET_U8 +-@deffnx {} BFD_RELOC_ARM_T32_OFFSET_IMM +-@deffnx {} BFD_RELOC_ARM_HWLITERAL +-@deffnx {} BFD_RELOC_ARM_THUMB_ADD +-@deffnx {} BFD_RELOC_ARM_THUMB_IMM +-@deffnx {} BFD_RELOC_ARM_THUMB_SHIFT +-These relocs are only used within the ARM assembler. They are not +-(at present) written to any object files. +-@end deffn +-@deffn {} BFD_RELOC_SH_PCDISP8BY2 +-@deffnx {} BFD_RELOC_SH_PCDISP12BY2 +-@deffnx {} BFD_RELOC_SH_IMM3 +-@deffnx {} BFD_RELOC_SH_IMM3U +-@deffnx {} BFD_RELOC_SH_DISP12 +-@deffnx {} BFD_RELOC_SH_DISP12BY2 +-@deffnx {} BFD_RELOC_SH_DISP12BY4 +-@deffnx {} BFD_RELOC_SH_DISP12BY8 +-@deffnx {} BFD_RELOC_SH_DISP20 +-@deffnx {} BFD_RELOC_SH_DISP20BY8 +-@deffnx {} BFD_RELOC_SH_IMM4 +-@deffnx {} BFD_RELOC_SH_IMM4BY2 +-@deffnx {} BFD_RELOC_SH_IMM4BY4 +-@deffnx {} BFD_RELOC_SH_IMM8 +-@deffnx {} BFD_RELOC_SH_IMM8BY2 +-@deffnx {} BFD_RELOC_SH_IMM8BY4 +-@deffnx {} BFD_RELOC_SH_PCRELIMM8BY2 +-@deffnx {} BFD_RELOC_SH_PCRELIMM8BY4 +-@deffnx {} BFD_RELOC_SH_SWITCH16 +-@deffnx {} BFD_RELOC_SH_SWITCH32 +-@deffnx {} BFD_RELOC_SH_USES +-@deffnx {} BFD_RELOC_SH_COUNT +-@deffnx {} BFD_RELOC_SH_ALIGN +-@deffnx {} BFD_RELOC_SH_CODE +-@deffnx {} BFD_RELOC_SH_DATA +-@deffnx {} BFD_RELOC_SH_LABEL +-@deffnx {} BFD_RELOC_SH_LOOP_START +-@deffnx {} BFD_RELOC_SH_LOOP_END +-@deffnx {} BFD_RELOC_SH_COPY +-@deffnx {} BFD_RELOC_SH_GLOB_DAT +-@deffnx {} BFD_RELOC_SH_JMP_SLOT +-@deffnx {} BFD_RELOC_SH_RELATIVE +-@deffnx {} BFD_RELOC_SH_GOTPC +-@deffnx {} BFD_RELOC_SH_GOT_LOW16 +-@deffnx {} BFD_RELOC_SH_GOT_MEDLOW16 +-@deffnx {} BFD_RELOC_SH_GOT_MEDHI16 +-@deffnx {} BFD_RELOC_SH_GOT_HI16 +-@deffnx {} BFD_RELOC_SH_GOTPLT_LOW16 +-@deffnx {} BFD_RELOC_SH_GOTPLT_MEDLOW16 +-@deffnx {} BFD_RELOC_SH_GOTPLT_MEDHI16 +-@deffnx {} BFD_RELOC_SH_GOTPLT_HI16 +-@deffnx {} BFD_RELOC_SH_PLT_LOW16 +-@deffnx {} BFD_RELOC_SH_PLT_MEDLOW16 +-@deffnx {} BFD_RELOC_SH_PLT_MEDHI16 +-@deffnx {} BFD_RELOC_SH_PLT_HI16 +-@deffnx {} BFD_RELOC_SH_GOTOFF_LOW16 +-@deffnx {} BFD_RELOC_SH_GOTOFF_MEDLOW16 +-@deffnx {} BFD_RELOC_SH_GOTOFF_MEDHI16 +-@deffnx {} BFD_RELOC_SH_GOTOFF_HI16 +-@deffnx {} BFD_RELOC_SH_GOTPC_LOW16 +-@deffnx {} BFD_RELOC_SH_GOTPC_MEDLOW16 +-@deffnx {} BFD_RELOC_SH_GOTPC_MEDHI16 +-@deffnx {} BFD_RELOC_SH_GOTPC_HI16 +-@deffnx {} BFD_RELOC_SH_COPY64 +-@deffnx {} BFD_RELOC_SH_GLOB_DAT64 +-@deffnx {} BFD_RELOC_SH_JMP_SLOT64 +-@deffnx {} BFD_RELOC_SH_RELATIVE64 +-@deffnx {} BFD_RELOC_SH_GOT10BY4 +-@deffnx {} BFD_RELOC_SH_GOT10BY8 +-@deffnx {} BFD_RELOC_SH_GOTPLT10BY4 +-@deffnx {} BFD_RELOC_SH_GOTPLT10BY8 +-@deffnx {} BFD_RELOC_SH_GOTPLT32 +-@deffnx {} BFD_RELOC_SH_SHMEDIA_CODE +-@deffnx {} BFD_RELOC_SH_IMMU5 +-@deffnx {} BFD_RELOC_SH_IMMS6 +-@deffnx {} BFD_RELOC_SH_IMMS6BY32 +-@deffnx {} BFD_RELOC_SH_IMMU6 +-@deffnx {} BFD_RELOC_SH_IMMS10 +-@deffnx {} BFD_RELOC_SH_IMMS10BY2 +-@deffnx {} BFD_RELOC_SH_IMMS10BY4 +-@deffnx {} BFD_RELOC_SH_IMMS10BY8 +-@deffnx {} BFD_RELOC_SH_IMMS16 +-@deffnx {} BFD_RELOC_SH_IMMU16 +-@deffnx {} BFD_RELOC_SH_IMM_LOW16 +-@deffnx {} BFD_RELOC_SH_IMM_LOW16_PCREL +-@deffnx {} BFD_RELOC_SH_IMM_MEDLOW16 +-@deffnx {} BFD_RELOC_SH_IMM_MEDLOW16_PCREL +-@deffnx {} BFD_RELOC_SH_IMM_MEDHI16 +-@deffnx {} BFD_RELOC_SH_IMM_MEDHI16_PCREL +-@deffnx {} BFD_RELOC_SH_IMM_HI16 +-@deffnx {} BFD_RELOC_SH_IMM_HI16_PCREL +-@deffnx {} BFD_RELOC_SH_PT_16 +-@deffnx {} BFD_RELOC_SH_TLS_GD_32 +-@deffnx {} BFD_RELOC_SH_TLS_LD_32 +-@deffnx {} BFD_RELOC_SH_TLS_LDO_32 +-@deffnx {} BFD_RELOC_SH_TLS_IE_32 +-@deffnx {} BFD_RELOC_SH_TLS_LE_32 +-@deffnx {} BFD_RELOC_SH_TLS_DTPMOD32 +-@deffnx {} BFD_RELOC_SH_TLS_DTPOFF32 +-@deffnx {} BFD_RELOC_SH_TLS_TPOFF32 +-@deffnx {} BFD_RELOC_SH_GOT20 +-@deffnx {} BFD_RELOC_SH_GOTOFF20 +-@deffnx {} BFD_RELOC_SH_GOTFUNCDESC +-@deffnx {} BFD_RELOC_SH_GOTFUNCDESC20 +-@deffnx {} BFD_RELOC_SH_GOTOFFFUNCDESC +-@deffnx {} BFD_RELOC_SH_GOTOFFFUNCDESC20 +-@deffnx {} BFD_RELOC_SH_FUNCDESC +-Renesas / SuperH SH relocs. Not all of these appear in object files. +-@end deffn +-@deffn {} BFD_RELOC_ARC_B22_PCREL +-ARC Cores relocs. +-ARC 22 bit pc-relative branch. The lowest two bits must be zero and are +-not stored in the instruction. The high 20 bits are installed in bits 26 +-through 7 of the instruction. +-@end deffn +-@deffn {} BFD_RELOC_ARC_B26 +-ARC 26 bit absolute branch. The lowest two bits must be zero and are not +-stored in the instruction. The high 24 bits are installed in bits 23 +-through 0. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_16_IMM +-ADI Blackfin 16 bit immediate absolute reloc. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_16_HIGH +-ADI Blackfin 16 bit immediate absolute reloc higher 16 bits. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_4_PCREL +-ADI Blackfin 'a' part of LSETUP. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_5_PCREL +-ADI Blackfin. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_16_LOW +-ADI Blackfin 16 bit immediate absolute reloc lower 16 bits. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_10_PCREL +-ADI Blackfin. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_11_PCREL +-ADI Blackfin 'b' part of LSETUP. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_12_PCREL_JUMP +-ADI Blackfin. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_12_PCREL_JUMP_S +-ADI Blackfin Short jump, pcrel. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_24_PCREL_CALL_X +-ADI Blackfin Call.x not implemented. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_24_PCREL_JUMP_L +-ADI Blackfin Long Jump pcrel. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_GOT17M4 +-@deffnx {} BFD_RELOC_BFIN_GOTHI +-@deffnx {} BFD_RELOC_BFIN_GOTLO +-@deffnx {} BFD_RELOC_BFIN_FUNCDESC +-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_GOT17M4 +-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_GOTHI +-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_GOTLO +-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_VALUE +-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_GOTOFF17M4 +-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_GOTOFFHI +-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_GOTOFFLO +-@deffnx {} BFD_RELOC_BFIN_GOTOFF17M4 +-@deffnx {} BFD_RELOC_BFIN_GOTOFFHI +-@deffnx {} BFD_RELOC_BFIN_GOTOFFLO +-ADI Blackfin FD-PIC relocations. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_GOT +-ADI Blackfin GOT relocation. +-@end deffn +-@deffn {} BFD_RELOC_BFIN_PLTPC +-ADI Blackfin PLTPC relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_PUSH +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_CONST +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_ADD +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_SUB +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_MULT +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_DIV +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_MOD +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_LSHIFT +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_RSHIFT +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_AND +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_OR +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_XOR +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_LAND +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_LOR +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_LEN +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_NEG +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_COMP +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_PAGE +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_HWPAGE +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_ARELOC_BFIN_ADDR +-ADI Blackfin arithmetic relocation. +-@end deffn +-@deffn {} BFD_RELOC_D10V_10_PCREL_R +-Mitsubishi D10V relocs. +-This is a 10-bit reloc with the right 2 bits +-assumed to be 0. +-@end deffn +-@deffn {} BFD_RELOC_D10V_10_PCREL_L +-Mitsubishi D10V relocs. +-This is a 10-bit reloc with the right 2 bits +-assumed to be 0. This is the same as the previous reloc +-except it is in the left container, i.e., +-shifted left 15 bits. +-@end deffn +-@deffn {} BFD_RELOC_D10V_18 +-This is an 18-bit reloc with the right 2 bits +-assumed to be 0. +-@end deffn +-@deffn {} BFD_RELOC_D10V_18_PCREL +-This is an 18-bit reloc with the right 2 bits +-assumed to be 0. +-@end deffn +-@deffn {} BFD_RELOC_D30V_6 +-Mitsubishi D30V relocs. +-This is a 6-bit absolute reloc. +-@end deffn +-@deffn {} BFD_RELOC_D30V_9_PCREL +-This is a 6-bit pc-relative reloc with +-the right 3 bits assumed to be 0. +-@end deffn +-@deffn {} BFD_RELOC_D30V_9_PCREL_R +-This is a 6-bit pc-relative reloc with +-the right 3 bits assumed to be 0. Same +-as the previous reloc but on the right side +-of the container. +-@end deffn +-@deffn {} BFD_RELOC_D30V_15 +-This is a 12-bit absolute reloc with the +-right 3 bitsassumed to be 0. +-@end deffn +-@deffn {} BFD_RELOC_D30V_15_PCREL +-This is a 12-bit pc-relative reloc with +-the right 3 bits assumed to be 0. +-@end deffn +-@deffn {} BFD_RELOC_D30V_15_PCREL_R +-This is a 12-bit pc-relative reloc with +-the right 3 bits assumed to be 0. Same +-as the previous reloc but on the right side +-of the container. +-@end deffn +-@deffn {} BFD_RELOC_D30V_21 +-This is an 18-bit absolute reloc with +-the right 3 bits assumed to be 0. +-@end deffn +-@deffn {} BFD_RELOC_D30V_21_PCREL +-This is an 18-bit pc-relative reloc with +-the right 3 bits assumed to be 0. +-@end deffn +-@deffn {} BFD_RELOC_D30V_21_PCREL_R +-This is an 18-bit pc-relative reloc with +-the right 3 bits assumed to be 0. Same +-as the previous reloc but on the right side +-of the container. +-@end deffn +-@deffn {} BFD_RELOC_D30V_32 +-This is a 32-bit absolute reloc. +-@end deffn +-@deffn {} BFD_RELOC_D30V_32_PCREL +-This is a 32-bit pc-relative reloc. +-@end deffn +-@deffn {} BFD_RELOC_DLX_HI16_S +-DLX relocs +-@end deffn +-@deffn {} BFD_RELOC_DLX_LO16 +-DLX relocs +-@end deffn +-@deffn {} BFD_RELOC_DLX_JMP26 +-DLX relocs +-@end deffn +-@deffn {} BFD_RELOC_M32C_HI8 +-@deffnx {} BFD_RELOC_M32C_RL_JUMP +-@deffnx {} BFD_RELOC_M32C_RL_1ADDR +-@deffnx {} BFD_RELOC_M32C_RL_2ADDR +-Renesas M16C/M32C Relocations. +-@end deffn +-@deffn {} BFD_RELOC_M32R_24 +-Renesas M32R (formerly Mitsubishi M32R) relocs. +-This is a 24 bit absolute address. +-@end deffn +-@deffn {} BFD_RELOC_M32R_10_PCREL +-This is a 10-bit pc-relative reloc with the right 2 bits assumed to be 0. +-@end deffn +-@deffn {} BFD_RELOC_M32R_18_PCREL +-This is an 18-bit reloc with the right 2 bits assumed to be 0. +-@end deffn +-@deffn {} BFD_RELOC_M32R_26_PCREL +-This is a 26-bit reloc with the right 2 bits assumed to be 0. +-@end deffn +-@deffn {} BFD_RELOC_M32R_HI16_ULO +-This is a 16-bit reloc containing the high 16 bits of an address +-used when the lower 16 bits are treated as unsigned. +-@end deffn +-@deffn {} BFD_RELOC_M32R_HI16_SLO +-This is a 16-bit reloc containing the high 16 bits of an address +-used when the lower 16 bits are treated as signed. +-@end deffn +-@deffn {} BFD_RELOC_M32R_LO16 +-This is a 16-bit reloc containing the lower 16 bits of an address. +-@end deffn +-@deffn {} BFD_RELOC_M32R_SDA16 +-This is a 16-bit reloc containing the small data area offset for use in +-add3, load, and store instructions. +-@end deffn +-@deffn {} BFD_RELOC_M32R_GOT24 +-@deffnx {} BFD_RELOC_M32R_26_PLTREL +-@deffnx {} BFD_RELOC_M32R_COPY +-@deffnx {} BFD_RELOC_M32R_GLOB_DAT +-@deffnx {} BFD_RELOC_M32R_JMP_SLOT +-@deffnx {} BFD_RELOC_M32R_RELATIVE +-@deffnx {} BFD_RELOC_M32R_GOTOFF +-@deffnx {} BFD_RELOC_M32R_GOTOFF_HI_ULO +-@deffnx {} BFD_RELOC_M32R_GOTOFF_HI_SLO +-@deffnx {} BFD_RELOC_M32R_GOTOFF_LO +-@deffnx {} BFD_RELOC_M32R_GOTPC24 +-@deffnx {} BFD_RELOC_M32R_GOT16_HI_ULO +-@deffnx {} BFD_RELOC_M32R_GOT16_HI_SLO +-@deffnx {} BFD_RELOC_M32R_GOT16_LO +-@deffnx {} BFD_RELOC_M32R_GOTPC_HI_ULO +-@deffnx {} BFD_RELOC_M32R_GOTPC_HI_SLO +-@deffnx {} BFD_RELOC_M32R_GOTPC_LO +-For PIC. +-@end deffn +-@deffn {} BFD_RELOC_V850_9_PCREL +-This is a 9-bit reloc +-@end deffn +-@deffn {} BFD_RELOC_V850_22_PCREL +-This is a 22-bit reloc +-@end deffn +-@deffn {} BFD_RELOC_V850_SDA_16_16_OFFSET +-This is a 16 bit offset from the short data area pointer. +-@end deffn +-@deffn {} BFD_RELOC_V850_SDA_15_16_OFFSET +-This is a 16 bit offset (of which only 15 bits are used) from the +-short data area pointer. +-@end deffn +-@deffn {} BFD_RELOC_V850_ZDA_16_16_OFFSET +-This is a 16 bit offset from the zero data area pointer. +-@end deffn +-@deffn {} BFD_RELOC_V850_ZDA_15_16_OFFSET +-This is a 16 bit offset (of which only 15 bits are used) from the +-zero data area pointer. +-@end deffn +-@deffn {} BFD_RELOC_V850_TDA_6_8_OFFSET +-This is an 8 bit offset (of which only 6 bits are used) from the +-tiny data area pointer. +-@end deffn +-@deffn {} BFD_RELOC_V850_TDA_7_8_OFFSET +-This is an 8bit offset (of which only 7 bits are used) from the tiny +-data area pointer. +-@end deffn +-@deffn {} BFD_RELOC_V850_TDA_7_7_OFFSET +-This is a 7 bit offset from the tiny data area pointer. +-@end deffn +-@deffn {} BFD_RELOC_V850_TDA_16_16_OFFSET +-This is a 16 bit offset from the tiny data area pointer. +-@end deffn +-@deffn {} BFD_RELOC_V850_TDA_4_5_OFFSET +-This is a 5 bit offset (of which only 4 bits are used) from the tiny +-data area pointer. +-@end deffn +-@deffn {} BFD_RELOC_V850_TDA_4_4_OFFSET +-This is a 4 bit offset from the tiny data area pointer. +-@end deffn +-@deffn {} BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET +-This is a 16 bit offset from the short data area pointer, with the +-bits placed non-contiguously in the instruction. +-@end deffn +-@deffn {} BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET +-This is a 16 bit offset from the zero data area pointer, with the +-bits placed non-contiguously in the instruction. +-@end deffn +-@deffn {} BFD_RELOC_V850_CALLT_6_7_OFFSET +-This is a 6 bit offset from the call table base pointer. +-@end deffn +-@deffn {} BFD_RELOC_V850_CALLT_16_16_OFFSET +-This is a 16 bit offset from the call table base pointer. +-@end deffn +-@deffn {} BFD_RELOC_V850_LONGCALL +-Used for relaxing indirect function calls. +-@end deffn +-@deffn {} BFD_RELOC_V850_LONGJUMP +-Used for relaxing indirect jumps. +-@end deffn +-@deffn {} BFD_RELOC_V850_ALIGN +-Used to maintain alignment whilst relaxing. +-@end deffn +-@deffn {} BFD_RELOC_V850_LO16_SPLIT_OFFSET +-This is a variation of BFD_RELOC_LO16 that can be used in v850e ld.bu +-instructions. +-@end deffn +-@deffn {} BFD_RELOC_V850_16_PCREL +-This is a 16-bit reloc. +-@end deffn +-@deffn {} BFD_RELOC_V850_17_PCREL +-This is a 17-bit reloc. +-@end deffn +-@deffn {} BFD_RELOC_V850_23 +-This is a 23-bit reloc. +-@end deffn +-@deffn {} BFD_RELOC_V850_32_PCREL +-This is a 32-bit reloc. +-@end deffn +-@deffn {} BFD_RELOC_V850_32_ABS +-This is a 32-bit reloc. +-@end deffn +-@deffn {} BFD_RELOC_V850_16_SPLIT_OFFSET +-This is a 16-bit reloc. +-@end deffn +-@deffn {} BFD_RELOC_V850_16_S1 +-This is a 16-bit reloc. +-@end deffn +-@deffn {} BFD_RELOC_V850_LO16_S1 +-Low 16 bits. 16 bit shifted by 1. +-@end deffn +-@deffn {} BFD_RELOC_V850_CALLT_15_16_OFFSET +-This is a 16 bit offset from the call table base pointer. +-@end deffn +-@deffn {} BFD_RELOC_V850_32_GOTPCREL +-DSO relocations. +-@end deffn +-@deffn {} BFD_RELOC_V850_16_GOT +-DSO relocations. +-@end deffn +-@deffn {} BFD_RELOC_V850_32_GOT +-DSO relocations. +-@end deffn +-@deffn {} BFD_RELOC_V850_22_PLT_PCREL +-DSO relocations. +-@end deffn +-@deffn {} BFD_RELOC_V850_32_PLT_PCREL +-DSO relocations. +-@end deffn +-@deffn {} BFD_RELOC_V850_COPY +-DSO relocations. +-@end deffn +-@deffn {} BFD_RELOC_V850_GLOB_DAT +-DSO relocations. +-@end deffn +-@deffn {} BFD_RELOC_V850_JMP_SLOT +-DSO relocations. +-@end deffn +-@deffn {} BFD_RELOC_V850_RELATIVE +-DSO relocations. +-@end deffn +-@deffn {} BFD_RELOC_V850_16_GOTOFF +-DSO relocations. +-@end deffn +-@deffn {} BFD_RELOC_V850_32_GOTOFF +-DSO relocations. +-@end deffn +-@deffn {} BFD_RELOC_V850_CODE +-start code. +-@end deffn +-@deffn {} BFD_RELOC_V850_DATA +-start data in text. +-@end deffn +-@deffn {} BFD_RELOC_TIC30_LDP +-This is a 8bit DP reloc for the tms320c30, where the most +-significant 8 bits of a 24 bit word are placed into the least +-significant 8 bits of the opcode. +-@end deffn +-@deffn {} BFD_RELOC_TIC54X_PARTLS7 +-This is a 7bit reloc for the tms320c54x, where the least +-significant 7 bits of a 16 bit word are placed into the least +-significant 7 bits of the opcode. +-@end deffn +-@deffn {} BFD_RELOC_TIC54X_PARTMS9 +-This is a 9bit DP reloc for the tms320c54x, where the most +-significant 9 bits of a 16 bit word are placed into the least +-significant 9 bits of the opcode. +-@end deffn +-@deffn {} BFD_RELOC_TIC54X_23 +-This is an extended address 23-bit reloc for the tms320c54x. +-@end deffn +-@deffn {} BFD_RELOC_TIC54X_16_OF_23 +-This is a 16-bit reloc for the tms320c54x, where the least +-significant 16 bits of a 23-bit extended address are placed into +-the opcode. +-@end deffn +-@deffn {} BFD_RELOC_TIC54X_MS7_OF_23 +-This is a reloc for the tms320c54x, where the most +-significant 7 bits of a 23-bit extended address are placed into +-the opcode. +-@end deffn +-@deffn {} BFD_RELOC_C6000_PCR_S21 +-@deffnx {} BFD_RELOC_C6000_PCR_S12 +-@deffnx {} BFD_RELOC_C6000_PCR_S10 +-@deffnx {} BFD_RELOC_C6000_PCR_S7 +-@deffnx {} BFD_RELOC_C6000_ABS_S16 +-@deffnx {} BFD_RELOC_C6000_ABS_L16 +-@deffnx {} BFD_RELOC_C6000_ABS_H16 +-@deffnx {} BFD_RELOC_C6000_SBR_U15_B +-@deffnx {} BFD_RELOC_C6000_SBR_U15_H +-@deffnx {} BFD_RELOC_C6000_SBR_U15_W +-@deffnx {} BFD_RELOC_C6000_SBR_S16 +-@deffnx {} BFD_RELOC_C6000_SBR_L16_B +-@deffnx {} BFD_RELOC_C6000_SBR_L16_H +-@deffnx {} BFD_RELOC_C6000_SBR_L16_W +-@deffnx {} BFD_RELOC_C6000_SBR_H16_B +-@deffnx {} BFD_RELOC_C6000_SBR_H16_H +-@deffnx {} BFD_RELOC_C6000_SBR_H16_W +-@deffnx {} BFD_RELOC_C6000_SBR_GOT_U15_W +-@deffnx {} BFD_RELOC_C6000_SBR_GOT_L16_W +-@deffnx {} BFD_RELOC_C6000_SBR_GOT_H16_W +-@deffnx {} BFD_RELOC_C6000_DSBT_INDEX +-@deffnx {} BFD_RELOC_C6000_PREL31 +-@deffnx {} BFD_RELOC_C6000_COPY +-@deffnx {} BFD_RELOC_C6000_JUMP_SLOT +-@deffnx {} BFD_RELOC_C6000_EHTYPE +-@deffnx {} BFD_RELOC_C6000_PCR_H16 +-@deffnx {} BFD_RELOC_C6000_PCR_L16 +-@deffnx {} BFD_RELOC_C6000_ALIGN +-@deffnx {} BFD_RELOC_C6000_FPHEAD +-@deffnx {} BFD_RELOC_C6000_NOCMP +-TMS320C6000 relocations. +-@end deffn +-@deffn {} BFD_RELOC_FR30_48 +-This is a 48 bit reloc for the FR30 that stores 32 bits. +-@end deffn +-@deffn {} BFD_RELOC_FR30_20 +-This is a 32 bit reloc for the FR30 that stores 20 bits split up into +-two sections. +-@end deffn +-@deffn {} BFD_RELOC_FR30_6_IN_4 +-This is a 16 bit reloc for the FR30 that stores a 6 bit word offset in +-4 bits. +-@end deffn +-@deffn {} BFD_RELOC_FR30_8_IN_8 +-This is a 16 bit reloc for the FR30 that stores an 8 bit byte offset +-into 8 bits. +-@end deffn +-@deffn {} BFD_RELOC_FR30_9_IN_8 +-This is a 16 bit reloc for the FR30 that stores a 9 bit short offset +-into 8 bits. +-@end deffn +-@deffn {} BFD_RELOC_FR30_10_IN_8 +-This is a 16 bit reloc for the FR30 that stores a 10 bit word offset +-into 8 bits. +-@end deffn +-@deffn {} BFD_RELOC_FR30_9_PCREL +-This is a 16 bit reloc for the FR30 that stores a 9 bit pc relative +-short offset into 8 bits. +-@end deffn +-@deffn {} BFD_RELOC_FR30_12_PCREL +-This is a 16 bit reloc for the FR30 that stores a 12 bit pc relative +-short offset into 11 bits. +-@end deffn +-@deffn {} BFD_RELOC_MCORE_PCREL_IMM8BY4 +-@deffnx {} BFD_RELOC_MCORE_PCREL_IMM11BY2 +-@deffnx {} BFD_RELOC_MCORE_PCREL_IMM4BY2 +-@deffnx {} BFD_RELOC_MCORE_PCREL_32 +-@deffnx {} BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2 +-@deffnx {} BFD_RELOC_MCORE_RVA +-Motorola Mcore relocations. +-@end deffn +-@deffn {} BFD_RELOC_MEP_8 +-@deffnx {} BFD_RELOC_MEP_16 +-@deffnx {} BFD_RELOC_MEP_32 +-@deffnx {} BFD_RELOC_MEP_PCREL8A2 +-@deffnx {} BFD_RELOC_MEP_PCREL12A2 +-@deffnx {} BFD_RELOC_MEP_PCREL17A2 +-@deffnx {} BFD_RELOC_MEP_PCREL24A2 +-@deffnx {} BFD_RELOC_MEP_PCABS24A2 +-@deffnx {} BFD_RELOC_MEP_LOW16 +-@deffnx {} BFD_RELOC_MEP_HI16U +-@deffnx {} BFD_RELOC_MEP_HI16S +-@deffnx {} BFD_RELOC_MEP_GPREL +-@deffnx {} BFD_RELOC_MEP_TPREL +-@deffnx {} BFD_RELOC_MEP_TPREL7 +-@deffnx {} BFD_RELOC_MEP_TPREL7A2 +-@deffnx {} BFD_RELOC_MEP_TPREL7A4 +-@deffnx {} BFD_RELOC_MEP_UIMM24 +-@deffnx {} BFD_RELOC_MEP_ADDR24A4 +-@deffnx {} BFD_RELOC_MEP_GNU_VTINHERIT +-@deffnx {} BFD_RELOC_MEP_GNU_VTENTRY +-Toshiba Media Processor Relocations. +-@end deffn +-@deffn {} BFD_RELOC_METAG_HIADDR16 +-@deffnx {} BFD_RELOC_METAG_LOADDR16 +-@deffnx {} BFD_RELOC_METAG_RELBRANCH +-@deffnx {} BFD_RELOC_METAG_GETSETOFF +-@deffnx {} BFD_RELOC_METAG_HIOG +-@deffnx {} BFD_RELOC_METAG_LOOG +-@deffnx {} BFD_RELOC_METAG_REL8 +-@deffnx {} BFD_RELOC_METAG_REL16 +-@deffnx {} BFD_RELOC_METAG_HI16_GOTOFF +-@deffnx {} BFD_RELOC_METAG_LO16_GOTOFF +-@deffnx {} BFD_RELOC_METAG_GETSET_GOTOFF +-@deffnx {} BFD_RELOC_METAG_GETSET_GOT +-@deffnx {} BFD_RELOC_METAG_HI16_GOTPC +-@deffnx {} BFD_RELOC_METAG_LO16_GOTPC +-@deffnx {} BFD_RELOC_METAG_HI16_PLT +-@deffnx {} BFD_RELOC_METAG_LO16_PLT +-@deffnx {} BFD_RELOC_METAG_RELBRANCH_PLT +-@deffnx {} BFD_RELOC_METAG_GOTOFF +-@deffnx {} BFD_RELOC_METAG_PLT +-@deffnx {} BFD_RELOC_METAG_COPY +-@deffnx {} BFD_RELOC_METAG_JMP_SLOT +-@deffnx {} BFD_RELOC_METAG_RELATIVE +-@deffnx {} BFD_RELOC_METAG_GLOB_DAT +-@deffnx {} BFD_RELOC_METAG_TLS_GD +-@deffnx {} BFD_RELOC_METAG_TLS_LDM +-@deffnx {} BFD_RELOC_METAG_TLS_LDO_HI16 +-@deffnx {} BFD_RELOC_METAG_TLS_LDO_LO16 +-@deffnx {} BFD_RELOC_METAG_TLS_LDO +-@deffnx {} BFD_RELOC_METAG_TLS_IE +-@deffnx {} BFD_RELOC_METAG_TLS_IENONPIC +-@deffnx {} BFD_RELOC_METAG_TLS_IENONPIC_HI16 +-@deffnx {} BFD_RELOC_METAG_TLS_IENONPIC_LO16 +-@deffnx {} BFD_RELOC_METAG_TLS_TPOFF +-@deffnx {} BFD_RELOC_METAG_TLS_DTPMOD +-@deffnx {} BFD_RELOC_METAG_TLS_DTPOFF +-@deffnx {} BFD_RELOC_METAG_TLS_LE +-@deffnx {} BFD_RELOC_METAG_TLS_LE_HI16 +-@deffnx {} BFD_RELOC_METAG_TLS_LE_LO16 +-Imagination Technologies Meta relocations. +-@end deffn +-@deffn {} BFD_RELOC_MMIX_GETA +-@deffnx {} BFD_RELOC_MMIX_GETA_1 +-@deffnx {} BFD_RELOC_MMIX_GETA_2 +-@deffnx {} BFD_RELOC_MMIX_GETA_3 +-These are relocations for the GETA instruction. +-@end deffn +-@deffn {} BFD_RELOC_MMIX_CBRANCH +-@deffnx {} BFD_RELOC_MMIX_CBRANCH_J +-@deffnx {} BFD_RELOC_MMIX_CBRANCH_1 +-@deffnx {} BFD_RELOC_MMIX_CBRANCH_2 +-@deffnx {} BFD_RELOC_MMIX_CBRANCH_3 +-These are relocations for a conditional branch instruction. +-@end deffn +-@deffn {} BFD_RELOC_MMIX_PUSHJ +-@deffnx {} BFD_RELOC_MMIX_PUSHJ_1 +-@deffnx {} BFD_RELOC_MMIX_PUSHJ_2 +-@deffnx {} BFD_RELOC_MMIX_PUSHJ_3 +-@deffnx {} BFD_RELOC_MMIX_PUSHJ_STUBBABLE +-These are relocations for the PUSHJ instruction. +-@end deffn +-@deffn {} BFD_RELOC_MMIX_JMP +-@deffnx {} BFD_RELOC_MMIX_JMP_1 +-@deffnx {} BFD_RELOC_MMIX_JMP_2 +-@deffnx {} BFD_RELOC_MMIX_JMP_3 +-These are relocations for the JMP instruction. +-@end deffn +-@deffn {} BFD_RELOC_MMIX_ADDR19 +-This is a relocation for a relative address as in a GETA instruction or +-a branch. +-@end deffn +-@deffn {} BFD_RELOC_MMIX_ADDR27 +-This is a relocation for a relative address as in a JMP instruction. +-@end deffn +-@deffn {} BFD_RELOC_MMIX_REG_OR_BYTE +-This is a relocation for an instruction field that may be a general +-register or a value 0..255. +-@end deffn +-@deffn {} BFD_RELOC_MMIX_REG +-This is a relocation for an instruction field that may be a general +-register. +-@end deffn +-@deffn {} BFD_RELOC_MMIX_BASE_PLUS_OFFSET +-This is a relocation for two instruction fields holding a register and +-an offset, the equivalent of the relocation. +-@end deffn +-@deffn {} BFD_RELOC_MMIX_LOCAL +-This relocation is an assertion that the expression is not allocated as +-a global register. It does not modify contents. +-@end deffn +-@deffn {} BFD_RELOC_AVR_7_PCREL +-This is a 16 bit reloc for the AVR that stores 8 bit pc relative +-short offset into 7 bits. +-@end deffn +-@deffn {} BFD_RELOC_AVR_13_PCREL +-This is a 16 bit reloc for the AVR that stores 13 bit pc relative +-short offset into 12 bits. +-@end deffn +-@deffn {} BFD_RELOC_AVR_16_PM +-This is a 16 bit reloc for the AVR that stores 17 bit value (usually +-program memory address) into 16 bits. +-@end deffn +-@deffn {} BFD_RELOC_AVR_LO8_LDI +-This is a 16 bit reloc for the AVR that stores 8 bit value (usually +-data memory address) into 8 bit immediate value of LDI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_HI8_LDI +-This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 bit +-of data memory address) into 8 bit immediate value of LDI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_HH8_LDI +-This is a 16 bit reloc for the AVR that stores 8 bit value (most high 8 bit +-of program memory address) into 8 bit immediate value of LDI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_MS8_LDI +-This is a 16 bit reloc for the AVR that stores 8 bit value (most high 8 bit +-of 32 bit value) into 8 bit immediate value of LDI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_LO8_LDI_NEG +-This is a 16 bit reloc for the AVR that stores negated 8 bit value +-(usually data memory address) into 8 bit immediate value of SUBI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_HI8_LDI_NEG +-This is a 16 bit reloc for the AVR that stores negated 8 bit value +-(high 8 bit of data memory address) into 8 bit immediate value of +-SUBI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_HH8_LDI_NEG +-This is a 16 bit reloc for the AVR that stores negated 8 bit value +-(most high 8 bit of program memory address) into 8 bit immediate value +-of LDI or SUBI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_MS8_LDI_NEG +-This is a 16 bit reloc for the AVR that stores negated 8 bit value (msb +-of 32 bit value) into 8 bit immediate value of LDI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_LO8_LDI_PM +-This is a 16 bit reloc for the AVR that stores 8 bit value (usually +-command address) into 8 bit immediate value of LDI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_LO8_LDI_GS +-This is a 16 bit reloc for the AVR that stores 8 bit value +-(command address) into 8 bit immediate value of LDI insn. If the address +-is beyond the 128k boundary, the linker inserts a jump stub for this reloc +-in the lower 128k. +-@end deffn +-@deffn {} BFD_RELOC_AVR_HI8_LDI_PM +-This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 bit +-of command address) into 8 bit immediate value of LDI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_HI8_LDI_GS +-This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 bit +-of command address) into 8 bit immediate value of LDI insn. If the address +-is beyond the 128k boundary, the linker inserts a jump stub for this reloc +-below 128k. +-@end deffn +-@deffn {} BFD_RELOC_AVR_HH8_LDI_PM +-This is a 16 bit reloc for the AVR that stores 8 bit value (most high 8 bit +-of command address) into 8 bit immediate value of LDI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_LO8_LDI_PM_NEG +-This is a 16 bit reloc for the AVR that stores negated 8 bit value +-(usually command address) into 8 bit immediate value of SUBI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_HI8_LDI_PM_NEG +-This is a 16 bit reloc for the AVR that stores negated 8 bit value +-(high 8 bit of 16 bit command address) into 8 bit immediate value +-of SUBI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_HH8_LDI_PM_NEG +-This is a 16 bit reloc for the AVR that stores negated 8 bit value +-(high 6 bit of 22 bit command address) into 8 bit immediate +-value of SUBI insn. +-@end deffn +-@deffn {} BFD_RELOC_AVR_CALL +-This is a 32 bit reloc for the AVR that stores 23 bit value +-into 22 bits. +-@end deffn +-@deffn {} BFD_RELOC_AVR_LDI +-This is a 16 bit reloc for the AVR that stores all needed bits +-for absolute addressing with ldi with overflow check to linktime +-@end deffn +-@deffn {} BFD_RELOC_AVR_6 +-This is a 6 bit reloc for the AVR that stores offset for ldd/std +-instructions +-@end deffn +-@deffn {} BFD_RELOC_AVR_6_ADIW +-This is a 6 bit reloc for the AVR that stores offset for adiw/sbiw +-instructions +-@end deffn +-@deffn {} BFD_RELOC_AVR_8_LO +-This is a 8 bit reloc for the AVR that stores bits 0..7 of a symbol +-in .byte lo8(symbol) +-@end deffn +-@deffn {} BFD_RELOC_AVR_8_HI +-This is a 8 bit reloc for the AVR that stores bits 8..15 of a symbol +-in .byte hi8(symbol) +-@end deffn +-@deffn {} BFD_RELOC_AVR_8_HLO +-This is a 8 bit reloc for the AVR that stores bits 16..23 of a symbol +-in .byte hlo8(symbol) +-@end deffn +-@deffn {} BFD_RELOC_RL78_NEG8 +-@deffnx {} BFD_RELOC_RL78_NEG16 +-@deffnx {} BFD_RELOC_RL78_NEG24 +-@deffnx {} BFD_RELOC_RL78_NEG32 +-@deffnx {} BFD_RELOC_RL78_16_OP +-@deffnx {} BFD_RELOC_RL78_24_OP +-@deffnx {} BFD_RELOC_RL78_32_OP +-@deffnx {} BFD_RELOC_RL78_8U +-@deffnx {} BFD_RELOC_RL78_16U +-@deffnx {} BFD_RELOC_RL78_24U +-@deffnx {} BFD_RELOC_RL78_DIR3U_PCREL +-@deffnx {} BFD_RELOC_RL78_DIFF +-@deffnx {} BFD_RELOC_RL78_GPRELB +-@deffnx {} BFD_RELOC_RL78_GPRELW +-@deffnx {} BFD_RELOC_RL78_GPRELL +-@deffnx {} BFD_RELOC_RL78_SYM +-@deffnx {} BFD_RELOC_RL78_OP_SUBTRACT +-@deffnx {} BFD_RELOC_RL78_OP_NEG +-@deffnx {} BFD_RELOC_RL78_OP_AND +-@deffnx {} BFD_RELOC_RL78_OP_SHRA +-@deffnx {} BFD_RELOC_RL78_ABS8 +-@deffnx {} BFD_RELOC_RL78_ABS16 +-@deffnx {} BFD_RELOC_RL78_ABS16_REV +-@deffnx {} BFD_RELOC_RL78_ABS32 +-@deffnx {} BFD_RELOC_RL78_ABS32_REV +-@deffnx {} BFD_RELOC_RL78_ABS16U +-@deffnx {} BFD_RELOC_RL78_ABS16UW +-@deffnx {} BFD_RELOC_RL78_ABS16UL +-@deffnx {} BFD_RELOC_RL78_RELAX +-@deffnx {} BFD_RELOC_RL78_HI16 +-@deffnx {} BFD_RELOC_RL78_HI8 +-@deffnx {} BFD_RELOC_RL78_LO16 +-@deffnx {} BFD_RELOC_RL78_CODE +-Renesas RL78 Relocations. +-@end deffn +-@deffn {} BFD_RELOC_RX_NEG8 +-@deffnx {} BFD_RELOC_RX_NEG16 +-@deffnx {} BFD_RELOC_RX_NEG24 +-@deffnx {} BFD_RELOC_RX_NEG32 +-@deffnx {} BFD_RELOC_RX_16_OP +-@deffnx {} BFD_RELOC_RX_24_OP +-@deffnx {} BFD_RELOC_RX_32_OP +-@deffnx {} BFD_RELOC_RX_8U +-@deffnx {} BFD_RELOC_RX_16U +-@deffnx {} BFD_RELOC_RX_24U +-@deffnx {} BFD_RELOC_RX_DIR3U_PCREL +-@deffnx {} BFD_RELOC_RX_DIFF +-@deffnx {} BFD_RELOC_RX_GPRELB +-@deffnx {} BFD_RELOC_RX_GPRELW +-@deffnx {} BFD_RELOC_RX_GPRELL +-@deffnx {} BFD_RELOC_RX_SYM +-@deffnx {} BFD_RELOC_RX_OP_SUBTRACT +-@deffnx {} BFD_RELOC_RX_OP_NEG +-@deffnx {} BFD_RELOC_RX_ABS8 +-@deffnx {} BFD_RELOC_RX_ABS16 +-@deffnx {} BFD_RELOC_RX_ABS16_REV +-@deffnx {} BFD_RELOC_RX_ABS32 +-@deffnx {} BFD_RELOC_RX_ABS32_REV +-@deffnx {} BFD_RELOC_RX_ABS16U +-@deffnx {} BFD_RELOC_RX_ABS16UW +-@deffnx {} BFD_RELOC_RX_ABS16UL +-@deffnx {} BFD_RELOC_RX_RELAX +-Renesas RX Relocations. +-@end deffn +-@deffn {} BFD_RELOC_390_12 +-Direct 12 bit. +-@end deffn +-@deffn {} BFD_RELOC_390_GOT12 +-12 bit GOT offset. +-@end deffn +-@deffn {} BFD_RELOC_390_PLT32 +-32 bit PC relative PLT address. +-@end deffn +-@deffn {} BFD_RELOC_390_COPY +-Copy symbol at runtime. +-@end deffn +-@deffn {} BFD_RELOC_390_GLOB_DAT +-Create GOT entry. +-@end deffn +-@deffn {} BFD_RELOC_390_JMP_SLOT +-Create PLT entry. +-@end deffn +-@deffn {} BFD_RELOC_390_RELATIVE +-Adjust by program base. +-@end deffn +-@deffn {} BFD_RELOC_390_GOTPC +-32 bit PC relative offset to GOT. +-@end deffn +-@deffn {} BFD_RELOC_390_GOT16 +-16 bit GOT offset. +-@end deffn +-@deffn {} BFD_RELOC_390_PC12DBL +-PC relative 12 bit shifted by 1. +-@end deffn +-@deffn {} BFD_RELOC_390_PLT12DBL +-12 bit PC rel. PLT shifted by 1. +-@end deffn +-@deffn {} BFD_RELOC_390_PC16DBL +-PC relative 16 bit shifted by 1. +-@end deffn +-@deffn {} BFD_RELOC_390_PLT16DBL +-16 bit PC rel. PLT shifted by 1. +-@end deffn +-@deffn {} BFD_RELOC_390_PC24DBL +-PC relative 24 bit shifted by 1. +-@end deffn +-@deffn {} BFD_RELOC_390_PLT24DBL +-24 bit PC rel. PLT shifted by 1. +-@end deffn +-@deffn {} BFD_RELOC_390_PC32DBL +-PC relative 32 bit shifted by 1. +-@end deffn +-@deffn {} BFD_RELOC_390_PLT32DBL +-32 bit PC rel. PLT shifted by 1. +-@end deffn +-@deffn {} BFD_RELOC_390_GOTPCDBL +-32 bit PC rel. GOT shifted by 1. +-@end deffn +-@deffn {} BFD_RELOC_390_GOT64 +-64 bit GOT offset. +-@end deffn +-@deffn {} BFD_RELOC_390_PLT64 +-64 bit PC relative PLT address. +-@end deffn +-@deffn {} BFD_RELOC_390_GOTENT +-32 bit rel. offset to GOT entry. +-@end deffn +-@deffn {} BFD_RELOC_390_GOTOFF64 +-64 bit offset to GOT. +-@end deffn +-@deffn {} BFD_RELOC_390_GOTPLT12 +-12-bit offset to symbol-entry within GOT, with PLT handling. +-@end deffn +-@deffn {} BFD_RELOC_390_GOTPLT16 +-16-bit offset to symbol-entry within GOT, with PLT handling. +-@end deffn +-@deffn {} BFD_RELOC_390_GOTPLT32 +-32-bit offset to symbol-entry within GOT, with PLT handling. +-@end deffn +-@deffn {} BFD_RELOC_390_GOTPLT64 +-64-bit offset to symbol-entry within GOT, with PLT handling. +-@end deffn +-@deffn {} BFD_RELOC_390_GOTPLTENT +-32-bit rel. offset to symbol-entry within GOT, with PLT handling. +-@end deffn +-@deffn {} BFD_RELOC_390_PLTOFF16 +-16-bit rel. offset from the GOT to a PLT entry. +-@end deffn +-@deffn {} BFD_RELOC_390_PLTOFF32 +-32-bit rel. offset from the GOT to a PLT entry. +-@end deffn +-@deffn {} BFD_RELOC_390_PLTOFF64 +-64-bit rel. offset from the GOT to a PLT entry. +-@end deffn +-@deffn {} BFD_RELOC_390_TLS_LOAD +-@deffnx {} BFD_RELOC_390_TLS_GDCALL +-@deffnx {} BFD_RELOC_390_TLS_LDCALL +-@deffnx {} BFD_RELOC_390_TLS_GD32 +-@deffnx {} BFD_RELOC_390_TLS_GD64 +-@deffnx {} BFD_RELOC_390_TLS_GOTIE12 +-@deffnx {} BFD_RELOC_390_TLS_GOTIE32 +-@deffnx {} BFD_RELOC_390_TLS_GOTIE64 +-@deffnx {} BFD_RELOC_390_TLS_LDM32 +-@deffnx {} BFD_RELOC_390_TLS_LDM64 +-@deffnx {} BFD_RELOC_390_TLS_IE32 +-@deffnx {} BFD_RELOC_390_TLS_IE64 +-@deffnx {} BFD_RELOC_390_TLS_IEENT +-@deffnx {} BFD_RELOC_390_TLS_LE32 +-@deffnx {} BFD_RELOC_390_TLS_LE64 +-@deffnx {} BFD_RELOC_390_TLS_LDO32 +-@deffnx {} BFD_RELOC_390_TLS_LDO64 +-@deffnx {} BFD_RELOC_390_TLS_DTPMOD +-@deffnx {} BFD_RELOC_390_TLS_DTPOFF +-@deffnx {} BFD_RELOC_390_TLS_TPOFF +-s390 tls relocations. +-@end deffn +-@deffn {} BFD_RELOC_390_20 +-@deffnx {} BFD_RELOC_390_GOT20 +-@deffnx {} BFD_RELOC_390_GOTPLT20 +-@deffnx {} BFD_RELOC_390_TLS_GOTIE20 +-Long displacement extension. +-@end deffn +-@deffn {} BFD_RELOC_390_IRELATIVE +-STT_GNU_IFUNC relocation. +-@end deffn +-@deffn {} BFD_RELOC_SCORE_GPREL15 +-Score relocations +-Low 16 bit for load/store +-@end deffn +-@deffn {} BFD_RELOC_SCORE_DUMMY2 +-@deffnx {} BFD_RELOC_SCORE_JMP +-This is a 24-bit reloc with the right 1 bit assumed to be 0 +-@end deffn +-@deffn {} BFD_RELOC_SCORE_BRANCH +-This is a 19-bit reloc with the right 1 bit assumed to be 0 +-@end deffn +-@deffn {} BFD_RELOC_SCORE_IMM30 +-This is a 32-bit reloc for 48-bit instructions. +-@end deffn +-@deffn {} BFD_RELOC_SCORE_IMM32 +-This is a 32-bit reloc for 48-bit instructions. +-@end deffn +-@deffn {} BFD_RELOC_SCORE16_JMP +-This is a 11-bit reloc with the right 1 bit assumed to be 0 +-@end deffn +-@deffn {} BFD_RELOC_SCORE16_BRANCH +-This is a 8-bit reloc with the right 1 bit assumed to be 0 +-@end deffn +-@deffn {} BFD_RELOC_SCORE_BCMP +-This is a 9-bit reloc with the right 1 bit assumed to be 0 +-@end deffn +-@deffn {} BFD_RELOC_SCORE_GOT15 +-@deffnx {} BFD_RELOC_SCORE_GOT_LO16 +-@deffnx {} BFD_RELOC_SCORE_CALL15 +-@deffnx {} BFD_RELOC_SCORE_DUMMY_HI16 +-Undocumented Score relocs +-@end deffn +-@deffn {} BFD_RELOC_IP2K_FR9 +-Scenix IP2K - 9-bit register number / data address +-@end deffn +-@deffn {} BFD_RELOC_IP2K_BANK +-Scenix IP2K - 4-bit register/data bank number +-@end deffn +-@deffn {} BFD_RELOC_IP2K_ADDR16CJP +-Scenix IP2K - low 13 bits of instruction word address +-@end deffn +-@deffn {} BFD_RELOC_IP2K_PAGE3 +-Scenix IP2K - high 3 bits of instruction word address +-@end deffn +-@deffn {} BFD_RELOC_IP2K_LO8DATA +-@deffnx {} BFD_RELOC_IP2K_HI8DATA +-@deffnx {} BFD_RELOC_IP2K_EX8DATA +-Scenix IP2K - ext/low/high 8 bits of data address +-@end deffn +-@deffn {} BFD_RELOC_IP2K_LO8INSN +-@deffnx {} BFD_RELOC_IP2K_HI8INSN +-Scenix IP2K - low/high 8 bits of instruction word address +-@end deffn +-@deffn {} BFD_RELOC_IP2K_PC_SKIP +-Scenix IP2K - even/odd PC modifier to modify snb pcl.0 +-@end deffn +-@deffn {} BFD_RELOC_IP2K_TEXT +-Scenix IP2K - 16 bit word address in text section. +-@end deffn +-@deffn {} BFD_RELOC_IP2K_FR_OFFSET +-Scenix IP2K - 7-bit sp or dp offset +-@end deffn +-@deffn {} BFD_RELOC_VPE4KMATH_DATA +-@deffnx {} BFD_RELOC_VPE4KMATH_INSN +-Scenix VPE4K coprocessor - data/insn-space addressing +-@end deffn +-@deffn {} BFD_RELOC_VTABLE_INHERIT +-@deffnx {} BFD_RELOC_VTABLE_ENTRY +-These two relocations are used by the linker to determine which of +-the entries in a C++ virtual function table are actually used. When +-the --gc-sections option is given, the linker will zero out the entries +-that are not used, so that the code for those functions need not be +-included in the output. +- +-VTABLE_INHERIT is a zero-space relocation used to describe to the +-linker the inheritance tree of a C++ virtual function table. The +-relocation's symbol should be the parent class' vtable, and the +-relocation should be located at the child vtable. +- +-VTABLE_ENTRY is a zero-space relocation that describes the use of a +-virtual function table entry. The reloc's symbol should refer to the +-table of the class mentioned in the code. Off of that base, an offset +-describes the entry that is being used. For Rela hosts, this offset +-is stored in the reloc's addend. For Rel hosts, we are forced to put +-this offset in the reloc's section offset. +-@end deffn +-@deffn {} BFD_RELOC_IA64_IMM14 +-@deffnx {} BFD_RELOC_IA64_IMM22 +-@deffnx {} BFD_RELOC_IA64_IMM64 +-@deffnx {} BFD_RELOC_IA64_DIR32MSB +-@deffnx {} BFD_RELOC_IA64_DIR32LSB +-@deffnx {} BFD_RELOC_IA64_DIR64MSB +-@deffnx {} BFD_RELOC_IA64_DIR64LSB +-@deffnx {} BFD_RELOC_IA64_GPREL22 +-@deffnx {} BFD_RELOC_IA64_GPREL64I +-@deffnx {} BFD_RELOC_IA64_GPREL32MSB +-@deffnx {} BFD_RELOC_IA64_GPREL32LSB +-@deffnx {} BFD_RELOC_IA64_GPREL64MSB +-@deffnx {} BFD_RELOC_IA64_GPREL64LSB +-@deffnx {} BFD_RELOC_IA64_LTOFF22 +-@deffnx {} BFD_RELOC_IA64_LTOFF64I +-@deffnx {} BFD_RELOC_IA64_PLTOFF22 +-@deffnx {} BFD_RELOC_IA64_PLTOFF64I +-@deffnx {} BFD_RELOC_IA64_PLTOFF64MSB +-@deffnx {} BFD_RELOC_IA64_PLTOFF64LSB +-@deffnx {} BFD_RELOC_IA64_FPTR64I +-@deffnx {} BFD_RELOC_IA64_FPTR32MSB +-@deffnx {} BFD_RELOC_IA64_FPTR32LSB +-@deffnx {} BFD_RELOC_IA64_FPTR64MSB +-@deffnx {} BFD_RELOC_IA64_FPTR64LSB +-@deffnx {} BFD_RELOC_IA64_PCREL21B +-@deffnx {} BFD_RELOC_IA64_PCREL21BI +-@deffnx {} BFD_RELOC_IA64_PCREL21M +-@deffnx {} BFD_RELOC_IA64_PCREL21F +-@deffnx {} BFD_RELOC_IA64_PCREL22 +-@deffnx {} BFD_RELOC_IA64_PCREL60B +-@deffnx {} BFD_RELOC_IA64_PCREL64I +-@deffnx {} BFD_RELOC_IA64_PCREL32MSB +-@deffnx {} BFD_RELOC_IA64_PCREL32LSB +-@deffnx {} BFD_RELOC_IA64_PCREL64MSB +-@deffnx {} BFD_RELOC_IA64_PCREL64LSB +-@deffnx {} BFD_RELOC_IA64_LTOFF_FPTR22 +-@deffnx {} BFD_RELOC_IA64_LTOFF_FPTR64I +-@deffnx {} BFD_RELOC_IA64_LTOFF_FPTR32MSB +-@deffnx {} BFD_RELOC_IA64_LTOFF_FPTR32LSB +-@deffnx {} BFD_RELOC_IA64_LTOFF_FPTR64MSB +-@deffnx {} BFD_RELOC_IA64_LTOFF_FPTR64LSB +-@deffnx {} BFD_RELOC_IA64_SEGREL32MSB +-@deffnx {} BFD_RELOC_IA64_SEGREL32LSB +-@deffnx {} BFD_RELOC_IA64_SEGREL64MSB +-@deffnx {} BFD_RELOC_IA64_SEGREL64LSB +-@deffnx {} BFD_RELOC_IA64_SECREL32MSB +-@deffnx {} BFD_RELOC_IA64_SECREL32LSB +-@deffnx {} BFD_RELOC_IA64_SECREL64MSB +-@deffnx {} BFD_RELOC_IA64_SECREL64LSB +-@deffnx {} BFD_RELOC_IA64_REL32MSB +-@deffnx {} BFD_RELOC_IA64_REL32LSB +-@deffnx {} BFD_RELOC_IA64_REL64MSB +-@deffnx {} BFD_RELOC_IA64_REL64LSB +-@deffnx {} BFD_RELOC_IA64_LTV32MSB +-@deffnx {} BFD_RELOC_IA64_LTV32LSB +-@deffnx {} BFD_RELOC_IA64_LTV64MSB +-@deffnx {} BFD_RELOC_IA64_LTV64LSB +-@deffnx {} BFD_RELOC_IA64_IPLTMSB +-@deffnx {} BFD_RELOC_IA64_IPLTLSB +-@deffnx {} BFD_RELOC_IA64_COPY +-@deffnx {} BFD_RELOC_IA64_LTOFF22X +-@deffnx {} BFD_RELOC_IA64_LDXMOV +-@deffnx {} BFD_RELOC_IA64_TPREL14 +-@deffnx {} BFD_RELOC_IA64_TPREL22 +-@deffnx {} BFD_RELOC_IA64_TPREL64I +-@deffnx {} BFD_RELOC_IA64_TPREL64MSB +-@deffnx {} BFD_RELOC_IA64_TPREL64LSB +-@deffnx {} BFD_RELOC_IA64_LTOFF_TPREL22 +-@deffnx {} BFD_RELOC_IA64_DTPMOD64MSB +-@deffnx {} BFD_RELOC_IA64_DTPMOD64LSB +-@deffnx {} BFD_RELOC_IA64_LTOFF_DTPMOD22 +-@deffnx {} BFD_RELOC_IA64_DTPREL14 +-@deffnx {} BFD_RELOC_IA64_DTPREL22 +-@deffnx {} BFD_RELOC_IA64_DTPREL64I +-@deffnx {} BFD_RELOC_IA64_DTPREL32MSB +-@deffnx {} BFD_RELOC_IA64_DTPREL32LSB +-@deffnx {} BFD_RELOC_IA64_DTPREL64MSB +-@deffnx {} BFD_RELOC_IA64_DTPREL64LSB +-@deffnx {} BFD_RELOC_IA64_LTOFF_DTPREL22 +-Intel IA64 Relocations. +-@end deffn +-@deffn {} BFD_RELOC_M68HC11_HI8 +-Motorola 68HC11 reloc. +-This is the 8 bit high part of an absolute address. +-@end deffn +-@deffn {} BFD_RELOC_M68HC11_LO8 +-Motorola 68HC11 reloc. +-This is the 8 bit low part of an absolute address. +-@end deffn +-@deffn {} BFD_RELOC_M68HC11_3B +-Motorola 68HC11 reloc. +-This is the 3 bit of a value. +-@end deffn +-@deffn {} BFD_RELOC_M68HC11_RL_JUMP +-Motorola 68HC11 reloc. +-This reloc marks the beginning of a jump/call instruction. +-It is used for linker relaxation to correctly identify beginning +-of instruction and change some branches to use PC-relative +-addressing mode. +-@end deffn +-@deffn {} BFD_RELOC_M68HC11_RL_GROUP +-Motorola 68HC11 reloc. +-This reloc marks a group of several instructions that gcc generates +-and for which the linker relaxation pass can modify and/or remove +-some of them. +-@end deffn +-@deffn {} BFD_RELOC_M68HC11_LO16 +-Motorola 68HC11 reloc. +-This is the 16-bit lower part of an address. It is used for 'call' +-instruction to specify the symbol address without any special +-transformation (due to memory bank window). +-@end deffn +-@deffn {} BFD_RELOC_M68HC11_PAGE +-Motorola 68HC11 reloc. +-This is a 8-bit reloc that specifies the page number of an address. +-It is used by 'call' instruction to specify the page number of +-the symbol. +-@end deffn +-@deffn {} BFD_RELOC_M68HC11_24 +-Motorola 68HC11 reloc. +-This is a 24-bit reloc that represents the address with a 16-bit +-value and a 8-bit page number. The symbol address is transformed +-to follow the 16K memory bank of 68HC12 (seen as mapped in the window). +-@end deffn +-@deffn {} BFD_RELOC_M68HC12_5B +-Motorola 68HC12 reloc. +-This is the 5 bits of a value. +-@end deffn +-@deffn {} BFD_RELOC_XGATE_RL_JUMP +-Freescale XGATE reloc. +-This reloc marks the beginning of a bra/jal instruction. +-@end deffn +-@deffn {} BFD_RELOC_XGATE_RL_GROUP +-Freescale XGATE reloc. +-This reloc marks a group of several instructions that gcc generates +-and for which the linker relaxation pass can modify and/or remove +-some of them. +-@end deffn +-@deffn {} BFD_RELOC_XGATE_LO16 +-Freescale XGATE reloc. +-This is the 16-bit lower part of an address. It is used for the '16-bit' +-instructions. +-@end deffn +-@deffn {} BFD_RELOC_XGATE_GPAGE +-Freescale XGATE reloc. +-@end deffn +-@deffn {} BFD_RELOC_XGATE_24 +-Freescale XGATE reloc. +-@end deffn +-@deffn {} BFD_RELOC_XGATE_PCREL_9 +-Freescale XGATE reloc. +-This is a 9-bit pc-relative reloc. +-@end deffn +-@deffn {} BFD_RELOC_XGATE_PCREL_10 +-Freescale XGATE reloc. +-This is a 10-bit pc-relative reloc. +-@end deffn +-@deffn {} BFD_RELOC_XGATE_IMM8_LO +-Freescale XGATE reloc. +-This is the 16-bit lower part of an address. It is used for the '16-bit' +-instructions. +-@end deffn +-@deffn {} BFD_RELOC_XGATE_IMM8_HI +-Freescale XGATE reloc. +-This is the 16-bit higher part of an address. It is used for the '16-bit' +-instructions. +-@end deffn +-@deffn {} BFD_RELOC_XGATE_IMM3 +-Freescale XGATE reloc. +-This is a 3-bit pc-relative reloc. +-@end deffn +-@deffn {} BFD_RELOC_XGATE_IMM4 +-Freescale XGATE reloc. +-This is a 4-bit pc-relative reloc. +-@end deffn +-@deffn {} BFD_RELOC_XGATE_IMM5 +-Freescale XGATE reloc. +-This is a 5-bit pc-relative reloc. +-@end deffn +-@deffn {} BFD_RELOC_M68HC12_9B +-Motorola 68HC12 reloc. +-This is the 9 bits of a value. +-@end deffn +-@deffn {} BFD_RELOC_M68HC12_16B +-Motorola 68HC12 reloc. +-This is the 16 bits of a value. +-@end deffn +-@deffn {} BFD_RELOC_M68HC12_9_PCREL +-Motorola 68HC12/XGATE reloc. +-This is a PCREL9 branch. +-@end deffn +-@deffn {} BFD_RELOC_M68HC12_10_PCREL +-Motorola 68HC12/XGATE reloc. +-This is a PCREL10 branch. +-@end deffn +-@deffn {} BFD_RELOC_M68HC12_LO8XG +-Motorola 68HC12/XGATE reloc. +-This is the 8 bit low part of an absolute address and immediately precedes +-a matching HI8XG part. +-@end deffn +-@deffn {} BFD_RELOC_M68HC12_HI8XG +-Motorola 68HC12/XGATE reloc. +-This is the 8 bit high part of an absolute address and immediately follows +-a matching LO8XG part. +-@end deffn +-@deffn {} BFD_RELOC_16C_NUM08 +-@deffnx {} BFD_RELOC_16C_NUM08_C +-@deffnx {} BFD_RELOC_16C_NUM16 +-@deffnx {} BFD_RELOC_16C_NUM16_C +-@deffnx {} BFD_RELOC_16C_NUM32 +-@deffnx {} BFD_RELOC_16C_NUM32_C +-@deffnx {} BFD_RELOC_16C_DISP04 +-@deffnx {} BFD_RELOC_16C_DISP04_C +-@deffnx {} BFD_RELOC_16C_DISP08 +-@deffnx {} BFD_RELOC_16C_DISP08_C +-@deffnx {} BFD_RELOC_16C_DISP16 +-@deffnx {} BFD_RELOC_16C_DISP16_C +-@deffnx {} BFD_RELOC_16C_DISP24 +-@deffnx {} BFD_RELOC_16C_DISP24_C +-@deffnx {} BFD_RELOC_16C_DISP24a +-@deffnx {} BFD_RELOC_16C_DISP24a_C +-@deffnx {} BFD_RELOC_16C_REG04 +-@deffnx {} BFD_RELOC_16C_REG04_C +-@deffnx {} BFD_RELOC_16C_REG04a +-@deffnx {} BFD_RELOC_16C_REG04a_C +-@deffnx {} BFD_RELOC_16C_REG14 +-@deffnx {} BFD_RELOC_16C_REG14_C +-@deffnx {} BFD_RELOC_16C_REG16 +-@deffnx {} BFD_RELOC_16C_REG16_C +-@deffnx {} BFD_RELOC_16C_REG20 +-@deffnx {} BFD_RELOC_16C_REG20_C +-@deffnx {} BFD_RELOC_16C_ABS20 +-@deffnx {} BFD_RELOC_16C_ABS20_C +-@deffnx {} BFD_RELOC_16C_ABS24 +-@deffnx {} BFD_RELOC_16C_ABS24_C +-@deffnx {} BFD_RELOC_16C_IMM04 +-@deffnx {} BFD_RELOC_16C_IMM04_C +-@deffnx {} BFD_RELOC_16C_IMM16 +-@deffnx {} BFD_RELOC_16C_IMM16_C +-@deffnx {} BFD_RELOC_16C_IMM20 +-@deffnx {} BFD_RELOC_16C_IMM20_C +-@deffnx {} BFD_RELOC_16C_IMM24 +-@deffnx {} BFD_RELOC_16C_IMM24_C +-@deffnx {} BFD_RELOC_16C_IMM32 +-@deffnx {} BFD_RELOC_16C_IMM32_C +-NS CR16C Relocations. +-@end deffn +-@deffn {} BFD_RELOC_CR16_NUM8 +-@deffnx {} BFD_RELOC_CR16_NUM16 +-@deffnx {} BFD_RELOC_CR16_NUM32 +-@deffnx {} BFD_RELOC_CR16_NUM32a +-@deffnx {} BFD_RELOC_CR16_REGREL0 +-@deffnx {} BFD_RELOC_CR16_REGREL4 +-@deffnx {} BFD_RELOC_CR16_REGREL4a +-@deffnx {} BFD_RELOC_CR16_REGREL14 +-@deffnx {} BFD_RELOC_CR16_REGREL14a +-@deffnx {} BFD_RELOC_CR16_REGREL16 +-@deffnx {} BFD_RELOC_CR16_REGREL20 +-@deffnx {} BFD_RELOC_CR16_REGREL20a +-@deffnx {} BFD_RELOC_CR16_ABS20 +-@deffnx {} BFD_RELOC_CR16_ABS24 +-@deffnx {} BFD_RELOC_CR16_IMM4 +-@deffnx {} BFD_RELOC_CR16_IMM8 +-@deffnx {} BFD_RELOC_CR16_IMM16 +-@deffnx {} BFD_RELOC_CR16_IMM20 +-@deffnx {} BFD_RELOC_CR16_IMM24 +-@deffnx {} BFD_RELOC_CR16_IMM32 +-@deffnx {} BFD_RELOC_CR16_IMM32a +-@deffnx {} BFD_RELOC_CR16_DISP4 +-@deffnx {} BFD_RELOC_CR16_DISP8 +-@deffnx {} BFD_RELOC_CR16_DISP16 +-@deffnx {} BFD_RELOC_CR16_DISP20 +-@deffnx {} BFD_RELOC_CR16_DISP24 +-@deffnx {} BFD_RELOC_CR16_DISP24a +-@deffnx {} BFD_RELOC_CR16_SWITCH8 +-@deffnx {} BFD_RELOC_CR16_SWITCH16 +-@deffnx {} BFD_RELOC_CR16_SWITCH32 +-@deffnx {} BFD_RELOC_CR16_GOT_REGREL20 +-@deffnx {} BFD_RELOC_CR16_GOTC_REGREL20 +-@deffnx {} BFD_RELOC_CR16_GLOB_DAT +-NS CR16 Relocations. +-@end deffn +-@deffn {} BFD_RELOC_CRX_REL4 +-@deffnx {} BFD_RELOC_CRX_REL8 +-@deffnx {} BFD_RELOC_CRX_REL8_CMP +-@deffnx {} BFD_RELOC_CRX_REL16 +-@deffnx {} BFD_RELOC_CRX_REL24 +-@deffnx {} BFD_RELOC_CRX_REL32 +-@deffnx {} BFD_RELOC_CRX_REGREL12 +-@deffnx {} BFD_RELOC_CRX_REGREL22 +-@deffnx {} BFD_RELOC_CRX_REGREL28 +-@deffnx {} BFD_RELOC_CRX_REGREL32 +-@deffnx {} BFD_RELOC_CRX_ABS16 +-@deffnx {} BFD_RELOC_CRX_ABS32 +-@deffnx {} BFD_RELOC_CRX_NUM8 +-@deffnx {} BFD_RELOC_CRX_NUM16 +-@deffnx {} BFD_RELOC_CRX_NUM32 +-@deffnx {} BFD_RELOC_CRX_IMM16 +-@deffnx {} BFD_RELOC_CRX_IMM32 +-@deffnx {} BFD_RELOC_CRX_SWITCH8 +-@deffnx {} BFD_RELOC_CRX_SWITCH16 +-@deffnx {} BFD_RELOC_CRX_SWITCH32 +-NS CRX Relocations. +-@end deffn +-@deffn {} BFD_RELOC_CRIS_BDISP8 +-@deffnx {} BFD_RELOC_CRIS_UNSIGNED_5 +-@deffnx {} BFD_RELOC_CRIS_SIGNED_6 +-@deffnx {} BFD_RELOC_CRIS_UNSIGNED_6 +-@deffnx {} BFD_RELOC_CRIS_SIGNED_8 +-@deffnx {} BFD_RELOC_CRIS_UNSIGNED_8 +-@deffnx {} BFD_RELOC_CRIS_SIGNED_16 +-@deffnx {} BFD_RELOC_CRIS_UNSIGNED_16 +-@deffnx {} BFD_RELOC_CRIS_LAPCQ_OFFSET +-@deffnx {} BFD_RELOC_CRIS_UNSIGNED_4 +-These relocs are only used within the CRIS assembler. They are not +-(at present) written to any object files. +-@end deffn +-@deffn {} BFD_RELOC_CRIS_COPY +-@deffnx {} BFD_RELOC_CRIS_GLOB_DAT +-@deffnx {} BFD_RELOC_CRIS_JUMP_SLOT +-@deffnx {} BFD_RELOC_CRIS_RELATIVE +-Relocs used in ELF shared libraries for CRIS. +-@end deffn +-@deffn {} BFD_RELOC_CRIS_32_GOT +-32-bit offset to symbol-entry within GOT. +-@end deffn +-@deffn {} BFD_RELOC_CRIS_16_GOT +-16-bit offset to symbol-entry within GOT. +-@end deffn +-@deffn {} BFD_RELOC_CRIS_32_GOTPLT +-32-bit offset to symbol-entry within GOT, with PLT handling. +-@end deffn +-@deffn {} BFD_RELOC_CRIS_16_GOTPLT +-16-bit offset to symbol-entry within GOT, with PLT handling. +-@end deffn +-@deffn {} BFD_RELOC_CRIS_32_GOTREL +-32-bit offset to symbol, relative to GOT. +-@end deffn +-@deffn {} BFD_RELOC_CRIS_32_PLT_GOTREL +-32-bit offset to symbol with PLT entry, relative to GOT. +-@end deffn +-@deffn {} BFD_RELOC_CRIS_32_PLT_PCREL +-32-bit offset to symbol with PLT entry, relative to this relocation. +-@end deffn +-@deffn {} BFD_RELOC_CRIS_32_GOT_GD +-@deffnx {} BFD_RELOC_CRIS_16_GOT_GD +-@deffnx {} BFD_RELOC_CRIS_32_GD +-@deffnx {} BFD_RELOC_CRIS_DTP +-@deffnx {} BFD_RELOC_CRIS_32_DTPREL +-@deffnx {} BFD_RELOC_CRIS_16_DTPREL +-@deffnx {} BFD_RELOC_CRIS_32_GOT_TPREL +-@deffnx {} BFD_RELOC_CRIS_16_GOT_TPREL +-@deffnx {} BFD_RELOC_CRIS_32_TPREL +-@deffnx {} BFD_RELOC_CRIS_16_TPREL +-@deffnx {} BFD_RELOC_CRIS_DTPMOD +-@deffnx {} BFD_RELOC_CRIS_32_IE +-Relocs used in TLS code for CRIS. +-@end deffn +-@deffn {} BFD_RELOC_860_COPY +-@deffnx {} BFD_RELOC_860_GLOB_DAT +-@deffnx {} BFD_RELOC_860_JUMP_SLOT +-@deffnx {} BFD_RELOC_860_RELATIVE +-@deffnx {} BFD_RELOC_860_PC26 +-@deffnx {} BFD_RELOC_860_PLT26 +-@deffnx {} BFD_RELOC_860_PC16 +-@deffnx {} BFD_RELOC_860_LOW0 +-@deffnx {} BFD_RELOC_860_SPLIT0 +-@deffnx {} BFD_RELOC_860_LOW1 +-@deffnx {} BFD_RELOC_860_SPLIT1 +-@deffnx {} BFD_RELOC_860_LOW2 +-@deffnx {} BFD_RELOC_860_SPLIT2 +-@deffnx {} BFD_RELOC_860_LOW3 +-@deffnx {} BFD_RELOC_860_LOGOT0 +-@deffnx {} BFD_RELOC_860_SPGOT0 +-@deffnx {} BFD_RELOC_860_LOGOT1 +-@deffnx {} BFD_RELOC_860_SPGOT1 +-@deffnx {} BFD_RELOC_860_LOGOTOFF0 +-@deffnx {} BFD_RELOC_860_SPGOTOFF0 +-@deffnx {} BFD_RELOC_860_LOGOTOFF1 +-@deffnx {} BFD_RELOC_860_SPGOTOFF1 +-@deffnx {} BFD_RELOC_860_LOGOTOFF2 +-@deffnx {} BFD_RELOC_860_LOGOTOFF3 +-@deffnx {} BFD_RELOC_860_LOPC +-@deffnx {} BFD_RELOC_860_HIGHADJ +-@deffnx {} BFD_RELOC_860_HAGOT +-@deffnx {} BFD_RELOC_860_HAGOTOFF +-@deffnx {} BFD_RELOC_860_HAPC +-@deffnx {} BFD_RELOC_860_HIGH +-@deffnx {} BFD_RELOC_860_HIGOT +-@deffnx {} BFD_RELOC_860_HIGOTOFF +-Intel i860 Relocations. +-@end deffn +-@deffn {} BFD_RELOC_OPENRISC_ABS_26 +-@deffnx {} BFD_RELOC_OPENRISC_REL_26 +-OpenRISC Relocations. +-@end deffn +-@deffn {} BFD_RELOC_H8_DIR16A8 +-@deffnx {} BFD_RELOC_H8_DIR16R8 +-@deffnx {} BFD_RELOC_H8_DIR24A8 +-@deffnx {} BFD_RELOC_H8_DIR24R8 +-@deffnx {} BFD_RELOC_H8_DIR32A16 +-@deffnx {} BFD_RELOC_H8_DISP32A16 +-H8 elf Relocations. +-@end deffn +-@deffn {} BFD_RELOC_XSTORMY16_REL_12 +-@deffnx {} BFD_RELOC_XSTORMY16_12 +-@deffnx {} BFD_RELOC_XSTORMY16_24 +-@deffnx {} BFD_RELOC_XSTORMY16_FPTR16 +-Sony Xstormy16 Relocations. +-@end deffn +-@deffn {} BFD_RELOC_RELC +-Self-describing complex relocations. +-@end deffn +-@deffn {} BFD_RELOC_XC16X_PAG +-@deffnx {} BFD_RELOC_XC16X_POF +-@deffnx {} BFD_RELOC_XC16X_SEG +-@deffnx {} BFD_RELOC_XC16X_SOF +-Infineon Relocations. +-@end deffn +-@deffn {} BFD_RELOC_VAX_GLOB_DAT +-@deffnx {} BFD_RELOC_VAX_JMP_SLOT +-@deffnx {} BFD_RELOC_VAX_RELATIVE +-Relocations used by VAX ELF. +-@end deffn +-@deffn {} BFD_RELOC_MT_PC16 +-Morpho MT - 16 bit immediate relocation. +-@end deffn +-@deffn {} BFD_RELOC_MT_HI16 +-Morpho MT - Hi 16 bits of an address. +-@end deffn +-@deffn {} BFD_RELOC_MT_LO16 +-Morpho MT - Low 16 bits of an address. +-@end deffn +-@deffn {} BFD_RELOC_MT_GNU_VTINHERIT +-Morpho MT - Used to tell the linker which vtable entries are used. +-@end deffn +-@deffn {} BFD_RELOC_MT_GNU_VTENTRY +-Morpho MT - Used to tell the linker which vtable entries are used. +-@end deffn +-@deffn {} BFD_RELOC_MT_PCINSN8 +-Morpho MT - 8 bit immediate relocation. +-@end deffn +-@deffn {} BFD_RELOC_MSP430_10_PCREL +-@deffnx {} BFD_RELOC_MSP430_16_PCREL +-@deffnx {} BFD_RELOC_MSP430_16 +-@deffnx {} BFD_RELOC_MSP430_16_PCREL_BYTE +-@deffnx {} BFD_RELOC_MSP430_16_BYTE +-@deffnx {} BFD_RELOC_MSP430_2X_PCREL +-@deffnx {} BFD_RELOC_MSP430_RL_PCREL +-@deffnx {} BFD_RELOC_MSP430_ABS8 +-@deffnx {} BFD_RELOC_MSP430X_PCR20_EXT_SRC +-@deffnx {} BFD_RELOC_MSP430X_PCR20_EXT_DST +-@deffnx {} BFD_RELOC_MSP430X_PCR20_EXT_ODST +-@deffnx {} BFD_RELOC_MSP430X_ABS20_EXT_SRC +-@deffnx {} BFD_RELOC_MSP430X_ABS20_EXT_DST +-@deffnx {} BFD_RELOC_MSP430X_ABS20_EXT_ODST +-@deffnx {} BFD_RELOC_MSP430X_ABS20_ADR_SRC +-@deffnx {} BFD_RELOC_MSP430X_ABS20_ADR_DST +-@deffnx {} BFD_RELOC_MSP430X_PCR16 +-@deffnx {} BFD_RELOC_MSP430X_PCR20_CALL +-@deffnx {} BFD_RELOC_MSP430X_ABS16 +-@deffnx {} BFD_RELOC_MSP430_ABS_HI16 +-@deffnx {} BFD_RELOC_MSP430_PREL31 +-@deffnx {} BFD_RELOC_MSP430_SYM_DIFF +-msp430 specific relocation codes +-@end deffn +-@deffn {} BFD_RELOC_NIOS2_S16 +-@deffnx {} BFD_RELOC_NIOS2_U16 +-@deffnx {} BFD_RELOC_NIOS2_CALL26 +-@deffnx {} BFD_RELOC_NIOS2_IMM5 +-@deffnx {} BFD_RELOC_NIOS2_CACHE_OPX +-@deffnx {} BFD_RELOC_NIOS2_IMM6 +-@deffnx {} BFD_RELOC_NIOS2_IMM8 +-@deffnx {} BFD_RELOC_NIOS2_HI16 +-@deffnx {} BFD_RELOC_NIOS2_LO16 +-@deffnx {} BFD_RELOC_NIOS2_HIADJ16 +-@deffnx {} BFD_RELOC_NIOS2_GPREL +-@deffnx {} BFD_RELOC_NIOS2_UJMP +-@deffnx {} BFD_RELOC_NIOS2_CJMP +-@deffnx {} BFD_RELOC_NIOS2_CALLR +-@deffnx {} BFD_RELOC_NIOS2_ALIGN +-@deffnx {} BFD_RELOC_NIOS2_GOT16 +-@deffnx {} BFD_RELOC_NIOS2_CALL16 +-@deffnx {} BFD_RELOC_NIOS2_GOTOFF_LO +-@deffnx {} BFD_RELOC_NIOS2_GOTOFF_HA +-@deffnx {} BFD_RELOC_NIOS2_PCREL_LO +-@deffnx {} BFD_RELOC_NIOS2_PCREL_HA +-@deffnx {} BFD_RELOC_NIOS2_TLS_GD16 +-@deffnx {} BFD_RELOC_NIOS2_TLS_LDM16 +-@deffnx {} BFD_RELOC_NIOS2_TLS_LDO16 +-@deffnx {} BFD_RELOC_NIOS2_TLS_IE16 +-@deffnx {} BFD_RELOC_NIOS2_TLS_LE16 +-@deffnx {} BFD_RELOC_NIOS2_TLS_DTPMOD +-@deffnx {} BFD_RELOC_NIOS2_TLS_DTPREL +-@deffnx {} BFD_RELOC_NIOS2_TLS_TPREL +-@deffnx {} BFD_RELOC_NIOS2_COPY +-@deffnx {} BFD_RELOC_NIOS2_GLOB_DAT +-@deffnx {} BFD_RELOC_NIOS2_JUMP_SLOT +-@deffnx {} BFD_RELOC_NIOS2_RELATIVE +-@deffnx {} BFD_RELOC_NIOS2_GOTOFF +-Relocations used by the Altera Nios II core. +-@end deffn +-@deffn {} BFD_RELOC_IQ2000_OFFSET_16 +-@deffnx {} BFD_RELOC_IQ2000_OFFSET_21 +-@deffnx {} BFD_RELOC_IQ2000_UHI16 +-IQ2000 Relocations. +-@end deffn +-@deffn {} BFD_RELOC_XTENSA_RTLD +-Special Xtensa relocation used only by PLT entries in ELF shared +-objects to indicate that the runtime linker should set the value +-to one of its own internal functions or data structures. +-@end deffn +-@deffn {} BFD_RELOC_XTENSA_GLOB_DAT +-@deffnx {} BFD_RELOC_XTENSA_JMP_SLOT +-@deffnx {} BFD_RELOC_XTENSA_RELATIVE +-Xtensa relocations for ELF shared objects. +-@end deffn +-@deffn {} BFD_RELOC_XTENSA_PLT +-Xtensa relocation used in ELF object files for symbols that may require +-PLT entries. Otherwise, this is just a generic 32-bit relocation. +-@end deffn +-@deffn {} BFD_RELOC_XTENSA_DIFF8 +-@deffnx {} BFD_RELOC_XTENSA_DIFF16 +-@deffnx {} BFD_RELOC_XTENSA_DIFF32 +-Xtensa relocations to mark the difference of two local symbols. +-These are only needed to support linker relaxation and can be ignored +-when not relaxing. The field is set to the value of the difference +-assuming no relaxation. The relocation encodes the position of the +-first symbol so the linker can determine whether to adjust the field +-value. +-@end deffn +-@deffn {} BFD_RELOC_XTENSA_SLOT0_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT1_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT2_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT3_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT4_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT5_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT6_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT7_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT8_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT9_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT10_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT11_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT12_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT13_OP +-@deffnx {} BFD_RELOC_XTENSA_SLOT14_OP +-Generic Xtensa relocations for instruction operands. Only the slot +-number is encoded in the relocation. The relocation applies to the +-last PC-relative immediate operand, or if there are no PC-relative +-immediates, to the last immediate operand. +-@end deffn +-@deffn {} BFD_RELOC_XTENSA_SLOT0_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT1_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT2_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT3_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT4_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT5_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT6_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT7_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT8_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT9_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT10_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT11_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT12_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT13_ALT +-@deffnx {} BFD_RELOC_XTENSA_SLOT14_ALT +-Alternate Xtensa relocations. Only the slot is encoded in the +-relocation. The meaning of these relocations is opcode-specific. +-@end deffn +-@deffn {} BFD_RELOC_XTENSA_OP0 +-@deffnx {} BFD_RELOC_XTENSA_OP1 +-@deffnx {} BFD_RELOC_XTENSA_OP2 +-Xtensa relocations for backward compatibility. These have all been +-replaced by BFD_RELOC_XTENSA_SLOT0_OP. +-@end deffn +-@deffn {} BFD_RELOC_XTENSA_ASM_EXPAND +-Xtensa relocation to mark that the assembler expanded the +-instructions from an original target. The expansion size is +-encoded in the reloc size. +-@end deffn +-@deffn {} BFD_RELOC_XTENSA_ASM_SIMPLIFY +-Xtensa relocation to mark that the linker should simplify +-assembler-expanded instructions. This is commonly used +-internally by the linker after analysis of a +-BFD_RELOC_XTENSA_ASM_EXPAND. +-@end deffn +-@deffn {} BFD_RELOC_XTENSA_TLSDESC_FN +-@deffnx {} BFD_RELOC_XTENSA_TLSDESC_ARG +-@deffnx {} BFD_RELOC_XTENSA_TLS_DTPOFF +-@deffnx {} BFD_RELOC_XTENSA_TLS_TPOFF +-@deffnx {} BFD_RELOC_XTENSA_TLS_FUNC +-@deffnx {} BFD_RELOC_XTENSA_TLS_ARG +-@deffnx {} BFD_RELOC_XTENSA_TLS_CALL +-Xtensa TLS relocations. +-@end deffn +-@deffn {} BFD_RELOC_Z80_DISP8 +-8 bit signed offset in (ix+d) or (iy+d). +-@end deffn +-@deffn {} BFD_RELOC_Z8K_DISP7 +-DJNZ offset. +-@end deffn +-@deffn {} BFD_RELOC_Z8K_CALLR +-CALR offset. +-@end deffn +-@deffn {} BFD_RELOC_Z8K_IMM4L +-4 bit value. +-@end deffn +-@deffn {} BFD_RELOC_LM32_CALL +-@deffnx {} BFD_RELOC_LM32_BRANCH +-@deffnx {} BFD_RELOC_LM32_16_GOT +-@deffnx {} BFD_RELOC_LM32_GOTOFF_HI16 +-@deffnx {} BFD_RELOC_LM32_GOTOFF_LO16 +-@deffnx {} BFD_RELOC_LM32_COPY +-@deffnx {} BFD_RELOC_LM32_GLOB_DAT +-@deffnx {} BFD_RELOC_LM32_JMP_SLOT +-@deffnx {} BFD_RELOC_LM32_RELATIVE +-Lattice Mico32 relocations. +-@end deffn +-@deffn {} BFD_RELOC_MACH_O_SECTDIFF +-Difference between two section addreses. Must be followed by a +-BFD_RELOC_MACH_O_PAIR. +-@end deffn +-@deffn {} BFD_RELOC_MACH_O_LOCAL_SECTDIFF +-Like BFD_RELOC_MACH_O_SECTDIFF but with a local symbol. +-@end deffn +-@deffn {} BFD_RELOC_MACH_O_PAIR +-Pair of relocation. Contains the first symbol. +-@end deffn +-@deffn {} BFD_RELOC_MACH_O_X86_64_BRANCH32 +-@deffnx {} BFD_RELOC_MACH_O_X86_64_BRANCH8 +-PCREL relocations. They are marked as branch to create PLT entry if +-required. +-@end deffn +-@deffn {} BFD_RELOC_MACH_O_X86_64_GOT +-Used when referencing a GOT entry. +-@end deffn +-@deffn {} BFD_RELOC_MACH_O_X86_64_GOT_LOAD +-Used when loading a GOT entry with movq. It is specially marked so that +-the linker could optimize the movq to a leaq if possible. +-@end deffn +-@deffn {} BFD_RELOC_MACH_O_X86_64_SUBTRACTOR32 +-Symbol will be substracted. Must be followed by a BFD_RELOC_64. +-@end deffn +-@deffn {} BFD_RELOC_MACH_O_X86_64_SUBTRACTOR64 +-Symbol will be substracted. Must be followed by a BFD_RELOC_64. +-@end deffn +-@deffn {} BFD_RELOC_MACH_O_X86_64_PCREL32_1 +-Same as BFD_RELOC_32_PCREL but with an implicit -1 addend. +-@end deffn +-@deffn {} BFD_RELOC_MACH_O_X86_64_PCREL32_2 +-Same as BFD_RELOC_32_PCREL but with an implicit -2 addend. +-@end deffn +-@deffn {} BFD_RELOC_MACH_O_X86_64_PCREL32_4 +-Same as BFD_RELOC_32_PCREL but with an implicit -4 addend. +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_32_LO +-This is a 32 bit reloc for the microblaze that stores the +-low 16 bits of a value +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_32_LO_PCREL +-This is a 32 bit pc-relative reloc for the microblaze that +-stores the low 16 bits of a value +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_32_ROSDA +-This is a 32 bit reloc for the microblaze that stores a +-value relative to the read-only small data area anchor +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_32_RWSDA +-This is a 32 bit reloc for the microblaze that stores a +-value relative to the read-write small data area anchor +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM +-This is a 32 bit reloc for the microblaze to handle +-expressions of the form "Symbol Op Symbol" +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_64_NONE +-This is a 64 bit reloc that stores the 32 bit pc relative +-value in two words (with an imm instruction). No relocation is +-done here - only used for relaxing +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_64_GOTPC +-This is a 64 bit reloc that stores the 32 bit pc relative +-value in two words (with an imm instruction). The relocation is +-PC-relative GOT offset +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_64_GOT +-This is a 64 bit reloc that stores the 32 bit pc relative +-value in two words (with an imm instruction). The relocation is +-GOT offset +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_64_PLT +-This is a 64 bit reloc that stores the 32 bit pc relative +-value in two words (with an imm instruction). The relocation is +-PC-relative offset into PLT +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_64_GOTOFF +-This is a 64 bit reloc that stores the 32 bit GOT relative +-value in two words (with an imm instruction). The relocation is +-relative offset from _GLOBAL_OFFSET_TABLE_ +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_32_GOTOFF +-This is a 32 bit reloc that stores the 32 bit GOT relative +-value in a word. The relocation is relative offset from +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_COPY +-This is used to tell the dynamic linker to copy the value out of +-the dynamic object into the runtime process image. +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_64_TLS +-Unused Reloc +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_64_TLSGD +-This is a 64 bit reloc that stores the 32 bit GOT relative value +-of the GOT TLS GD info entry in two words (with an imm instruction). The +-relocation is GOT offset. +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_64_TLSLD +-This is a 64 bit reloc that stores the 32 bit GOT relative value +-of the GOT TLS LD info entry in two words (with an imm instruction). The +-relocation is GOT offset. +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_32_TLSDTPMOD +-This is a 32 bit reloc that stores the Module ID to GOT(n). +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_32_TLSDTPREL +-This is a 32 bit reloc that stores TLS offset to GOT(n+1). +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_64_TLSDTPREL +-This is a 32 bit reloc for storing TLS offset to two words (uses imm +-instruction) +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_64_TLSGOTTPREL +-This is a 64 bit reloc that stores 32-bit thread pointer relative offset +-to two words (uses imm instruction). +-@end deffn +-@deffn {} BFD_RELOC_MICROBLAZE_64_TLSTPREL +-This is a 64 bit reloc that stores 32-bit thread pointer relative offset +-to two words (uses imm instruction). +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_RELOC_START +-AArch64 pseudo relocation code to mark the start of the AArch64 +-relocation enumerators. N.B. the order of the enumerators is +-important as several tables in the AArch64 bfd backend are indexed +-by these enumerators; make sure they are all synced. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_NONE +-AArch64 null relocation code. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_64 +-@deffnx {} BFD_RELOC_AARCH64_32 +-@deffnx {} BFD_RELOC_AARCH64_16 +-Basic absolute relocations of N bits. These are equivalent to +-BFD_RELOC_N and they were added to assist the indexing of the howto +-table. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_64_PCREL +-@deffnx {} BFD_RELOC_AARCH64_32_PCREL +-@deffnx {} BFD_RELOC_AARCH64_16_PCREL +-PC-relative relocations. These are equivalent to BFD_RELOC_N_PCREL +-and they were added to assist the indexing of the howto table. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_MOVW_G0 +-AArch64 MOV[NZK] instruction with most significant bits 0 to 15 +-of an unsigned address/value. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_MOVW_G0_NC +-AArch64 MOV[NZK] instruction with less significant bits 0 to 15 of +-an address/value. No overflow checking. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_MOVW_G1 +-AArch64 MOV[NZK] instruction with most significant bits 16 to 31 +-of an unsigned address/value. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_MOVW_G1_NC +-AArch64 MOV[NZK] instruction with less significant bits 16 to 31 +-of an address/value. No overflow checking. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_MOVW_G2 +-AArch64 MOV[NZK] instruction with most significant bits 32 to 47 +-of an unsigned address/value. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_MOVW_G2_NC +-AArch64 MOV[NZK] instruction with less significant bits 32 to 47 +-of an address/value. No overflow checking. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_MOVW_G3 +-AArch64 MOV[NZK] instruction with most signficant bits 48 to 64 +-of a signed or unsigned address/value. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_MOVW_G0_S +-AArch64 MOV[NZ] instruction with most significant bits 0 to 15 +-of a signed value. Changes instruction to MOVZ or MOVN depending on the +-value's sign. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_MOVW_G1_S +-AArch64 MOV[NZ] instruction with most significant bits 16 to 31 +-of a signed value. Changes instruction to MOVZ or MOVN depending on the +-value's sign. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_MOVW_G2_S +-AArch64 MOV[NZ] instruction with most significant bits 32 to 47 +-of a signed value. Changes instruction to MOVZ or MOVN depending on the +-value's sign. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_LD_LO19_PCREL +-AArch64 Load Literal instruction, holding a 19 bit pc-relative word +-offset. The lowest two bits must be zero and are not stored in the +-instruction, giving a 21 bit signed byte offset. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_ADR_LO21_PCREL +-AArch64 ADR instruction, holding a simple 21 bit pc-relative byte offset. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_ADR_HI21_PCREL +-AArch64 ADRP instruction, with bits 12 to 32 of a pc-relative page +-offset, giving a 4KB aligned page base address. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL +-AArch64 ADRP instruction, with bits 12 to 32 of a pc-relative page +-offset, giving a 4KB aligned page base address, but with no overflow +-checking. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_ADD_LO12 +-AArch64 ADD immediate instruction, holding bits 0 to 11 of the address. +-Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_LDST8_LO12 +-AArch64 8-bit load/store instruction, holding bits 0 to 11 of the +-address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TSTBR14 +-AArch64 14 bit pc-relative test bit and branch. +-The lowest two bits must be zero and are not stored in the instruction, +-giving a 16 bit signed byte offset. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_BRANCH19 +-AArch64 19 bit pc-relative conditional branch and compare & branch. +-The lowest two bits must be zero and are not stored in the instruction, +-giving a 21 bit signed byte offset. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_JUMP26 +-AArch64 26 bit pc-relative unconditional branch. +-The lowest two bits must be zero and are not stored in the instruction, +-giving a 28 bit signed byte offset. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_CALL26 +-AArch64 26 bit pc-relative unconditional branch and link. +-The lowest two bits must be zero and are not stored in the instruction, +-giving a 28 bit signed byte offset. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_LDST16_LO12 +-AArch64 16-bit load/store instruction, holding bits 0 to 11 of the +-address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_LDST32_LO12 +-AArch64 32-bit load/store instruction, holding bits 0 to 11 of the +-address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_LDST64_LO12 +-AArch64 64-bit load/store instruction, holding bits 0 to 11 of the +-address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_LDST128_LO12 +-AArch64 128-bit load/store instruction, holding bits 0 to 11 of the +-address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_GOT_LD_PREL19 +-AArch64 Load Literal instruction, holding a 19 bit PC relative word +-offset of the global offset table entry for a symbol. The lowest two +-bits must be zero and are not stored in the instruction, giving a 21 +-bit signed byte offset. This relocation type requires signed overflow +-checking. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_ADR_GOT_PAGE +-Get to the page base of the global offset table entry for a symbol as +-part of an ADRP instruction using a 21 bit PC relative value.Used in +-conjunction with BFD_RELOC_AARCH64_LD64_GOT_LO12_NC. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_LD64_GOT_LO12_NC +-Unsigned 12 bit byte offset for 64 bit load/store from the page of +-the GOT entry for this symbol. Used in conjunction with +-BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in LP64 ABI only. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_LD32_GOT_LO12_NC +-Unsigned 12 bit byte offset for 32 bit load/store from the page of +-the GOT entry for this symbol. Used in conjunction with +-BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in ILP32 ABI only. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21 +-Get to the page base of the global offset table entry for a symbols +-tls_index structure as part of an adrp instruction using a 21 bit PC +-relative value. Used in conjunction with +-BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC +-Unsigned 12 bit byte offset to global offset table entry for a symbols +-tls_index structure. Used in conjunction with +-BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1 +-AArch64 TLS INITIAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC +-AArch64 TLS INITIAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 +-AArch64 TLS INITIAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC +-AArch64 TLS INITIAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC +-AArch64 TLS INITIAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19 +-AArch64 TLS INITIAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2 +-AArch64 TLS LOCAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1 +-AArch64 TLS LOCAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC +-AArch64 TLS LOCAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0 +-AArch64 TLS LOCAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC +-AArch64 TLS LOCAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12 +-AArch64 TLS LOCAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12 +-AArch64 TLS LOCAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC +-AArch64 TLS LOCAL EXEC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSDESC_LD_PREL19 +-AArch64 TLS DESC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21 +-AArch64 TLS DESC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21 +-AArch64 TLS DESC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC +-AArch64 TLS DESC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC +-AArch64 TLS DESC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC +-AArch64 TLS DESC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSDESC_OFF_G1 +-AArch64 TLS DESC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC +-AArch64 TLS DESC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSDESC_LDR +-AArch64 TLS DESC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSDESC_ADD +-AArch64 TLS DESC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSDESC_CALL +-AArch64 TLS DESC relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_COPY +-AArch64 TLS relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_GLOB_DAT +-AArch64 TLS relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_JUMP_SLOT +-AArch64 TLS relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_RELATIVE +-AArch64 TLS relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLS_DTPMOD +-AArch64 TLS relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLS_DTPREL +-AArch64 TLS relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLS_TPREL +-AArch64 TLS relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSDESC +-AArch64 TLS relocation. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_IRELATIVE +-AArch64 support for STT_GNU_IFUNC. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_RELOC_END +-AArch64 pseudo relocation code to mark the end of the AArch64 +-relocation enumerators that have direct mapping to ELF reloc codes. +-There are a few more enumerators after this one; those are mainly +-used by the AArch64 assembler for the internal fixup or to select +-one of the above enumerators. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP +-AArch64 pseudo relocation code to be used internally by the AArch64 +-assembler and not (currently) written to any object files. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_LDST_LO12 +-AArch64 unspecified load/store instruction, holding bits 0 to 11 of the +-address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_LD_GOT_LO12_NC +-AArch64 pseudo relocation code to be used internally by the AArch64 +-assembler and not (currently) written to any object files. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC +-AArch64 pseudo relocation code to be used internally by the AArch64 +-assembler and not (currently) written to any object files. +-@end deffn +-@deffn {} BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC +-AArch64 pseudo relocation code to be used internally by the AArch64 +-assembler and not (currently) written to any object files. +-@end deffn +-@deffn {} BFD_RELOC_TILEPRO_COPY +-@deffnx {} BFD_RELOC_TILEPRO_GLOB_DAT +-@deffnx {} BFD_RELOC_TILEPRO_JMP_SLOT +-@deffnx {} BFD_RELOC_TILEPRO_RELATIVE +-@deffnx {} BFD_RELOC_TILEPRO_BROFF_X1 +-@deffnx {} BFD_RELOC_TILEPRO_JOFFLONG_X1 +-@deffnx {} BFD_RELOC_TILEPRO_JOFFLONG_X1_PLT +-@deffnx {} BFD_RELOC_TILEPRO_IMM8_X0 +-@deffnx {} BFD_RELOC_TILEPRO_IMM8_Y0 +-@deffnx {} BFD_RELOC_TILEPRO_IMM8_X1 +-@deffnx {} BFD_RELOC_TILEPRO_IMM8_Y1 +-@deffnx {} BFD_RELOC_TILEPRO_DEST_IMM8_X1 +-@deffnx {} BFD_RELOC_TILEPRO_MT_IMM15_X1 +-@deffnx {} BFD_RELOC_TILEPRO_MF_IMM15_X1 +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0 +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1 +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_LO +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_LO +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_HI +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_HI +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_HA +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_HA +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_PCREL +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_PCREL +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_LO_PCREL +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_LO_PCREL +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_HI_PCREL +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_HI_PCREL +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_HA_PCREL +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_HA_PCREL +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_GOT +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_GOT +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_GOT_LO +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_GOT_LO +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_GOT_HI +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_GOT_HI +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_GOT_HA +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_GOT_HA +-@deffnx {} BFD_RELOC_TILEPRO_MMSTART_X0 +-@deffnx {} BFD_RELOC_TILEPRO_MMEND_X0 +-@deffnx {} BFD_RELOC_TILEPRO_MMSTART_X1 +-@deffnx {} BFD_RELOC_TILEPRO_MMEND_X1 +-@deffnx {} BFD_RELOC_TILEPRO_SHAMT_X0 +-@deffnx {} BFD_RELOC_TILEPRO_SHAMT_X1 +-@deffnx {} BFD_RELOC_TILEPRO_SHAMT_Y0 +-@deffnx {} BFD_RELOC_TILEPRO_SHAMT_Y1 +-@deffnx {} BFD_RELOC_TILEPRO_TLS_GD_CALL +-@deffnx {} BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD +-@deffnx {} BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD +-@deffnx {} BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD +-@deffnx {} BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD +-@deffnx {} BFD_RELOC_TILEPRO_TLS_IE_LOAD +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA +-@deffnx {} BFD_RELOC_TILEPRO_TLS_DTPMOD32 +-@deffnx {} BFD_RELOC_TILEPRO_TLS_DTPOFF32 +-@deffnx {} BFD_RELOC_TILEPRO_TLS_TPOFF32 +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA +-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA +-Tilera TILEPro Relocations. +-@end deffn +-@deffn {} BFD_RELOC_TILEGX_HW0 +-@deffnx {} BFD_RELOC_TILEGX_HW1 +-@deffnx {} BFD_RELOC_TILEGX_HW2 +-@deffnx {} BFD_RELOC_TILEGX_HW3 +-@deffnx {} BFD_RELOC_TILEGX_HW0_LAST +-@deffnx {} BFD_RELOC_TILEGX_HW1_LAST +-@deffnx {} BFD_RELOC_TILEGX_HW2_LAST +-@deffnx {} BFD_RELOC_TILEGX_COPY +-@deffnx {} BFD_RELOC_TILEGX_GLOB_DAT +-@deffnx {} BFD_RELOC_TILEGX_JMP_SLOT +-@deffnx {} BFD_RELOC_TILEGX_RELATIVE +-@deffnx {} BFD_RELOC_TILEGX_BROFF_X1 +-@deffnx {} BFD_RELOC_TILEGX_JUMPOFF_X1 +-@deffnx {} BFD_RELOC_TILEGX_JUMPOFF_X1_PLT +-@deffnx {} BFD_RELOC_TILEGX_IMM8_X0 +-@deffnx {} BFD_RELOC_TILEGX_IMM8_Y0 +-@deffnx {} BFD_RELOC_TILEGX_IMM8_X1 +-@deffnx {} BFD_RELOC_TILEGX_IMM8_Y1 +-@deffnx {} BFD_RELOC_TILEGX_DEST_IMM8_X1 +-@deffnx {} BFD_RELOC_TILEGX_MT_IMM14_X1 +-@deffnx {} BFD_RELOC_TILEGX_MF_IMM14_X1 +-@deffnx {} BFD_RELOC_TILEGX_MMSTART_X0 +-@deffnx {} BFD_RELOC_TILEGX_MMEND_X0 +-@deffnx {} BFD_RELOC_TILEGX_SHAMT_X0 +-@deffnx {} BFD_RELOC_TILEGX_SHAMT_X1 +-@deffnx {} BFD_RELOC_TILEGX_SHAMT_Y0 +-@deffnx {} BFD_RELOC_TILEGX_SHAMT_Y1 +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0 +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0 +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1 +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1 +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW2 +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW2 +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW3 +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW3 +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW2_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW2_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW3_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW3_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_GOT +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_GOT +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW2_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW2_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_GOT +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_GOT +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_GOT +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_GOT +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW3_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW3_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE +-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE +-@deffnx {} BFD_RELOC_TILEGX_TLS_DTPMOD64 +-@deffnx {} BFD_RELOC_TILEGX_TLS_DTPOFF64 +-@deffnx {} BFD_RELOC_TILEGX_TLS_TPOFF64 +-@deffnx {} BFD_RELOC_TILEGX_TLS_DTPMOD32 +-@deffnx {} BFD_RELOC_TILEGX_TLS_DTPOFF32 +-@deffnx {} BFD_RELOC_TILEGX_TLS_TPOFF32 +-@deffnx {} BFD_RELOC_TILEGX_TLS_GD_CALL +-@deffnx {} BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD +-@deffnx {} BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD +-@deffnx {} BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD +-@deffnx {} BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD +-@deffnx {} BFD_RELOC_TILEGX_TLS_IE_LOAD +-@deffnx {} BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD +-@deffnx {} BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD +-@deffnx {} BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD +-@deffnx {} BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD +-Tilera TILE-Gx Relocations. +-@end deffn +-@deffn {} BFD_RELOC_EPIPHANY_SIMM8 +-Adapteva EPIPHANY - 8 bit signed pc-relative displacement +-@end deffn +-@deffn {} BFD_RELOC_EPIPHANY_SIMM24 +-Adapteva EPIPHANY - 24 bit signed pc-relative displacement +-@end deffn +-@deffn {} BFD_RELOC_EPIPHANY_HIGH +-Adapteva EPIPHANY - 16 most-significant bits of absolute address +-@end deffn +-@deffn {} BFD_RELOC_EPIPHANY_LOW +-Adapteva EPIPHANY - 16 least-significant bits of absolute address +-@end deffn +-@deffn {} BFD_RELOC_EPIPHANY_SIMM11 +-Adapteva EPIPHANY - 11 bit signed number - add/sub immediate +-@end deffn +-@deffn {} BFD_RELOC_EPIPHANY_IMM11 +-Adapteva EPIPHANY - 11 bit sign-magnitude number (ld/st displacement) +-@end deffn +-@deffn {} BFD_RELOC_EPIPHANY_IMM8 +-Adapteva EPIPHANY - 8 bit immediate for 16 bit mov instruction. +-@end deffn +- +-@example +- +-typedef enum bfd_reloc_code_real bfd_reloc_code_real_type; +-@end example +-@findex bfd_reloc_type_lookup +-@subsubsection @code{bfd_reloc_type_lookup} +-@strong{Synopsis} +-@example +-reloc_howto_type *bfd_reloc_type_lookup +- (bfd *abfd, bfd_reloc_code_real_type code); +-reloc_howto_type *bfd_reloc_name_lookup +- (bfd *abfd, const char *reloc_name); +-@end example +-@strong{Description}@* +-Return a pointer to a howto structure which, when +-invoked, will perform the relocation @var{code} on data from the +-architecture noted. +- +-@findex bfd_default_reloc_type_lookup +-@subsubsection @code{bfd_default_reloc_type_lookup} +-@strong{Synopsis} +-@example +-reloc_howto_type *bfd_default_reloc_type_lookup +- (bfd *abfd, bfd_reloc_code_real_type code); +-@end example +-@strong{Description}@* +-Provides a default relocation lookup routine for any architecture. +- +-@findex bfd_get_reloc_code_name +-@subsubsection @code{bfd_get_reloc_code_name} +-@strong{Synopsis} +-@example +-const char *bfd_get_reloc_code_name (bfd_reloc_code_real_type code); +-@end example +-@strong{Description}@* +-Provides a printable name for the supplied relocation code. +-Useful mainly for printing error messages. +- +-@findex bfd_generic_relax_section +-@subsubsection @code{bfd_generic_relax_section} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_generic_relax_section +- (bfd *abfd, +- asection *section, +- struct bfd_link_info *, +- bfd_boolean *); +-@end example +-@strong{Description}@* +-Provides default handling for relaxing for back ends which +-don't do relaxing. +- +-@findex bfd_generic_gc_sections +-@subsubsection @code{bfd_generic_gc_sections} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_generic_gc_sections +- (bfd *, struct bfd_link_info *); +-@end example +-@strong{Description}@* +-Provides default handling for relaxing for back ends which +-don't do section gc -- i.e., does nothing. +- +-@findex bfd_generic_lookup_section_flags +-@subsubsection @code{bfd_generic_lookup_section_flags} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_generic_lookup_section_flags +- (struct bfd_link_info *, struct flag_info *, asection *); +-@end example +-@strong{Description}@* +-Provides default handling for section flags lookup +--- i.e., does nothing. +-Returns FALSE if the section should be omitted, otherwise TRUE. +- +-@findex bfd_generic_merge_sections +-@subsubsection @code{bfd_generic_merge_sections} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_generic_merge_sections +- (bfd *, struct bfd_link_info *); +-@end example +-@strong{Description}@* +-Provides default handling for SEC_MERGE section merging for back ends +-which don't have SEC_MERGE support -- i.e., does nothing. +- +-@findex bfd_generic_get_relocated_section_contents +-@subsubsection @code{bfd_generic_get_relocated_section_contents} +-@strong{Synopsis} +-@example +-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, +- bfd_boolean relocatable, +- asymbol **symbols); +-@end example +-@strong{Description}@* +-Provides default handling of relocation effort for back ends +-which can't be bothered to do it efficiently. +- +diff -Nur binutils-2.24.orig/bfd/doc/section.texi binutils-2.24/bfd/doc/section.texi +--- binutils-2.24.orig/bfd/doc/section.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/section.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,1035 +0,0 @@ +-@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 @code{section.c}. +- +-@menu +-* Section Input:: +-* Section Output:: +-* typedef asection:: +-* section prototypes:: +-@end menu +- +-@node 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, @code{a.out} would contain at least +-three sections, called @code{.text}, @code{.data} and @code{.bss}. +- +-Names need not be unique; for example a COFF file may have several +-sections named @code{.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 +-@code{bfd_make_section}) to the sections attached to an already open +-BFD. For example, the linker creates an extra section +-@code{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 @code{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. +- +-@node 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 @code{bfd_set_section_contents}. +- +-Any program that creates or combines sections (e.g., the assembler +-and linker) must use the @code{asection} fields @code{output_section} and +-@code{output_offset} to indicate the file sections to which each +-section must be written. (If the section is being created from +-scratch, @code{output_section} should probably point to the section +-itself and @code{output_offset} should probably be zero.) +- +-The data to be written comes from input sections attached +-(via @code{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 @code{asection} +-structures would look like: +- +-@example +- 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 --------| +-@end example +- +-@subsection Link orders +-The data within a section is stored in a @dfn{link_order}. +-These are much like the fixups in @code{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. +- +- +-@node typedef asection, section prototypes, Section Output, Sections +-@subsection typedef asection +-Here is the section structure: +- +- +-@example +- +-typedef struct bfd_section +-@{ +- /* 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; +- +- /* A unique sequence number. */ +- int id; +- +- /* Which section in the bfd; 0..n-1 as sections are created in a bfd. */ +- int index; +- +- /* The next section in the list belonging to the BFD, or NULL. */ +- struct bfd_section *next; +- +- /* The previous section in the list belonging to the BFD, or NULL. */ +- struct bfd_section *prev; +- +- /* 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 +- +- /* A signal to the OS that the section contains read only data. */ +-#define SEC_READONLY 0x008 +- +- /* The section contains code only. */ +-#define SEC_CODE 0x010 +- +- /* The section contains data only. */ +-#define SEC_DATA 0x020 +- +- /* The section will reside in ROM. */ +-#define SEC_ROM 0x040 +- +- /* The section contains constructor information. This section +- type is used by the linker to create lists of constructors and +- destructors used by @code{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., @code{__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 @code{__CTOR_LIST__} and relocate the data +- contained within - exactly the operations it would peform on +- standard data. */ +-#define SEC_CONSTRUCTOR 0x080 +- +- /* The section has contents - a data section could be +- @code{SEC_ALLOC} | @code{SEC_HAS_CONTENTS}; a debug section could be +- @code{SEC_HAS_CONTENTS} */ +-#define SEC_HAS_CONTENTS 0x100 +- +- /* An instruction to the linker to not output the section +- even if it has information which would normally be written. */ +-#define SEC_NEVER_LOAD 0x200 +- +- /* The section contains thread local data. */ +-#define SEC_THREAD_LOCAL 0x400 +- +- /* The section has GOT references. This flag is only for the +- linker, and is currently only used by the elf32-hppa back end. +- It will be set if global offset table references were detected +- in this section, which indicate to the linker that the section +- contains PIC code, and must be handled specially when doing a +- static link. */ +-#define SEC_HAS_GOT_REF 0x800 +- +- /* The section contains common symbols (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 0x1000 +- +- /* 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 0x2000 +- +- /* 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 0x4000 +- +- /* 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 0x8000 +- +- /* The contents of this section are to be sorted based on the sum of +- the symbol and addend values specified by the associated relocation +- entries. Entries without associated relocation entries will be +- appended to the end of the section in an unspecified order. */ +-#define SEC_SORT_ENTRIES 0x10000 +- +- /* When linking, duplicate sections of the same name should be +- discarded, rather than being combined into a single section as +- is usually done. This is similar to how common symbols are +- handled. See SEC_LINK_DUPLICATES below. */ +-#define SEC_LINK_ONCE 0x20000 +- +- /* If SEC_LINK_ONCE is set, this bitfield describes how the linker +- should handle duplicate sections. */ +-#define SEC_LINK_DUPLICATES 0xc0000 +- +- /* This value for SEC_LINK_DUPLICATES means that duplicate +- sections with the same name should simply be discarded. */ +-#define SEC_LINK_DUPLICATES_DISCARD 0x0 +- +- /* This value for SEC_LINK_DUPLICATES means that the linker +- should warn if there are any duplicate sections, although +- it should still only link one copy. */ +-#define SEC_LINK_DUPLICATES_ONE_ONLY 0x40000 +- +- /* This value for SEC_LINK_DUPLICATES means that the linker +- should warn if any duplicate sections are a different size. */ +-#define SEC_LINK_DUPLICATES_SAME_SIZE 0x80000 +- +- /* This value for SEC_LINK_DUPLICATES means that the linker +- should warn if any duplicate sections contain different +- contents. */ +-#define SEC_LINK_DUPLICATES_SAME_CONTENTS \ +- (SEC_LINK_DUPLICATES_ONE_ONLY | SEC_LINK_DUPLICATES_SAME_SIZE) +- +- /* This section was created by the linker as part of dynamic +- relocation or other arcane processing. It is skipped when +- going through the first-pass output, trusting that someone +- else up the line will take care of it later. */ +-#define SEC_LINKER_CREATED 0x100000 +- +- /* This section should not be subject to garbage collection. +- Also set to inform the linker that this section should not be +- listed in the link map as discarded. */ +-#define SEC_KEEP 0x200000 +- +- /* This section contains "short" data, and should be placed +- "near" the GP. */ +-#define SEC_SMALL_DATA 0x400000 +- +- /* Attempt to merge identical entities in the section. +- Entity size is given in the entsize field. */ +-#define SEC_MERGE 0x800000 +- +- /* If given with SEC_MERGE, entities to merge are zero terminated +- strings where entsize specifies character size instead of fixed +- size entries. */ +-#define SEC_STRINGS 0x1000000 +- +- /* This section contains data about section groups. */ +-#define SEC_GROUP 0x2000000 +- +- /* 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 0x4000000 +- +- /* This input section should be copied to output in reverse order +- as an array of pointers. This is for ELF linker internal use +- only. */ +-#define SEC_ELF_REVERSE_COPY 0x4000000 +- +- /* This section contains data which may be shared with other +- executables or shared objects. This is for COFF only. */ +-#define SEC_COFF_SHARED 0x8000000 +- +- /* When a section with this flag is being linked, then if the size of +- the input section is less than a page, it should not cross a page +- boundary. If the size of the input section is one page or more, +- it should be aligned on a page boundary. This is for TI +- TMS320C54X only. */ +-#define SEC_TIC54X_BLOCK 0x10000000 +- +- /* Conditionally link this section; do not link if there are no +- references found to any symbol in the section. This is for TI +- TMS320C54X only. */ +-#define SEC_TIC54X_CLINK 0x20000000 +- +- /* Indicate that section has the no read flag set. This happens +- when memory read flag isn't set. */ +-#define SEC_COFF_NOREAD 0x40000000 +- +- /* End of section flags. */ +- +- /* Some internal packed boolean fields. */ +- +- /* See the vma field. */ +- unsigned int user_set_vma : 1; +- +- /* A mark flag used by some of the linker backends. */ +- unsigned int linker_mark : 1; +- +- /* Another mark flag used by some of the linker backends. Set for +- output sections that have an input section. */ +- unsigned int linker_has_input : 1; +- +- /* Mark flag used by some linker backends for garbage collection. */ +- unsigned int gc_mark : 1; +- +- /* Section compression status. */ +- unsigned int compress_status : 2; +-#define COMPRESS_SECTION_NONE 0 +-#define COMPRESS_SECTION_DONE 1 +-#define DECOMPRESS_SECTION_SIZED 2 +- +- /* The following flags are used by the ELF linker. */ +- +- /* Mark sections which have been allocated to segments. */ +- unsigned int segment_mark : 1; +- +- /* Type of sec_info information. */ +- unsigned int sec_info_type:3; +-#define SEC_INFO_TYPE_NONE 0 +-#define SEC_INFO_TYPE_STABS 1 +-#define SEC_INFO_TYPE_MERGE 2 +-#define SEC_INFO_TYPE_EH_FRAME 3 +-#define SEC_INFO_TYPE_JUST_SYMS 4 +- +- /* Nonzero if this section uses RELA relocations, rather than REL. */ +- unsigned int use_rela_p:1; +- +- /* Bits used by various backends. The generic code doesn't touch +- these fields. */ +- +- unsigned int sec_flg0:1; +- unsigned int sec_flg1:1; +- unsigned int sec_flg2:1; +- unsigned int sec_flg3:1; +- unsigned int sec_flg4:1; +- unsigned int sec_flg5:1; +- +- /* End of internal packed boolean fields. */ +- +- /* 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 @code{a.out}, where +- the default address for @code{.data} is dependent on the specific +- target and various flags). */ +- bfd_vma 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 octets, as it will be output. +- Contains a value even if the section has no contents (e.g., the +- size of @code{.bss}). */ +- bfd_size_type size; +- +- /* For input sections, the original size on disk of the section, in +- octets. This field should be set for any section whose size is +- changed by linker relaxation. It is required for sections where +- the linker relaxation scheme doesn't cache altered section and +- reloc contents (stabs, eh_frame, SEC_MERGE, some coff relaxing +- targets), and thus the original size needs to be kept to read the +- section multiple times. For output sections, rawsize holds the +- section size calculated on a previous linker relaxation pass. */ +- bfd_size_type rawsize; +- +- /* The compressed size of the section in octets. */ +- bfd_size_type compressed_size; +- +- /* Relaxation table. */ +- struct relax_table *relax; +- +- /* Count of used relaxation table entries. */ +- int relax_count; +- +- +- /* If this section is going to be output, then this value is the +- offset in *bytes* into the output section of the first byte in the +- input section (byte ==> smallest addressable unit on the +- target). In most cases, if this was going to start at the +- 100th octet (8-bit quantity) in the output section, this value +- would be 100. However, if the target byte size is 16 bits +- (bfd_octets_per_byte is "2"), this value would be 50. */ +- bfd_vma output_offset; +- +- /* The output section through which to map on output. */ +- struct bfd_section *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. */ +- void *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; +- +- /* Entity size for merging purposes. */ +- unsigned int entsize; +- +- /* Points to the kept section if this section is a link-once section, +- and is discarded. */ +- struct bfd_section *kept_section; +- +- /* 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; +- +- void *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; +- +- /* A symbol which points at this section only. */ +- struct bfd_symbol *symbol; +- struct bfd_symbol **symbol_ptr_ptr; +- +- /* Early in the link process, map_head and map_tail are used to build +- a list of input sections attached to an output section. Later, +- output sections use these fields for a list of bfd_link_order +- structs. */ +- union @{ +- struct bfd_link_order *link_order; +- struct bfd_section *s; +- @} map_head, map_tail; +-@} asection; +- +-/* Relax table contains information about instructions which can +- be removed by relaxation -- replacing a long address with a +- short address. */ +-struct relax_table @{ +- /* Address where bytes may be deleted. */ +- bfd_vma addr; +- +- /* Number of bytes to be deleted. */ +- int size; +-@}; +- +-/* 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. */ +-extern asection _bfd_std_section[4]; +- +-#define BFD_ABS_SECTION_NAME "*ABS*" +-#define BFD_UND_SECTION_NAME "*UND*" +-#define BFD_COM_SECTION_NAME "*COM*" +-#define BFD_IND_SECTION_NAME "*IND*" +- +-/* Pointer to the common section. */ +-#define bfd_com_section_ptr (&_bfd_std_section[0]) +-/* Pointer to the undefined section. */ +-#define bfd_und_section_ptr (&_bfd_std_section[1]) +-/* Pointer to the absolute section. */ +-#define bfd_abs_section_ptr (&_bfd_std_section[2]) +-/* Pointer to the indirect section. */ +-#define bfd_ind_section_ptr (&_bfd_std_section[3]) +- +-#define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr) +-#define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr) +-#define bfd_is_ind_section(sec) ((sec) == bfd_ind_section_ptr) +- +-#define bfd_is_const_section(SEC) \ +- ( ((SEC) == bfd_abs_section_ptr) \ +- || ((SEC) == bfd_und_section_ptr) \ +- || ((SEC) == bfd_com_section_ptr) \ +- || ((SEC) == bfd_ind_section_ptr)) +- +-/* Macros to handle insertion and deletion of a bfd's sections. These +- only handle the list pointers, ie. do not adjust section_count, +- target_index etc. */ +-#define bfd_section_list_remove(ABFD, S) \ +- do \ +- @{ \ +- asection *_s = S; \ +- asection *_next = _s->next; \ +- asection *_prev = _s->prev; \ +- if (_prev) \ +- _prev->next = _next; \ +- else \ +- (ABFD)->sections = _next; \ +- if (_next) \ +- _next->prev = _prev; \ +- else \ +- (ABFD)->section_last = _prev; \ +- @} \ +- while (0) +-#define bfd_section_list_append(ABFD, S) \ +- do \ +- @{ \ +- asection *_s = S; \ +- bfd *_abfd = ABFD; \ +- _s->next = NULL; \ +- if (_abfd->section_last) \ +- @{ \ +- _s->prev = _abfd->section_last; \ +- _abfd->section_last->next = _s; \ +- @} \ +- else \ +- @{ \ +- _s->prev = NULL; \ +- _abfd->sections = _s; \ +- @} \ +- _abfd->section_last = _s; \ +- @} \ +- while (0) +-#define bfd_section_list_prepend(ABFD, S) \ +- do \ +- @{ \ +- asection *_s = S; \ +- bfd *_abfd = ABFD; \ +- _s->prev = NULL; \ +- if (_abfd->sections) \ +- @{ \ +- _s->next = _abfd->sections; \ +- _abfd->sections->prev = _s; \ +- @} \ +- else \ +- @{ \ +- _s->next = NULL; \ +- _abfd->section_last = _s; \ +- @} \ +- _abfd->sections = _s; \ +- @} \ +- while (0) +-#define bfd_section_list_insert_after(ABFD, A, S) \ +- do \ +- @{ \ +- asection *_a = A; \ +- asection *_s = S; \ +- asection *_next = _a->next; \ +- _s->next = _next; \ +- _s->prev = _a; \ +- _a->next = _s; \ +- if (_next) \ +- _next->prev = _s; \ +- else \ +- (ABFD)->section_last = _s; \ +- @} \ +- while (0) +-#define bfd_section_list_insert_before(ABFD, B, S) \ +- do \ +- @{ \ +- asection *_b = B; \ +- asection *_s = S; \ +- asection *_prev = _b->prev; \ +- _s->prev = _prev; \ +- _s->next = _b; \ +- _b->prev = _s; \ +- if (_prev) \ +- _prev->next = _s; \ +- else \ +- (ABFD)->sections = _s; \ +- @} \ +- while (0) +-#define bfd_section_removed_from_list(ABFD, S) \ +- ((S)->next == NULL ? (ABFD)->section_last != (S) : (S)->next->prev != (S)) +- +-#define BFD_FAKE_SECTION(SEC, FLAGS, SYM, NAME, IDX) \ +- /* name, id, index, next, prev, flags, user_set_vma, */ \ +- @{ NAME, IDX, 0, NULL, NULL, FLAGS, 0, \ +- \ +- /* linker_mark, linker_has_input, gc_mark, decompress_status, */ \ +- 0, 0, 1, 0, \ +- \ +- /* segment_mark, sec_info_type, use_rela_p, */ \ +- 0, 0, 0, \ +- \ +- /* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, */ \ +- 0, 0, 0, 0, 0, 0, \ +- \ +- /* vma, lma, size, rawsize, compressed_size, relax, relax_count, */ \ +- 0, 0, 0, 0, 0, 0, 0, \ +- \ +- /* output_offset, output_section, alignment_power, */ \ +- 0, &SEC, 0, \ +- \ +- /* relocation, orelocation, reloc_count, filepos, rel_filepos, */ \ +- NULL, NULL, 0, 0, 0, \ +- \ +- /* line_filepos, userdata, contents, lineno, lineno_count, */ \ +- 0, NULL, NULL, NULL, 0, \ +- \ +- /* entsize, kept_section, moving_line_filepos, */ \ +- 0, NULL, 0, \ +- \ +- /* target_index, used_by_bfd, constructor_chain, owner, */ \ +- 0, NULL, NULL, NULL, \ +- \ +- /* symbol, symbol_ptr_ptr, */ \ +- (struct bfd_symbol *) SYM, &SEC.symbol, \ +- \ +- /* map_head, map_tail */ \ +- @{ NULL @}, @{ NULL @} \ +- @} +- +-@end example +- +-@node section prototypes, , typedef asection, Sections +-@subsection Section prototypes +-These are the functions exported by the section handling part of BFD. +- +-@findex bfd_section_list_clear +-@subsubsection @code{bfd_section_list_clear} +-@strong{Synopsis} +-@example +-void bfd_section_list_clear (bfd *); +-@end example +-@strong{Description}@* +-Clears the section list, and also resets the section count and +-hash table entries. +- +-@findex bfd_get_section_by_name +-@subsubsection @code{bfd_get_section_by_name} +-@strong{Synopsis} +-@example +-asection *bfd_get_section_by_name (bfd *abfd, const char *name); +-@end example +-@strong{Description}@* +-Return the most recently created section attached to @var{abfd} +-named @var{name}. Return NULL if no such section exists. +- +-@findex bfd_get_next_section_by_name +-@subsubsection @code{bfd_get_next_section_by_name} +-@strong{Synopsis} +-@example +-asection *bfd_get_next_section_by_name (asection *sec); +-@end example +-@strong{Description}@* +-Given @var{sec} is a section returned by @code{bfd_get_section_by_name}, +-return the next most recently created section attached to the same +-BFD with the same name. Return NULL if no such section exists. +- +-@findex bfd_get_linker_section +-@subsubsection @code{bfd_get_linker_section} +-@strong{Synopsis} +-@example +-asection *bfd_get_linker_section (bfd *abfd, const char *name); +-@end example +-@strong{Description}@* +-Return the linker created section attached to @var{abfd} +-named @var{name}. Return NULL if no such section exists. +- +-@findex bfd_get_section_by_name_if +-@subsubsection @code{bfd_get_section_by_name_if} +-@strong{Synopsis} +-@example +-asection *bfd_get_section_by_name_if +- (bfd *abfd, +- const char *name, +- bfd_boolean (*func) (bfd *abfd, asection *sect, void *obj), +- void *obj); +-@end example +-@strong{Description}@* +-Call the provided function @var{func} for each section +-attached to the BFD @var{abfd} whose name matches @var{name}, +-passing @var{obj} as an argument. The function will be called +-as if by +- +-@example +- func (abfd, the_section, obj); +-@end example +- +-It returns the first section for which @var{func} returns true, +-otherwise @code{NULL}. +- +-@findex bfd_get_unique_section_name +-@subsubsection @code{bfd_get_unique_section_name} +-@strong{Synopsis} +-@example +-char *bfd_get_unique_section_name +- (bfd *abfd, const char *templat, int *count); +-@end example +-@strong{Description}@* +-Invent a section name that is unique in @var{abfd} by tacking +-a dot and a digit suffix onto the original @var{templat}. If +-@var{count} is non-NULL, then it specifies the first number +-tried as a suffix to generate a unique name. The value +-pointed to by @var{count} will be incremented in this case. +- +-@findex bfd_make_section_old_way +-@subsubsection @code{bfd_make_section_old_way} +-@strong{Synopsis} +-@example +-asection *bfd_make_section_old_way (bfd *abfd, const char *name); +-@end example +-@strong{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: +-@itemize @bullet +- +-@item +-@code{bfd_error_invalid_operation} - +-If output has already started for this BFD. +-@item +-@code{bfd_error_no_memory} - +-If memory allocation fails. +-@end itemize +- +-@findex bfd_make_section_anyway_with_flags +-@subsubsection @code{bfd_make_section_anyway_with_flags} +-@strong{Synopsis} +-@example +-asection *bfd_make_section_anyway_with_flags +- (bfd *abfd, const char *name, flagword flags); +-@end example +-@strong{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. Also set the attributes of the +-new section to the value @var{flags}. +- +-Return @code{NULL} and set @code{bfd_error} on error; possible errors are: +-@itemize @bullet +- +-@item +-@code{bfd_error_invalid_operation} - If output has already started for @var{abfd}. +-@item +-@code{bfd_error_no_memory} - If memory allocation fails. +-@end itemize +- +-@findex bfd_make_section_anyway +-@subsubsection @code{bfd_make_section_anyway} +-@strong{Synopsis} +-@example +-asection *bfd_make_section_anyway (bfd *abfd, const char *name); +-@end example +-@strong{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 @code{NULL} and set @code{bfd_error} on error; possible errors are: +-@itemize @bullet +- +-@item +-@code{bfd_error_invalid_operation} - If output has already started for @var{abfd}. +-@item +-@code{bfd_error_no_memory} - If memory allocation fails. +-@end itemize +- +-@findex bfd_make_section_with_flags +-@subsubsection @code{bfd_make_section_with_flags} +-@strong{Synopsis} +-@example +-asection *bfd_make_section_with_flags +- (bfd *, const char *name, flagword flags); +-@end example +-@strong{Description}@* +-Like @code{bfd_make_section_anyway}, but return @code{NULL} (without calling +-bfd_set_error ()) without changing the section chain if there is already a +-section named @var{name}. Also set the attributes of the new section to +-the value @var{flags}. If there is an error, return @code{NULL} and set +-@code{bfd_error}. +- +-@findex bfd_make_section +-@subsubsection @code{bfd_make_section} +-@strong{Synopsis} +-@example +-asection *bfd_make_section (bfd *, const char *name); +-@end example +-@strong{Description}@* +-Like @code{bfd_make_section_anyway}, but return @code{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 @code{NULL} and set +-@code{bfd_error}. +- +-@findex bfd_set_section_flags +-@subsubsection @code{bfd_set_section_flags} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_set_section_flags +- (bfd *abfd, asection *sec, flagword flags); +-@end example +-@strong{Description}@* +-Set the attributes of the section @var{sec} in the BFD +-@var{abfd} to the value @var{flags}. Return @code{TRUE} on success, +-@code{FALSE} on error. Possible error returns are: +- +-@itemize @bullet +- +-@item +-@code{bfd_error_invalid_operation} - +-The section cannot have one or more of the attributes +-requested. For example, a .bss section in @code{a.out} may not +-have the @code{SEC_HAS_CONTENTS} field set. +-@end itemize +- +-@findex bfd_rename_section +-@subsubsection @code{bfd_rename_section} +-@strong{Synopsis} +-@example +-void bfd_rename_section +- (bfd *abfd, asection *sec, const char *newname); +-@end example +-@strong{Description}@* +-Rename section @var{sec} in @var{abfd} to @var{newname}. +- +-@findex bfd_map_over_sections +-@subsubsection @code{bfd_map_over_sections} +-@strong{Synopsis} +-@example +-void bfd_map_over_sections +- (bfd *abfd, +- void (*func) (bfd *abfd, asection *sect, void *obj), +- void *obj); +-@end example +-@strong{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 +- +-@example +- func (abfd, the_section, obj); +-@end example +- +-This is the preferred method for iterating over sections; an +-alternative would be to use a loop: +- +-@example +- asection *p; +- for (p = abfd->sections; p != NULL; p = p->next) +- func (abfd, p, ...) +-@end example +- +-@findex bfd_sections_find_if +-@subsubsection @code{bfd_sections_find_if} +-@strong{Synopsis} +-@example +-asection *bfd_sections_find_if +- (bfd *abfd, +- bfd_boolean (*operation) (bfd *abfd, asection *sect, void *obj), +- void *obj); +-@end example +-@strong{Description}@* +-Call the provided function @var{operation} for each section +-attached to the BFD @var{abfd}, passing @var{obj} as an +-argument. The function will be called as if by +- +-@example +- operation (abfd, the_section, obj); +-@end example +- +-It returns the first section for which @var{operation} returns true. +- +-@findex bfd_set_section_size +-@subsubsection @code{bfd_set_section_size} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_set_section_size +- (bfd *abfd, asection *sec, bfd_size_type val); +-@end example +-@strong{Description}@* +-Set @var{sec} to the size @var{val}. If the operation is +-ok, then @code{TRUE} is returned, else @code{FALSE}. +- +-Possible error returns: +-@itemize @bullet +- +-@item +-@code{bfd_error_invalid_operation} - +-Writing has started to the BFD, so setting the size is invalid. +-@end itemize +- +-@findex bfd_set_section_contents +-@subsubsection @code{bfd_set_section_contents} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_set_section_contents +- (bfd *abfd, asection *section, const void *data, +- file_ptr offset, bfd_size_type count); +-@end example +-@strong{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} octets. +- +-Normally @code{TRUE} is returned, else @code{FALSE}. Possible error +-returns are: +-@itemize @bullet +- +-@item +-@code{bfd_error_no_contents} - +-The output section does not have the @code{SEC_HAS_CONTENTS} +-attribute, so nothing can be written to it. +-@item +-and some more too +-@end itemize +-This routine is front end to the back end function +-@code{_bfd_set_section_contents}. +- +-@findex bfd_get_section_contents +-@subsubsection @code{bfd_get_section_contents} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_get_section_contents +- (bfd *abfd, asection *section, void *location, file_ptr offset, +- bfd_size_type count); +-@end example +-@strong{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 @code{SEC_CONSTRUCTOR} +-flag set are requested or if the section does not have the +-@code{SEC_HAS_CONTENTS} flag set, then the @var{location} is filled +-with zeroes. If no errors occur, @code{TRUE} is returned, else +-@code{FALSE}. +- +-@findex bfd_malloc_and_get_section +-@subsubsection @code{bfd_malloc_and_get_section} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_malloc_and_get_section +- (bfd *abfd, asection *section, bfd_byte **buf); +-@end example +-@strong{Description}@* +-Read all data from @var{section} in BFD @var{abfd} +-into a buffer, *@var{buf}, malloc'd by this function. +- +-@findex bfd_copy_private_section_data +-@subsubsection @code{bfd_copy_private_section_data} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_copy_private_section_data +- (bfd *ibfd, asection *isec, bfd *obfd, asection *osec); +-@end example +-@strong{Description}@* +-Copy private section information from @var{isec} in the BFD +-@var{ibfd} to the section @var{osec} in the BFD @var{obfd}. +-Return @code{TRUE} on success, @code{FALSE} on error. Possible error +-returns are: +- +-@itemize @bullet +- +-@item +-@code{bfd_error_no_memory} - +-Not enough memory exists to create private data for @var{osec}. +-@end itemize +-@example +-#define bfd_copy_private_section_data(ibfd, isection, obfd, osection) \ +- BFD_SEND (obfd, _bfd_copy_private_section_data, \ +- (ibfd, isection, obfd, osection)) +-@end example +- +-@findex bfd_generic_is_group_section +-@subsubsection @code{bfd_generic_is_group_section} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_generic_is_group_section (bfd *, const asection *sec); +-@end example +-@strong{Description}@* +-Returns TRUE if @var{sec} is a member of a group. +- +-@findex bfd_generic_discard_group +-@subsubsection @code{bfd_generic_discard_group} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_generic_discard_group (bfd *abfd, asection *group); +-@end example +-@strong{Description}@* +-Remove all members of @var{group} from the output. +- +diff -Nur binutils-2.24.orig/bfd/doc/syms.texi binutils-2.24/bfd/doc/syms.texi +--- binutils-2.24.orig/bfd/doc/syms.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/syms.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,480 +0,0 @@ +-@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 @code{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 @code{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 +- +-@node 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: +- +-@example +- 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 = 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]); +-@end example +- +-All storage for the symbols themselves is in an objalloc +-connected to the BFD; it is freed when the BFD is closed. +- +-@node 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 @code{bfd_make_empty_symbol}. Here is an +-example showing the creation of a symbol table with only one element: +- +-@example +- #include "sysdep.h" +- #include "bfd.h" +- int main (void) +- @{ +- 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] = 0; +- +- bfd_set_symtab (abfd, ptrs, 1); +- bfd_close (abfd); +- return 0; +- @} +- +- ./makesym +- nm foo +- 00012345 A dummy_symbol +-@end example +- +-Many formats cannot represent arbitrary symbol information; for +-instance, the @code{a.out} object format does not allow an +-arbitrary number of sections. A symbol pointing to a section +-which is not one of @code{.text}, @code{.data} or @code{.bss} cannot +-be described. +- +-@node 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 @code{bfd_read_minisymbols} function will read the symbols +-into memory in an internal form. It will return a @code{void *} +-pointer to a block of memory, a symbol count, and the size of +-each symbol. The pointer is allocated using @code{malloc}, and +-should be freed by the caller when it is no longer needed. +- +-The function @code{bfd_minisymbol_to_symbol} will take a pointer +-to a minisymbol, and a pointer to a structure returned by +-@code{bfd_make_empty_symbol}, and return a @code{asymbol} structure. +-The return value may or may not be the same as the value from +-@code{bfd_make_empty_symbol} which was passed in. +- +- +-@node typedef asymbol, symbol handling functions, Mini Symbols, Symbols +-@subsection typedef asymbol +-An @code{asymbol} has the form: +- +- +-@example +- +-typedef struct bfd_symbol +-@{ +- /* 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; @code{static} in @code{C}. The value +- is the offset into the section of the data. */ +-#define BSF_LOCAL (1 << 0) +- +- /* The symbol has global scope; initialized data in @code{C}. The +- value is the offset into the section of the data. */ +-#define BSF_GLOBAL (1 << 1) +- +- /* 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: +- @code{BSF_LOCAL}, @code{BSF_COMMON}, @code{BSF_UNDEFINED} or +- @code{BSF_GLOBAL}. */ +- +- /* The symbol is a debugging record. The value has an arbitrary +- meaning, unless BSF_DEBUGGING_RELOC is also set. */ +-#define BSF_DEBUGGING (1 << 2) +- +- /* The symbol denotes a function entry point. Used in ELF, +- perhaps others someday. */ +-#define BSF_FUNCTION (1 << 3) +- +- /* Used by the linker. */ +-#define BSF_KEEP (1 << 5) +-#define BSF_KEEP_G (1 << 6) +- +- /* A weak global symbol, overridable without warnings by +- a regular global symbol of the same name. */ +-#define BSF_WEAK (1 << 7) +- +- /* This symbol was created to point to a section, e.g. ELF's +- STT_SECTION symbols. */ +-#define BSF_SECTION_SYM (1 << 8) +- +- /* The symbol used to be a common symbol, but now it is +- allocated. */ +-#define BSF_OLD_COMMON (1 << 9) +- +- /* In some files the type of a symbol sometimes alters its +- location in an output file - ie in coff a @code{ISFCN} symbol +- which is also @code{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 (1 << 10) +- +- /* Signal that the symbol is the label of constructor section. */ +-#define BSF_CONSTRUCTOR (1 << 11) +- +- /* 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 (1 << 12) +- +- /* 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 (1 << 13) +- +- /* BSF_FILE marks symbols that contain a file name. This is used +- for ELF STT_FILE symbols. */ +-#define BSF_FILE (1 << 14) +- +- /* Symbol is from dynamic linking information. */ +-#define BSF_DYNAMIC (1 << 15) +- +- /* The symbol denotes a data object. Used in ELF, and perhaps +- others someday. */ +-#define BSF_OBJECT (1 << 16) +- +- /* This symbol is a debugging symbol. The value is the offset +- into the section of the data. BSF_DEBUGGING should be set +- as well. */ +-#define BSF_DEBUGGING_RELOC (1 << 17) +- +- /* This symbol is thread local. Used in ELF. */ +-#define BSF_THREAD_LOCAL (1 << 18) +- +- /* This symbol represents a complex relocation expression, +- with the expression tree serialized in the symbol name. */ +-#define BSF_RELC (1 << 19) +- +- /* This symbol represents a signed complex relocation expression, +- with the expression tree serialized in the symbol name. */ +-#define BSF_SRELC (1 << 20) +- +- /* This symbol was created by bfd_get_synthetic_symtab. */ +-#define BSF_SYNTHETIC (1 << 21) +- +- /* This symbol is an indirect code object. Unrelated to BSF_INDIRECT. +- The dynamic linker will compute the value of this symbol by +- calling the function that it points to. BSF_FUNCTION must +- also be also set. */ +-#define BSF_GNU_INDIRECT_FUNCTION (1 << 22) +- /* This symbol is a globally unique data object. The dynamic linker +- will make sure that in the entire process there is just one symbol +- with this name and type in use. BSF_OBJECT must also be set. */ +-#define BSF_GNU_UNIQUE (1 << 23) +- +- 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 bfd_section *section; +- +- /* Back end special data. */ +- union +- @{ +- void *p; +- bfd_vma i; +- @} +- udata; +-@} +-asymbol; +- +-@end example +- +-@node symbol handling functions, , typedef asymbol, Symbols +-@subsection Symbol handling functions +- +- +-@findex bfd_get_symtab_upper_bound +-@subsubsection @code{bfd_get_symtab_upper_bound} +-@strong{Description}@* +-Return the number of bytes required to store a vector of pointers +-to @code{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. +-@example +-#define bfd_get_symtab_upper_bound(abfd) \ +- BFD_SEND (abfd, _bfd_get_symtab_upper_bound, (abfd)) +- +-@end example +- +-@findex bfd_is_local_label +-@subsubsection @code{bfd_is_local_label} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_is_local_label (bfd *abfd, asymbol *sym); +-@end example +-@strong{Description}@* +-Return TRUE if the given symbol @var{sym} in the BFD @var{abfd} is +-a compiler generated local label, else return FALSE. +- +-@findex bfd_is_local_label_name +-@subsubsection @code{bfd_is_local_label_name} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_is_local_label_name (bfd *abfd, const char *name); +-@end example +-@strong{Description}@* +-Return TRUE if a symbol with the name @var{name} in the BFD +-@var{abfd} is a compiler generated local label, else return +-FALSE. This just checks whether the name has the form of a +-local label. +-@example +-#define bfd_is_local_label_name(abfd, name) \ +- BFD_SEND (abfd, _bfd_is_local_label_name, (abfd, name)) +- +-@end example +- +-@findex bfd_is_target_special_symbol +-@subsubsection @code{bfd_is_target_special_symbol} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_is_target_special_symbol (bfd *abfd, asymbol *sym); +-@end example +-@strong{Description}@* +-Return TRUE iff a symbol @var{sym} in the BFD @var{abfd} is something +-special to the particular target represented by the BFD. Such symbols +-should normally not be mentioned to the user. +-@example +-#define bfd_is_target_special_symbol(abfd, sym) \ +- BFD_SEND (abfd, _bfd_is_target_special_symbol, (abfd, sym)) +- +-@end example +- +-@findex bfd_canonicalize_symtab +-@subsubsection @code{bfd_canonicalize_symtab} +-@strong{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. +-@example +-#define bfd_canonicalize_symtab(abfd, location) \ +- BFD_SEND (abfd, _bfd_canonicalize_symtab, (abfd, location)) +- +-@end example +- +-@findex bfd_set_symtab +-@subsubsection @code{bfd_set_symtab} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_set_symtab +- (bfd *abfd, asymbol **location, unsigned int count); +-@end example +-@strong{Description}@* +-Arrange that when the output BFD @var{abfd} is closed, +-the table @var{location} of @var{count} pointers to symbols +-will be written. +- +-@findex bfd_print_symbol_vandf +-@subsubsection @code{bfd_print_symbol_vandf} +-@strong{Synopsis} +-@example +-void bfd_print_symbol_vandf (bfd *abfd, void *file, asymbol *symbol); +-@end example +-@strong{Description}@* +-Print the value and flags of the @var{symbol} supplied to the +-stream @var{file}. +- +-@findex bfd_make_empty_symbol +-@subsubsection @code{bfd_make_empty_symbol} +-@strong{Description}@* +-Create a new @code{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 @code{asymbol}. Building your own +-@code{asymbol} and pointing to it will not create the private +-information, and will cause problems later on. +-@example +-#define bfd_make_empty_symbol(abfd) \ +- BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd)) +- +-@end example +- +-@findex _bfd_generic_make_empty_symbol +-@subsubsection @code{_bfd_generic_make_empty_symbol} +-@strong{Synopsis} +-@example +-asymbol *_bfd_generic_make_empty_symbol (bfd *); +-@end example +-@strong{Description}@* +-Create a new @code{asymbol} structure for the BFD @var{abfd} +-and return a pointer to it. Used by core file routines, +-binary back-end and anywhere else where no private info +-is needed. +- +-@findex bfd_make_debug_symbol +-@subsubsection @code{bfd_make_debug_symbol} +-@strong{Description}@* +-Create a new @code{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. +-@example +-#define bfd_make_debug_symbol(abfd,ptr,size) \ +- BFD_SEND (abfd, _bfd_make_debug_symbol, (abfd, ptr, size)) +- +-@end example +- +-@findex bfd_decode_symclass +-@subsubsection @code{bfd_decode_symclass} +-@strong{Description}@* +-Return a character corresponding to the symbol +-class of @var{symbol}, or '?' for an unknown class. +- +-@strong{Synopsis} +-@example +-int bfd_decode_symclass (asymbol *symbol); +-@end example +-@findex bfd_is_undefined_symclass +-@subsubsection @code{bfd_is_undefined_symclass} +-@strong{Description}@* +-Returns non-zero if the class symbol returned by +-bfd_decode_symclass represents an undefined symbol. +-Returns zero otherwise. +- +-@strong{Synopsis} +-@example +-bfd_boolean bfd_is_undefined_symclass (int symclass); +-@end example +-@findex bfd_symbol_info +-@subsubsection @code{bfd_symbol_info} +-@strong{Description}@* +-Fill in the basic info about symbol that nm needs. +-Additional info may be added by the back-ends after +-calling this function. +- +-@strong{Synopsis} +-@example +-void bfd_symbol_info (asymbol *symbol, symbol_info *ret); +-@end example +-@findex bfd_copy_private_symbol_data +-@subsubsection @code{bfd_copy_private_symbol_data} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_copy_private_symbol_data +- (bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym); +-@end example +-@strong{Description}@* +-Copy private symbol information from @var{isym} in the BFD +-@var{ibfd} to the symbol @var{osym} in the BFD @var{obfd}. +-Return @code{TRUE} on success, @code{FALSE} on error. Possible error +-returns are: +- +-@itemize @bullet +- +-@item +-@code{bfd_error_no_memory} - +-Not enough memory exists to create private data for @var{osec}. +-@end itemize +-@example +-#define bfd_copy_private_symbol_data(ibfd, isymbol, obfd, osymbol) \ +- BFD_SEND (obfd, _bfd_copy_private_symbol_data, \ +- (ibfd, isymbol, obfd, osymbol)) +- +-@end example +- +diff -Nur binutils-2.24.orig/bfd/doc/targets.texi binutils-2.24/bfd/doc/targets.texi +--- binutils-2.24.orig/bfd/doc/targets.texi 2013-11-18 09:49:27.000000000 +0100 ++++ binutils-2.24/bfd/doc/targets.texi 1970-01-01 01:00:00.000000000 +0100 +@@ -1,621 +0,0 @@ +-@section Targets +- +- +-@strong{Description}@* +-Each port of BFD to a different machine requires 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 @code{bfd_openr}, its format and +-target are unknown. BFD uses various mechanisms to determine +-how to interpret the file. The operations performed are: +- +-@itemize @bullet +- +-@item +-Create a BFD by calling the internal routine +-@code{_bfd_new_bfd}, then call @code{bfd_find_target} with the +-target string supplied to @code{bfd_openr} and the new BFD pointer. +- +-@item +-If a null target string was provided to @code{bfd_find_target}, +-look up the environment variable @code{GNUTARGET} and use +-that as the target string. +- +-@item +-If the target string is still @code{NULL}, or the target string is +-@code{default}, then use the first item in the target vector +-as the target type, and set @code{target_defaulted} in the BFD to +-cause @code{bfd_check_format} to loop through all the targets. +-@xref{bfd_target}. @xref{Formats}. +- +-@item +-Otherwise, inspect the elements in the target vector +-one by one, until a match on target name is found. When found, +-use it. +- +-@item +-Otherwise return the error @code{bfd_error_invalid_target} to +-@code{bfd_openr}. +- +-@item +-@code{bfd_openr} attempts to open the file using +-@code{bfd_open_file}, and returns the BFD. +-@end itemize +-Once the BFD has been opened and the target selected, the file +-format may be determined. This is done by calling +-@code{bfd_check_format} on the BFD with a suggested format. +-If @code{target_defaulted} has been set, each possible target +-type is tried to see if it recognizes the specified format. +-@code{bfd_check_format} returns @code{TRUE} when the caller guesses right. +-@menu +-* bfd_target:: +-@end menu +- +-@node bfd_target, , Targets, Targets +- +-@subsection bfd_target +- +- +-@strong{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 @code{xvec} +-member. +- +-The macros below are used to dispatch to functions through the +-@code{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. +-@example +-#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 +-@end example +-For operations which index on the BFD format: +-@example +-#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 +- +-@end example +-This is the structure which defines the type of BFD this is. The +-@code{xvec} member of the struct @code{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! +-@example +-enum bfd_flavour +-@{ +- bfd_target_unknown_flavour, +- bfd_target_aout_flavour, +- bfd_target_coff_flavour, +- bfd_target_ecoff_flavour, +- bfd_target_xcoff_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_verilog_flavour, +- bfd_target_ihex_flavour, +- bfd_target_som_flavour, +- bfd_target_os9k_flavour, +- bfd_target_versados_flavour, +- bfd_target_msdos_flavour, +- bfd_target_ovax_flavour, +- bfd_target_evax_flavour, +- bfd_target_mmo_flavour, +- bfd_target_mach_o_flavour, +- bfd_target_pef_flavour, +- bfd_target_pef_xlib_flavour, +- bfd_target_sym_flavour +-@}; +- +-enum bfd_endian @{ BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN @}; +- +-/* Forward declaration. */ +-typedef struct bfd_link_info _bfd_link_info; +- +-/* Forward declaration. */ +-typedef struct flag_info flag_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 @code{BFD_NO_FLAGS}, @code{HAS_RELOC}, ...@code{D_PAGED}. */ +- flagword object_flags; +- +- /* A mask of all the flags which a section may have set - from +- the set @code{SEC_NO_FLAGS}, @code{SEC_ALLOC}, ...@code{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 char ar_max_namelen; +- +- /* How well this target matches, used to select between various +- possible targets when more than one target matches. */ +- unsigned char match_priority; +- +- /* Entries for byte swapping for data. These are different from the +- other entry points, since they don't take a BFD as the first argument. +- Certain other handlers could do the same. */ +- bfd_uint64_t (*bfd_getx64) (const void *); +- bfd_int64_t (*bfd_getx_signed_64) (const void *); +- void (*bfd_putx64) (bfd_uint64_t, void *); +- bfd_vma (*bfd_getx32) (const void *); +- bfd_signed_vma (*bfd_getx_signed_32) (const void *); +- void (*bfd_putx32) (bfd_vma, void *); +- bfd_vma (*bfd_getx16) (const void *); +- bfd_signed_vma (*bfd_getx_signed_16) (const void *); +- void (*bfd_putx16) (bfd_vma, void *); +- +- /* Byte swapping for the headers. */ +- bfd_uint64_t (*bfd_h_getx64) (const void *); +- bfd_int64_t (*bfd_h_getx_signed_64) (const void *); +- void (*bfd_h_putx64) (bfd_uint64_t, void *); +- bfd_vma (*bfd_h_getx32) (const void *); +- bfd_signed_vma (*bfd_h_getx_signed_32) (const void *); +- void (*bfd_h_putx32) (bfd_vma, void *); +- bfd_vma (*bfd_h_getx16) (const void *); +- bfd_signed_vma (*bfd_h_getx_signed_16) (const void *); +- void (*bfd_h_putx16) (bfd_vma, void *); +- +- /* 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 @code{bfd_target *} or zero. */ +- const struct bfd_target *(*_bfd_check_format[bfd_type_end]) (bfd *); +- +- /* Set the format of a file being written. */ +- bfd_boolean (*_bfd_set_format[bfd_type_end]) (bfd *); +- +- /* Write cached information into a file being written, at @code{bfd_close}. */ +- bfd_boolean (*_bfd_write_contents[bfd_type_end]) (bfd *); +- +-@end example +-The general target vector. These vectors are initialized using the +-BFD_JUMP_TABLE macros. +-@example +- +- /* Generic entry points. */ +-#define BFD_JUMP_TABLE_GENERIC(NAME) \ +- NAME##_close_and_cleanup, \ +- NAME##_bfd_free_cached_info, \ +- NAME##_new_section_hook, \ +- NAME##_get_section_contents, \ +- NAME##_get_section_contents_in_window +- +- /* Called when the BFD is being closed to do any necessary cleanup. */ +- bfd_boolean (*_close_and_cleanup) (bfd *); +- /* Ask the BFD to free all cached information. */ +- bfd_boolean (*_bfd_free_cached_info) (bfd *); +- /* Called when a new section is created. */ +- bfd_boolean (*_new_section_hook) (bfd *, sec_ptr); +- /* Read the contents of a section. */ +- bfd_boolean (*_bfd_get_section_contents) +- (bfd *, sec_ptr, void *, file_ptr, bfd_size_type); +- bfd_boolean (*_bfd_get_section_contents_in_window) +- (bfd *, sec_ptr, bfd_window *, file_ptr, bfd_size_type); +- +- /* Entry points to copy private data. */ +-#define BFD_JUMP_TABLE_COPY(NAME) \ +- NAME##_bfd_copy_private_bfd_data, \ +- NAME##_bfd_merge_private_bfd_data, \ +- _bfd_generic_init_private_section_data, \ +- NAME##_bfd_copy_private_section_data, \ +- NAME##_bfd_copy_private_symbol_data, \ +- NAME##_bfd_copy_private_header_data, \ +- NAME##_bfd_set_private_flags, \ +- NAME##_bfd_print_private_bfd_data +- +- /* Called to copy BFD general private data from one object file +- to another. */ +- bfd_boolean (*_bfd_copy_private_bfd_data) (bfd *, bfd *); +- /* Called to merge BFD general private data from one object file +- to a common output file when linking. */ +- bfd_boolean (*_bfd_merge_private_bfd_data) (bfd *, bfd *); +- /* Called to initialize BFD private section data from one object file +- to another. */ +-#define bfd_init_private_section_data(ibfd, isec, obfd, osec, link_info) \ +- BFD_SEND (obfd, _bfd_init_private_section_data, (ibfd, isec, obfd, osec, link_info)) +- bfd_boolean (*_bfd_init_private_section_data) +- (bfd *, sec_ptr, bfd *, sec_ptr, struct bfd_link_info *); +- /* Called to copy BFD private section data from one object file +- to another. */ +- bfd_boolean (*_bfd_copy_private_section_data) +- (bfd *, sec_ptr, bfd *, sec_ptr); +- /* Called to copy BFD private symbol data from one symbol +- to another. */ +- bfd_boolean (*_bfd_copy_private_symbol_data) +- (bfd *, asymbol *, bfd *, asymbol *); +- /* Called to copy BFD private header data from one object file +- to another. */ +- bfd_boolean (*_bfd_copy_private_header_data) +- (bfd *, bfd *); +- /* Called to set private backend flags. */ +- bfd_boolean (*_bfd_set_private_flags) (bfd *, flagword); +- +- /* Called to print private BFD data. */ +- bfd_boolean (*_bfd_print_private_bfd_data) (bfd *, void *); +- +- /* Core file entry points. */ +-#define BFD_JUMP_TABLE_CORE(NAME) \ +- NAME##_core_file_failing_command, \ +- NAME##_core_file_failing_signal, \ +- NAME##_core_file_matches_executable_p, \ +- NAME##_core_file_pid +- +- char * (*_core_file_failing_command) (bfd *); +- int (*_core_file_failing_signal) (bfd *); +- bfd_boolean (*_core_file_matches_executable_p) (bfd *, bfd *); +- int (*_core_file_pid) (bfd *); +- +- /* Archive entry points. */ +-#define BFD_JUMP_TABLE_ARCHIVE(NAME) \ +- NAME##_slurp_armap, \ +- NAME##_slurp_extended_name_table, \ +- NAME##_construct_extended_name_table, \ +- NAME##_truncate_arname, \ +- NAME##_write_armap, \ +- NAME##_read_ar_hdr, \ +- NAME##_write_ar_hdr, \ +- NAME##_openr_next_archived_file, \ +- NAME##_get_elt_at_index, \ +- NAME##_generic_stat_arch_elt, \ +- NAME##_update_armap_timestamp +- +- bfd_boolean (*_bfd_slurp_armap) (bfd *); +- bfd_boolean (*_bfd_slurp_extended_name_table) (bfd *); +- bfd_boolean (*_bfd_construct_extended_name_table) +- (bfd *, char **, bfd_size_type *, const char **); +- void (*_bfd_truncate_arname) (bfd *, const char *, char *); +- bfd_boolean (*write_armap) +- (bfd *, unsigned int, struct orl *, unsigned int, int); +- void * (*_bfd_read_ar_hdr_fn) (bfd *); +- bfd_boolean (*_bfd_write_ar_hdr_fn) (bfd *, bfd *); +- bfd * (*openr_next_archived_file) (bfd *, bfd *); +-#define bfd_get_elt_at_index(b,i) BFD_SEND (b, _bfd_get_elt_at_index, (b,i)) +- bfd * (*_bfd_get_elt_at_index) (bfd *, symindex); +- int (*_bfd_stat_arch_elt) (bfd *, struct stat *); +- bfd_boolean (*_bfd_update_armap_timestamp) (bfd *); +- +- /* Entry points used for symbols. */ +-#define BFD_JUMP_TABLE_SYMBOLS(NAME) \ +- NAME##_get_symtab_upper_bound, \ +- NAME##_canonicalize_symtab, \ +- NAME##_make_empty_symbol, \ +- NAME##_print_symbol, \ +- NAME##_get_symbol_info, \ +- NAME##_bfd_is_local_label_name, \ +- NAME##_bfd_is_target_special_symbol, \ +- NAME##_get_lineno, \ +- NAME##_find_nearest_line, \ +- _bfd_generic_find_nearest_line_discriminator, \ +- _bfd_generic_find_line, \ +- NAME##_find_inliner_info, \ +- NAME##_bfd_make_debug_symbol, \ +- NAME##_read_minisymbols, \ +- NAME##_minisymbol_to_symbol +- +- long (*_bfd_get_symtab_upper_bound) (bfd *); +- long (*_bfd_canonicalize_symtab) +- (bfd *, struct bfd_symbol **); +- struct bfd_symbol * +- (*_bfd_make_empty_symbol) (bfd *); +- void (*_bfd_print_symbol) +- (bfd *, void *, struct bfd_symbol *, 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) +- (bfd *, struct bfd_symbol *, symbol_info *); +-#define bfd_get_symbol_info(b,p,e) BFD_SEND (b, _bfd_get_symbol_info, (b,p,e)) +- bfd_boolean (*_bfd_is_local_label_name) (bfd *, const char *); +- bfd_boolean (*_bfd_is_target_special_symbol) (bfd *, asymbol *); +- alent * (*_get_lineno) (bfd *, struct bfd_symbol *); +- bfd_boolean (*_bfd_find_nearest_line) +- (bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma, +- const char **, const char **, unsigned int *); +- bfd_boolean (*_bfd_find_nearest_line_discriminator) +- (bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma, +- const char **, const char **, unsigned int *, unsigned int *); +- bfd_boolean (*_bfd_find_line) +- (bfd *, struct bfd_symbol **, struct bfd_symbol *, +- const char **, unsigned int *); +- bfd_boolean (*_bfd_find_inliner_info) +- (bfd *, const char **, const char **, unsigned int *); +- /* 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) +- (bfd *, void *, unsigned long size); +-#define bfd_read_minisymbols(b, d, m, s) \ +- BFD_SEND (b, _read_minisymbols, (b, d, m, s)) +- long (*_read_minisymbols) +- (bfd *, bfd_boolean, void **, 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) +- (bfd *, bfd_boolean, const void *, asymbol *); +- +- /* Routines for relocs. */ +-#define BFD_JUMP_TABLE_RELOCS(NAME) \ +- NAME##_get_reloc_upper_bound, \ +- NAME##_canonicalize_reloc, \ +- NAME##_bfd_reloc_type_lookup, \ +- NAME##_bfd_reloc_name_lookup +- +- long (*_get_reloc_upper_bound) (bfd *, sec_ptr); +- long (*_bfd_canonicalize_reloc) +- (bfd *, sec_ptr, arelent **, struct bfd_symbol **); +- /* See documentation on reloc types. */ +- reloc_howto_type * +- (*reloc_type_lookup) (bfd *, bfd_reloc_code_real_type); +- reloc_howto_type * +- (*reloc_name_lookup) (bfd *, const char *); +- +- +- /* Routines used when writing an object file. */ +-#define BFD_JUMP_TABLE_WRITE(NAME) \ +- NAME##_set_arch_mach, \ +- NAME##_set_section_contents +- +- bfd_boolean (*_bfd_set_arch_mach) +- (bfd *, enum bfd_architecture, unsigned long); +- bfd_boolean (*_bfd_set_section_contents) +- (bfd *, sec_ptr, const void *, file_ptr, bfd_size_type); +- +- /* Routines used by the linker. */ +-#define BFD_JUMP_TABLE_LINK(NAME) \ +- NAME##_sizeof_headers, \ +- NAME##_bfd_get_relocated_section_contents, \ +- NAME##_bfd_relax_section, \ +- NAME##_bfd_link_hash_table_create, \ +- NAME##_bfd_link_hash_table_free, \ +- NAME##_bfd_link_add_symbols, \ +- NAME##_bfd_link_just_syms, \ +- NAME##_bfd_copy_link_hash_symbol_type, \ +- NAME##_bfd_final_link, \ +- NAME##_bfd_link_split_section, \ +- NAME##_bfd_gc_sections, \ +- NAME##_bfd_lookup_section_flags, \ +- NAME##_bfd_merge_sections, \ +- NAME##_bfd_is_group_section, \ +- NAME##_bfd_discard_group, \ +- NAME##_section_already_linked, \ +- NAME##_bfd_define_common_symbol +- +- int (*_bfd_sizeof_headers) (bfd *, struct bfd_link_info *); +- bfd_byte * (*_bfd_get_relocated_section_contents) +- (bfd *, struct bfd_link_info *, struct bfd_link_order *, +- bfd_byte *, bfd_boolean, struct bfd_symbol **); +- +- bfd_boolean (*_bfd_relax_section) +- (bfd *, struct bfd_section *, struct bfd_link_info *, bfd_boolean *); +- +- /* 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) (bfd *); +- +- /* Release the memory associated with the linker hash table. */ +- void (*_bfd_link_hash_table_free) (struct bfd_link_hash_table *); +- +- /* Add symbols from this object file into the hash table. */ +- bfd_boolean (*_bfd_link_add_symbols) (bfd *, struct bfd_link_info *); +- +- /* Indicate that we are only retrieving symbol values from this section. */ +- void (*_bfd_link_just_syms) (asection *, struct bfd_link_info *); +- +- /* Copy the symbol type of a linker hash table entry. */ +-#define bfd_copy_link_hash_symbol_type(b, t, f) \ +- BFD_SEND (b, _bfd_copy_link_hash_symbol_type, (b, t, f)) +- void (*_bfd_copy_link_hash_symbol_type) +- (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); +- +- /* Do a link based on the link_order structures attached to each +- section of the BFD. */ +- bfd_boolean (*_bfd_final_link) (bfd *, struct bfd_link_info *); +- +- /* Should this section be split up into smaller pieces during linking. */ +- bfd_boolean (*_bfd_link_split_section) (bfd *, struct bfd_section *); +- +- /* Remove sections that are not referenced from the output. */ +- bfd_boolean (*_bfd_gc_sections) (bfd *, struct bfd_link_info *); +- +- /* Sets the bitmask of allowed and disallowed section flags. */ +- bfd_boolean (*_bfd_lookup_section_flags) (struct bfd_link_info *, +- struct flag_info *, +- asection *); +- +- /* Attempt to merge SEC_MERGE sections. */ +- bfd_boolean (*_bfd_merge_sections) (bfd *, struct bfd_link_info *); +- +- /* Is this section a member of a group? */ +- bfd_boolean (*_bfd_is_group_section) (bfd *, const struct bfd_section *); +- +- /* Discard members of a group. */ +- bfd_boolean (*_bfd_discard_group) (bfd *, struct bfd_section *); +- +- /* Check if SEC has been already linked during a reloceatable or +- final link. */ +- bfd_boolean (*_section_already_linked) (bfd *, asection *, +- struct bfd_link_info *); +- +- /* Define a common symbol. */ +- bfd_boolean (*_bfd_define_common_symbol) (bfd *, struct bfd_link_info *, +- struct bfd_link_hash_entry *); +- +- /* Routines to handle dynamic symbols and relocs. */ +-#define BFD_JUMP_TABLE_DYNAMIC(NAME) \ +- NAME##_get_dynamic_symtab_upper_bound, \ +- NAME##_canonicalize_dynamic_symtab, \ +- NAME##_get_synthetic_symtab, \ +- NAME##_get_dynamic_reloc_upper_bound, \ +- NAME##_canonicalize_dynamic_reloc +- +- /* Get the amount of memory required to hold the dynamic symbols. */ +- long (*_bfd_get_dynamic_symtab_upper_bound) (bfd *); +- /* Read in the dynamic symbols. */ +- long (*_bfd_canonicalize_dynamic_symtab) +- (bfd *, struct bfd_symbol **); +- /* Create synthetized symbols. */ +- long (*_bfd_get_synthetic_symtab) +- (bfd *, long, struct bfd_symbol **, long, struct bfd_symbol **, +- struct bfd_symbol **); +- /* Get the amount of memory required to hold the dynamic relocs. */ +- long (*_bfd_get_dynamic_reloc_upper_bound) (bfd *); +- /* Read in the dynamic relocs. */ +- long (*_bfd_canonicalize_dynamic_reloc) +- (bfd *, arelent **, struct bfd_symbol **); +- +-@end example +-A pointer to an alternative bfd_target in case the current one is not +-satisfactory. This can happen when the target cpu supports both big +-and little endian code, and target chosen by the linker has the wrong +-endianness. The function open_output() in ld/ldlang.c uses this field +-to find an alternative output format that is suitable. +-@example +- /* Opposite endian version of this target. */ +- const struct bfd_target * alternative_target; +- +- /* Data for use by back-end routines, which isn't +- generic enough to belong in this structure. */ +- const void *backend_data; +- +-@} bfd_target; +- +-@end example +- +-@findex bfd_set_default_target +-@subsubsection @code{bfd_set_default_target} +-@strong{Synopsis} +-@example +-bfd_boolean bfd_set_default_target (const char *name); +-@end example +-@strong{Description}@* +-Set the default target vector to use when recognizing a BFD. +-This takes the name of the target, which may be a BFD target +-name or a configuration triplet. +- +-@findex bfd_find_target +-@subsubsection @code{bfd_find_target} +-@strong{Synopsis} +-@example +-const bfd_target *bfd_find_target (const char *target_name, bfd *abfd); +-@end example +-@strong{Description}@* +-Return a pointer to the transfer vector for the object target +-named @var{target_name}. If @var{target_name} is @code{NULL}, +-choose the one in the environment variable @code{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 if @var{abfd} isn't @code{NULL}. This causes +-@code{bfd_check_format} to loop over all the targets to find the +-one that matches the file being read. +- +-@findex bfd_get_target_info +-@subsubsection @code{bfd_get_target_info} +-@strong{Synopsis} +-@example +-const bfd_target *bfd_get_target_info (const char *target_name, +- bfd *abfd, +- bfd_boolean *is_bigendian, +- int *underscoring, +- const char **def_target_arch); +-@end example +-@strong{Description}@* +-Return a pointer to the transfer vector for the object target +-named @var{target_name}. If @var{target_name} is @code{NULL}, +-choose the one in the environment variable @code{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 if @var{abfd} isn't @code{NULL}. This causes +-@code{bfd_check_format} to loop over all the targets to find the +-one that matches the file being read. +-If @var{is_bigendian} is not @code{NULL}, then set this value to target's +-endian mode. True for big-endian, FALSE for little-endian or for +-invalid target. +-If @var{underscoring} is not @code{NULL}, then set this value to target's +-underscoring mode. Zero for none-underscoring, -1 for invalid target, +-else the value of target vector's symbol underscoring. +-If @var{def_target_arch} is not @code{NULL}, then set it to the architecture +-string specified by the target_name. +- +-@findex bfd_target_list +-@subsubsection @code{bfd_target_list} +-@strong{Synopsis} +-@example +-const char ** bfd_target_list (void); +-@end example +-@strong{Description}@* +-Return a freshly malloced NULL-terminated +-vector of the names of all the valid BFD targets. Do not +-modify the names. +- +-@findex bfd_seach_for_target +-@subsubsection @code{bfd_seach_for_target} +-@strong{Synopsis} +-@example +-const bfd_target *bfd_search_for_target +- (int (*search_func) (const bfd_target *, void *), +- void *); +-@end example +-@strong{Description}@* +-Return a pointer to the first transfer vector in the list of +-transfer vectors maintained by BFD that produces a non-zero +-result when passed to the function @var{search_func}. The +-parameter @var{data} is passed, unexamined, to the search +-function. +- +diff -Nur binutils-2.24.orig/bfd/elf-bfd.h binutils-2.24/bfd/elf-bfd.h +--- binutils-2.24.orig/bfd/elf-bfd.h 2013-11-08 11:13:48.000000000 +0100 ++++ binutils-2.24/bfd/elf-bfd.h 2016-04-10 20:30:46.000000000 +0200 +@@ -419,6 +419,7 @@ + MICROBLAZE_ELF_DATA, + MIPS_ELF_DATA, + MN10300_ELF_DATA, ++ NDS32_ELF_DATA, + NIOS2_ELF_DATA, + PPC32_ELF_DATA, + PPC64_ELF_DATA, +diff -Nur binutils-2.24.orig/bfd/elf32-nds32.c binutils-2.24/bfd/elf32-nds32.c +--- binutils-2.24.orig/bfd/elf32-nds32.c 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-2.24/bfd/elf32-nds32.c 2016-04-10 20:32:10.000000000 +0200 +@@ -0,0 +1,20276 @@ ++/* NDS32-specific support for 32-bit ELF. ++ Copyright (C) 2012-2013 Free Software Foundation, Inc. ++ Contributed by Andes Technology Corporation. ++ ++ 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 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA.*/ ++ ++ ++#include "sysdep.h" ++#include "bfd.h" ++#include "bfd_stdint.h" ++#include "bfdlink.h" ++#include "libbfd.h" ++#include "elf-bfd.h" ++#include "libiberty.h" ++#include "bfd_stdint.h" ++#include "elf/nds32.h" ++#include "opcode/nds32.h" ++#include "elf32-nds32.h" ++#include "opcode/cgen.h" ++#include "../opcodes/nds32-opc.h" ++ ++/* Relocation HOWTO functions. */ ++static bfd_reloc_status_type nds32_elf_ignore_reloc ++ (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); ++static bfd_reloc_status_type nds32_elf_9_pcrel_reloc ++ (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); ++static bfd_reloc_status_type nds32_elf_hi20_reloc ++ (bfd *, arelent *, asymbol *, void *, ++ asection *, bfd *, char **); ++static bfd_reloc_status_type nds32_elf_lo12_reloc ++ (bfd *, arelent *, asymbol *, void *, ++ asection *, bfd *, char **); ++static bfd_reloc_status_type nds32_elf_generic_reloc ++ (bfd *, arelent *, asymbol *, void *, ++ asection *, bfd *, char **); ++static bfd_reloc_status_type nds32_elf_sda15_reloc ++ (bfd *, arelent *, asymbol *, void *, ++ asection *, bfd *, char **); ++ ++/* Helper functions for HOWTO. */ ++static bfd_reloc_status_type nds32_elf_do_9_pcrel_reloc ++ (bfd *, reloc_howto_type *, asection *, bfd_byte *, bfd_vma, ++ asection *, bfd_vma, bfd_vma); ++static void nds32_elf_relocate_hi20 ++ (bfd *, int, Elf_Internal_Rela *, Elf_Internal_Rela *, bfd_byte *, bfd_vma); ++static reloc_howto_type *bfd_elf32_bfd_reloc_type_table_lookup ++ (enum elf_nds32_reloc_type); ++static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup ++ (bfd *, bfd_reloc_code_real_type); ++ ++/* Target hooks. */ ++static void nds32_info_to_howto_rel ++ (bfd *, arelent *, Elf_Internal_Rela *dst); ++static void nds32_info_to_howto ++ (bfd *, arelent *, Elf_Internal_Rela *dst); ++static bfd_boolean nds32_elf_add_symbol_hook ++ (bfd *, struct bfd_link_info *, Elf_Internal_Sym *, const char **, ++ flagword *, asection **, bfd_vma *); ++static bfd_boolean nds32_elf_relocate_section ++ (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, ++ Elf_Internal_Rela *, Elf_Internal_Sym *, asection **); ++static bfd_boolean nds32_elf_object_p (bfd *); ++static void nds32_elf_final_write_processing (bfd *, bfd_boolean); ++static bfd_boolean nds32_elf_set_private_flags (bfd *, flagword); ++static bfd_boolean nds32_elf_merge_private_bfd_data (bfd *, bfd *); ++static bfd_boolean nds32_elf_print_private_bfd_data (bfd *, void *); ++static bfd_boolean nds32_elf_gc_sweep_hook ++ (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *); ++static bfd_boolean nds32_elf_check_relocs ++ (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *); ++static asection *nds32_elf_gc_mark_hook ++ (asection *, struct bfd_link_info *, Elf_Internal_Rela *, ++ struct elf_link_hash_entry *, Elf_Internal_Sym *); ++static bfd_boolean nds32_elf_adjust_dynamic_symbol ++ (struct bfd_link_info *, struct elf_link_hash_entry *); ++static bfd_boolean nds32_elf_size_dynamic_sections ++ (bfd *, struct bfd_link_info *); ++static bfd_boolean nds32_elf_create_dynamic_sections ++ (bfd *, struct bfd_link_info *); ++static bfd_boolean nds32_elf_finish_dynamic_sections ++ (bfd *, struct bfd_link_info *info); ++static bfd_boolean nds32_elf_finish_dynamic_symbol ++ (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, ++ Elf_Internal_Sym *); ++static bfd_boolean nds32_elf_mkobject (bfd *); ++ ++/* Nds32 helper functions. */ ++static bfd_reloc_status_type nds32_elf_final_sda_base ++ (bfd *, struct bfd_link_info *, bfd_vma *, bfd_boolean); ++static bfd_boolean allocate_dynrelocs (struct elf_link_hash_entry *, void *); ++static bfd_boolean readonly_dynrelocs (struct elf_link_hash_entry *, void *); ++static Elf_Internal_Rela *find_relocs_at_address ++ (Elf_Internal_Rela *, Elf_Internal_Rela *, ++ Elf_Internal_Rela *, enum elf_nds32_reloc_type); ++static bfd_vma calculate_memory_address ++(bfd *, Elf_Internal_Rela *, Elf_Internal_Sym *, Elf_Internal_Shdr *); ++static int nds32_get_section_contents (bfd *, asection *, ++ bfd_byte **, bfd_boolean); ++static int nds32_elf_ex9_init (void); ++static bfd_boolean nds32_elf_ex9_build_hash_table ++(bfd *, asection *, struct bfd_link_info *); ++static bfd_boolean nds32_elf_ex9_itb_base (struct bfd_link_info *); ++static void nds32_elf_ex9_import_table (struct bfd_link_info *); ++static void nds32_elf_ex9_finish (struct bfd_link_info *); ++static void nds32_elf_ex9_reloc_jmp (struct bfd_link_info *); ++static void nds32_elf_get_insn_with_reg ++ (Elf_Internal_Rela *, uint32_t, uint32_t *); ++static int nds32_get_local_syms (bfd *, asection *ATTRIBUTE_UNUSED, ++ Elf_Internal_Sym **); ++static bfd_boolean nds32_elf_ex9_replace_instruction ++ (struct bfd_link_info *, bfd *, asection *); ++static int nds32_elf_ifc_init (void); ++static bfd_boolean nds32_elf_ifc_calc (struct bfd_link_info *, bfd *, ++ asection *); ++static void nds32_elf_ifc_cse_algo (struct bfd_link_info *); ++static bfd_boolean nds32_elf_ifc_finish (struct bfd_link_info *); ++static bfd_boolean nds32_elf_ifc_replace (struct bfd_link_info *); ++static bfd_boolean nds32_elf_ifc_trace_code (struct bfd_link_info *, ++ bfd *,asection *); ++static bfd_boolean nds32_elf_ifc_reloc (void); ++static bfd_boolean nds32_relax_fp_as_gp ++ (struct bfd_link_info *link_info, bfd *abfd, asection *sec, ++ Elf_Internal_Rela *internal_relocs, Elf_Internal_Rela *irelend, ++ Elf_Internal_Sym *isymbuf); ++static bfd_boolean nds32_fag_remove_unused_fpbase ++ (bfd *abfd, asection *sec, Elf_Internal_Rela *internal_relocs, ++ Elf_Internal_Rela *irelend); ++static bfd_byte* ++nds32_elf_get_relocated_section_contents (bfd *abfd, ++ struct bfd_link_info *link_info, ++ struct bfd_link_order *link_order, ++ bfd_byte *data, ++ bfd_boolean relocatable, ++ asymbol **symbols); ++static void nds32_elf_ict_hash_init (void); ++static void nds32_elf_ict_relocate (struct bfd_link_info *); ++static asection* ++nds32_elf_get_target_section (struct bfd_link_info *, char *); ++ ++enum ++{ ++ MACH_V1 = bfd_mach_n1h, ++ MACH_V2 = bfd_mach_n1h_v2, ++ MACH_V3 = bfd_mach_n1h_v3, ++ MACH_V3M = bfd_mach_n1h_v3m, ++}; ++ ++#define MIN(a, b) ((a) > (b) ? (b) : (a)) ++#define MAX(a, b) ((a) > (b) ? (a) : (b)) ++ ++/* True if insn is 4byte. */ ++#define INSN_32BIT(insn) ((((insn) & 0x80000000) == 0 ? (TRUE) : (FALSE))) ++ ++/* The name of the dynamic interpreter. This is put in the .interp ++ section. */ ++#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++ ++/**/ ++#define NDS32_GUARD_SEC_P(flags) ((flags) & SEC_ALLOC \ ++ && (flags) & SEC_LOAD \ ++ && (flags) & SEC_READONLY) ++ ++/* The nop opcode we use. */ ++#define NDS32_NOP32 0x40000009 ++#define NDS32_NOP16 0x9200 ++ ++/* The size in bytes of an entry in the procedure linkage table. */ ++#define PLT_ENTRY_SIZE 24 ++#define PLT_HEADER_SIZE 24 ++ ++/* The first entry in a procedure linkage table are reserved, ++ and the initial contents are unimportant (we zero them out). ++ Subsequent entries look like this. */ ++#define PLT0_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(.got+4) */ ++#define PLT0_ENTRY_WORD1 0x58f78000 /* ori r15, r25, LO12(.got+4) */ ++#define PLT0_ENTRY_WORD2 0x05178000 /* lwi r17, [r15+0] */ ++#define PLT0_ENTRY_WORD3 0x04f78001 /* lwi r15, [r15+4] */ ++#define PLT0_ENTRY_WORD4 0x4a003c00 /* jr r15 */ ++ ++/* $ta is change to $r15 (from $r25). */ ++#define PLT0_PIC_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(got[1]@GOT) */ ++#define PLT0_PIC_ENTRY_WORD1 0x58f78000 /* ori r15, r15, LO12(got[1]@GOT) */ ++#define PLT0_PIC_ENTRY_WORD2 0x40f7f400 /* add r15, gp, r15 */ ++#define PLT0_PIC_ENTRY_WORD3 0x05178000 /* lwi r17, [r15+0] */ ++#define PLT0_PIC_ENTRY_WORD4 0x04f78001 /* lwi r15, [r15+4] */ ++#define PLT0_PIC_ENTRY_WORD5 0x4a003c00 /* jr r15 */ ++ ++#define PLT_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(&got[n+3]) */ ++#define PLT_ENTRY_WORD1 0x04f78000 /* lwi r15, r15, LO12(&got[n+3]) */ ++#define PLT_ENTRY_WORD2 0x4a003c00 /* jr r15 */ ++#define PLT_ENTRY_WORD3 0x45000000 /* movi r16, sizeof(RELA) * n */ ++#define PLT_ENTRY_WORD4 0x48000000 /* j .plt0. */ ++ ++#define PLT_PIC_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(got[n+3]@GOT) */ ++#define PLT_PIC_ENTRY_WORD1 0x58f78000 /* ori r15, r15, LO12(got[n+3]@GOT) */ ++#define PLT_PIC_ENTRY_WORD2 0x38febc02 /* lw r15, [gp+r15] */ ++#define PLT_PIC_ENTRY_WORD3 0x4a003c00 /* jr r15 */ ++#define PLT_PIC_ENTRY_WORD4 0x45000000 /* movi r16, sizeof(RELA) * n */ ++#define PLT_PIC_ENTRY_WORD5 0x48000000 /* j .plt0 */ ++ ++/* These are macros used to get the relocation accurate value. */ ++#define ACCURATE_8BIT_S1 (0x100) ++#define ACCURATE_U9BIT_S1 (0x400) ++#define ACCURATE_12BIT_S1 (0x2000) ++#define ACCURATE_14BIT_S1 (0x4000) ++#define ACCURATE_19BIT (0x40000) ++ ++/* These are macros used to get the relocation conservative value. */ ++#define CONSERVATIVE_8BIT_S1 (0x100 - 4) ++#define CONSERVATIVE_14BIT_S1 (0x4000 - 4) ++#define CONSERVATIVE_16BIT_S1 (0x10000 - 4) ++#define CONSERVATIVE_24BIT_S1 (0x1000000 - 4) ++/* These must be more conservative because the address may be in ++ different segment. */ ++#define CONSERVATIVE_15BIT (0x4000 - 0x1000) ++#define CONSERVATIVE_15BIT_S1 (0x8000 - 0x1000) ++#define CONSERVATIVE_15BIT_S2 (0x10000 - 0x1000) ++#define CONSERVATIVE_19BIT (0x40000 - 0x1000) ++#define CONSERVATIVE_20BIT (0x80000 - 0x1000) ++ ++#define NDS32_ICT_SECTION ".nds32.ict" ++ ++/* Size of small data/bss sections, used to calculate SDA_BASE. */ ++static long got_size = 0; ++static int is_SDA_BASE_set = 0; ++static int is_ITB_BASE_set = 0; ++ ++/* Convert ELF-VER in eflags to string for debugging purpose. */ ++static const char *const nds32_elfver_strtab[] = { ++ "ELF-1.2", ++ "ELF-1.3", ++ "ELF-1.4", ++}; ++ ++/* The nds32 linker needs to keep track of the number of relocs that it ++ decides to copy in check_relocs for each symbol. This is so that ++ it can discard PC relative relocs if it doesn't need them when ++ linking with -Bsymbolic. We store the information in a field ++ extending the regular ELF linker hash table. */ ++ ++/* This structure keeps track of the number of PC relative relocs we ++ have copied for a given symbol. */ ++ ++struct elf_nds32_pcrel_relocs_copied ++{ ++ /* Next section. */ ++ struct elf_nds32_pcrel_relocs_copied *next; ++ /* A section in dynobj. */ ++ asection *section; ++ /* Number of relocs copied in this section. */ ++ bfd_size_type count; ++}; ++ ++/* The sh linker needs to keep track of the number of relocs that it ++ decides to copy as dynamic relocs in check_relocs for each symbol. ++ This is so that it can later discard them if they are found to be ++ unnecessary. We store the information in a field extending the ++ regular ELF linker hash table. */ ++ ++struct elf_nds32_dyn_relocs ++{ ++ struct elf_nds32_dyn_relocs *next; ++ ++ /* The input section of the reloc. */ ++ asection *sec; ++ ++ /* Total number of relocs copied for the input section. */ ++ bfd_size_type count; ++ ++ /* Number of pc-relative relocs copied for the input section. */ ++ bfd_size_type pc_count; ++}; ++ ++/* Nds32 ELF linker hash entry. */ ++ ++enum elf_nds32_tls_type ++{ ++ GOT_UNKNOWN = (0), ++ GOT_NORMAL = (1 << 0), ++ GOT_TLS_LE = (1 << 1), ++ GOT_TLS_IE = (1 << 2), ++ GOT_TLS_IEGP = (1 << 3), ++ GOT_TLS_LD = (1 << 4), ++ GOT_TLS_GD = (1 << 5), ++ GOT_TLS_DESC = (1 << 6), ++}; ++ ++struct elf_nds32_link_hash_entry ++{ ++ struct elf_link_hash_entry root; ++ ++ /* Track dynamic relocs copied for this symbol. */ ++ struct elf_nds32_dyn_relocs *dyn_relocs; ++ ++ /* For checking relocation type. */ ++ enum elf_nds32_tls_type tls_type; ++ ++ int offset_to_gp; ++ ++ /* For saving function attribute indirect_call and entry address. */ ++ bfd_boolean indirect_call; ++}; ++ ++/* Get the nds32 ELF linker hash table from a link_info structure. */ ++ ++#define FP_BASE_NAME "_FP_BASE_" ++static int check_start_export_sym = 0; ++static size_t ex9_relax_size = 0; /* Save ex9 predicted reducing size. */ ++static asection *ex9_section = NULL; ++/* File for exporting indirect call table. */ ++static FILE *ict_file = NULL; ++static bfd_boolean ignore_indirect_call = FALSE; ++ ++/* Rom-patch symbol hash table. */ ++struct elf_nds32_ict_hash_entry ++{ ++ struct bfd_hash_entry root; ++ struct elf_link_hash_entry *h; ++ unsigned int order; ++}; ++ ++/* Rom-patch hash table. */ ++static struct bfd_hash_table indirect_call_table; ++ ++/* Table to save initial crc table. */ ++static unsigned short byte_crc_table[256]; ++static unsigned short byte_inv_crc_table[256]; ++ ++/* The offset for executable tls relaxation. */ ++#define TP_OFFSET 0x0 ++ ++typedef struct ++{ ++ int min_id; ++ int max_id; ++ int count; ++ int bias; ++ int init; ++} elf32_nds32_relax_group_t; ++ ++struct elf_nds32_obj_tdata ++{ ++ struct elf_obj_tdata root; ++ ++ /* tls_type for each local got entry. */ ++ char *local_got_tls_type; ++ ++ unsigned int hdr_size; ++ ++ /* GOTPLT entries for TLS descriptors. */ ++ bfd_vma *local_tlsdesc_gotent; ++ ++ int* offset_to_gp; ++ ++ /* for R_NDS32_RELAX_GROUP handling. */ ++ elf32_nds32_relax_group_t relax_group; ++}; ++ ++#define elf_nds32_tdata(bfd) \ ++ ((struct elf_nds32_obj_tdata *) (bfd)->tdata.any) ++ ++#define elf32_nds32_local_got_tls_type(bfd) \ ++ (elf_nds32_tdata (bfd)->local_got_tls_type) ++ ++#define elf32_nds32_local_gp_offset(bfd) \ ++ (elf_nds32_tdata (bfd)->offset_to_gp) ++ ++#define elf32_nds32_relax_group_ptr(bfd) \ ++ &(elf_nds32_tdata (bfd)->relax_group) ++ ++#define elf32_nds32_hash_entry(ent) ((struct elf_nds32_link_hash_entry *)(ent)) ++ ++bfd_boolean ++nds32_elf_mkobject (bfd *abfd) ++{ ++ return bfd_elf_allocate_object (abfd, sizeof (struct elf_nds32_obj_tdata), ++ NDS32_ELF_DATA); ++} ++ ++ ++/* Relocations used for relocation. */ ++/* NOTE! ++ the index order must be the same with elf_nds32_reloc_type in ++ include/elf/nds32.h ++ */ ++#define HOWTO2(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \ ++ [C] = HOWTO(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) ++ ++static reloc_howto_type nds32_elf_howto_table[] = { ++ /* This reloc does nothing. */ ++ HOWTO2 (R_NDS32_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_NDS32_NONE", /* name */ ++ FALSE, /* partial_inplace */ ++ 0, /* src_mask */ ++ 0, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* A 16 bit absolute relocation. */ ++ HOWTO2 (R_NDS32_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 */ ++ nds32_elf_generic_reloc,/* special_function */ ++ "R_NDS32_16", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffff, /* src_mask */ ++ 0xffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* A 32 bit absolute relocation. */ ++ HOWTO2 (R_NDS32_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 */ ++ nds32_elf_generic_reloc,/* special_function */ ++ "R_NDS32_32", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* A 20 bit address. */ ++ HOWTO2 (R_NDS32_20, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_unsigned,/* complain_on_overflow */ ++ nds32_elf_generic_reloc,/* special_function */ ++ "R_NDS32_20", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xfffff, /* src_mask */ ++ 0xfffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* An PC Relative 9-bit relocation, shifted by 2. ++ This reloc is complicated because relocations are relative to pc & -4. ++ i.e. branches in the right insn slot use the address of the left insn ++ slot for pc. */ ++ /* ??? It's not clear whether this should have partial_inplace set or not. ++ Branch relaxing in the assembler can store the addend in the insn, ++ and if bfd_install_relocation gets called the addend may get added ++ again. */ ++ HOWTO2 (R_NDS32_9_PCREL, /* type */ ++ 1, /* rightshift */ ++ 1, /* size (0 = byte, 1 = short, 2 = long) */ ++ 8, /* bitsize */ ++ TRUE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ nds32_elf_9_pcrel_reloc,/* special_function */ ++ "R_NDS32_9_PCREL", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xff, /* src_mask */ ++ 0xff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ ++ /* A relative 15 bit relocation, right shifted by 1. */ ++ HOWTO2 (R_NDS32_15_PCREL, /* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 14, /* bitsize */ ++ TRUE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_15_PCREL", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x3fff, /* src_mask */ ++ 0x3fff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ ++ /* A relative 17 bit relocation, right shifted by 1. */ ++ HOWTO2 (R_NDS32_17_PCREL, /* type */ ++ 1, /* 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_NDS32_17_PCREL", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffff, /* src_mask */ ++ 0xffff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ ++ /* A relative 25 bit relocation, right shifted by 1. */ ++ /* ??? It's not clear whether this should have partial_inplace set or not. ++ Branch relaxing in the assembler can store the addend in the insn, ++ and if bfd_install_relocation gets called the addend may get added ++ again. */ ++ HOWTO2 (R_NDS32_25_PCREL, /* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 24, /* bitsize */ ++ TRUE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_25_PCREL", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffff, /* src_mask */ ++ 0xffffff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ ++ /* High 20 bits of address when lower 12 is or'd in. */ ++ HOWTO2 (R_NDS32_HI20, /* type */ ++ 12, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_hi20_reloc, /* special_function */ ++ "R_NDS32_HI20", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Lower 12 bits of address. */ ++ HOWTO2 (R_NDS32_LO12S3, /* type */ ++ 3, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 9, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_lo12_reloc, /* special_function */ ++ "R_NDS32_LO12S3", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000001ff, /* src_mask */ ++ 0x000001ff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Lower 12 bits of address. */ ++ HOWTO2 (R_NDS32_LO12S2, /* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 10, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_lo12_reloc, /* special_function */ ++ "R_NDS32_LO12S2", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000003ff, /* src_mask */ ++ 0x000003ff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Lower 12 bits of address. */ ++ HOWTO2 (R_NDS32_LO12S1, /* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 11, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_lo12_reloc, /* special_function */ ++ "R_NDS32_LO12S1", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000007ff, /* src_mask */ ++ 0x000007ff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Lower 12 bits of address. */ ++ HOWTO2 (R_NDS32_LO12S0, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_lo12_reloc, /* special_function */ ++ "R_NDS32_LO12S0", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Small data area 15 bits offset. */ ++ HOWTO2 (R_NDS32_SDA15S3, /* type */ ++ 3, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ nds32_elf_sda15_reloc, /* special_function */ ++ "R_NDS32_SDA15S3", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00007fff, /* src_mask */ ++ 0x00007fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Small data area 15 bits offset. */ ++ HOWTO2 (R_NDS32_SDA15S2, /* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ nds32_elf_sda15_reloc, /* special_function */ ++ "R_NDS32_SDA15S2", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00007fff, /* src_mask */ ++ 0x00007fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Small data area 15 bits offset. */ ++ HOWTO2 (R_NDS32_SDA15S1, /* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ nds32_elf_sda15_reloc, /* special_function */ ++ "R_NDS32_SDA15S1", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00007fff, /* src_mask */ ++ 0x00007fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Small data area 15 bits offset. */ ++ HOWTO2 (R_NDS32_SDA15S0, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ nds32_elf_sda15_reloc, /* special_function */ ++ "R_NDS32_SDA15S0", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00007fff, /* src_mask */ ++ 0x00007fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* GNU extension to record C++ vtable hierarchy */ ++ HOWTO2 (R_NDS32_GNU_VTINHERIT,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 0, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ NULL, /* special_function */ ++ "R_NDS32_GNU_VTINHERIT",/* name */ ++ FALSE, /* partial_inplace */ ++ 0, /* src_mask */ ++ 0, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* GNU extension to record C++ vtable member usage */ ++ HOWTO2 (R_NDS32_GNU_VTENTRY, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 0, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ _bfd_elf_rel_vtable_reloc_fn,/* special_function */ ++ "R_NDS32_GNU_VTENTRY", /* name */ ++ FALSE, /* partial_inplace */ ++ 0, /* src_mask */ ++ 0, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* A 16 bit absolute relocation. */ ++ HOWTO2 (R_NDS32_16_RELA, /* 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_NDS32_16_RELA", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffff, /* src_mask */ ++ 0xffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* A 32 bit absolute relocation. */ ++ HOWTO2 (R_NDS32_32_RELA, /* 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_NDS32_32_RELA", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* A 20 bit address. */ ++ HOWTO2 (R_NDS32_20_RELA, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_20_RELA", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xfffff, /* src_mask */ ++ 0xfffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ HOWTO2 (R_NDS32_9_PCREL_RELA, /* type */ ++ 1, /* rightshift */ ++ 1, /* size (0 = byte, 1 = short, 2 = long) */ ++ 8, /* bitsize */ ++ TRUE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_9_PCREL_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xff, /* src_mask */ ++ 0xff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ ++ /* A relative 15 bit relocation, right shifted by 1. */ ++ HOWTO2 (R_NDS32_15_PCREL_RELA,/* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 14, /* bitsize */ ++ TRUE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_15_PCREL_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x3fff, /* src_mask */ ++ 0x3fff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ ++ /* A relative 17 bit relocation, right shifted by 1. */ ++ HOWTO2 (R_NDS32_17_PCREL_RELA,/* type */ ++ 1, /* 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_NDS32_17_PCREL_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffff, /* src_mask */ ++ 0xffff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ ++ /* A relative 25 bit relocation, right shifted by 2. */ ++ HOWTO2 (R_NDS32_25_PCREL_RELA,/* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 24, /* bitsize */ ++ TRUE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_25_PCREL_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffff, /* src_mask */ ++ 0xffffff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ ++ /* High 20 bits of address when lower 16 is or'd in. */ ++ HOWTO2 (R_NDS32_HI20_RELA, /* type */ ++ 12, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_HI20_RELA", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Lower 12 bits of address. */ ++ HOWTO2 (R_NDS32_LO12S3_RELA, /* type */ ++ 3, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 9, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_LO12S3_RELA", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000001ff, /* src_mask */ ++ 0x000001ff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Lower 12 bits of address. */ ++ HOWTO2 (R_NDS32_LO12S2_RELA, /* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 10, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_LO12S2_RELA", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000003ff, /* src_mask */ ++ 0x000003ff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Lower 12 bits of address. */ ++ HOWTO2 (R_NDS32_LO12S1_RELA, /* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 11, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_LO12S1_RELA", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000007ff, /* src_mask */ ++ 0x000007ff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Lower 12 bits of address. */ ++ HOWTO2 (R_NDS32_LO12S0_RELA, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_LO12S0_RELA", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Small data area 15 bits offset. */ ++ HOWTO2 (R_NDS32_SDA15S3_RELA, /* type */ ++ 3, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_SDA15S3_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00007fff, /* src_mask */ ++ 0x00007fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Small data area 15 bits offset. */ ++ HOWTO2 (R_NDS32_SDA15S2_RELA, /* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_SDA15S2_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00007fff, /* src_mask */ ++ 0x00007fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ HOWTO2 (R_NDS32_SDA15S1_RELA, /* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_SDA15S1_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00007fff, /* src_mask */ ++ 0x00007fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ HOWTO2 (R_NDS32_SDA15S0_RELA, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_SDA15S0_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00007fff, /* src_mask */ ++ 0x00007fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* GNU extension to record C++ vtable hierarchy */ ++ HOWTO2 (R_NDS32_RELA_GNU_VTINHERIT,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 0, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ NULL, /* special_function */ ++ "R_NDS32_RELA_GNU_VTINHERIT",/* name */ ++ FALSE, /* partial_inplace */ ++ 0, /* src_mask */ ++ 0, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* GNU extension to record C++ vtable member usage */ ++ HOWTO2 (R_NDS32_RELA_GNU_VTENTRY,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 0, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ _bfd_elf_rel_vtable_reloc_fn,/* special_function */ ++ "R_NDS32_RELA_GNU_VTENTRY",/* name */ ++ FALSE, /* partial_inplace */ ++ 0, /* src_mask */ ++ 0, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Like R_NDS32_20, but referring to the GOT table entry for ++ the symbol. */ ++ HOWTO2 (R_NDS32_GOT20, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOT20", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xfffff, /* src_mask */ ++ 0xfffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Like R_NDS32_PCREL, but referring to the procedure linkage table ++ entry for the symbol. */ ++ HOWTO2 (R_NDS32_25_PLTREL, /* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 24, /* bitsize */ ++ TRUE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_25_PLTREL", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffff, /* src_mask */ ++ 0xffffff, /* 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, because the object being ++ run has to have the data at some particular address. */ ++ HOWTO2 (R_NDS32_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_NDS32_COPY", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Like R_NDS32_20, but used when setting global offset table ++ entries. */ ++ HOWTO2 (R_NDS32_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_NDS32_GLOB_DAT", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Marks a procedure linkage table entry for a symbol. */ ++ HOWTO2 (R_NDS32_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_NDS32_JMP_SLOT", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* 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. */ ++ HOWTO2 (R_NDS32_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_NDS32_RELATIVE", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ HOWTO2 (R_NDS32_GOTOFF, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOTOFF", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xfffff, /* src_mask */ ++ 0xfffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* An PC Relative 20-bit relocation used when setting PIC offset ++ table register. */ ++ HOWTO2 (R_NDS32_GOTPC20, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ TRUE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOTPC20", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xfffff, /* src_mask */ ++ 0xfffff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ ++ /* Like R_NDS32_HI20, but referring to the GOT table entry for ++ the symbol. */ ++ HOWTO2 (R_NDS32_GOT_HI20, /* type */ ++ 12, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOT_HI20", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_GOT_LO12, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOT_LO12", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* An PC Relative relocation used when setting PIC offset table register. ++ Like R_NDS32_HI20, but referring to the GOT table entry for ++ the symbol. */ ++ HOWTO2 (R_NDS32_GOTPC_HI20, /* type */ ++ 12, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOTPC_HI20", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_GOTPC_LO12, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOTPC_LO12", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ ++ HOWTO2 (R_NDS32_GOTOFF_HI20, /* type */ ++ 12, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOTOFF_HI20", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_GOTOFF_LO12, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOTOFF_LO12", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Alignment hint for relaxable instruction. This is used with ++ R_NDS32_LABEL as a pair. Relax this instruction from 4 bytes to 2 ++ in order to make next label aligned on word boundary. */ ++ HOWTO2 (R_NDS32_INSN16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_INSN16", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Alignment hint for label. */ ++ HOWTO2 (R_NDS32_LABEL, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LABEL", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for unconditional call sequence */ ++ HOWTO2 (R_NDS32_LONGCALL1, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LONGCALL1", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for conditional call sequence. */ ++ HOWTO2 (R_NDS32_LONGCALL2, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LONGCALL2", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for conditional call sequence. */ ++ HOWTO2 (R_NDS32_LONGCALL3, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LONGCALL3", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for unconditional branch sequence. */ ++ HOWTO2 (R_NDS32_LONGJUMP1, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LONGJUMP1", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for conditional branch sequence. */ ++ HOWTO2 (R_NDS32_LONGJUMP2, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LONGJUMP2", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for conditional branch sequence. */ ++ HOWTO2 (R_NDS32_LONGJUMP3, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LONGJUMP3", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for load/store sequence. */ ++ HOWTO2 (R_NDS32_LOADSTORE, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LOADSTORE", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for load/store sequence. */ ++ HOWTO2 (R_NDS32_9_FIXED_RELA, /* type */ ++ 0, /* rightshift */ ++ 1, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_9_FIXED_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x000000ff, /* src_mask */ ++ 0x000000ff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for load/store sequence. */ ++ HOWTO2 (R_NDS32_15_FIXED_RELA,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_15_FIXED_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00003fff, /* src_mask */ ++ 0x00003fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for load/store sequence. */ ++ HOWTO2 (R_NDS32_17_FIXED_RELA,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_17_FIXED_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for load/store sequence. */ ++ HOWTO2 (R_NDS32_25_FIXED_RELA,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_25_FIXED_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00ffffff, /* src_mask */ ++ 0x00ffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* High 20 bits of PLT symbol offset relative to PC. */ ++ HOWTO2 (R_NDS32_PLTREL_HI20, /* type */ ++ 12, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_PLTREL_HI20", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Low 12 bits of PLT symbol offset relative to PC. */ ++ HOWTO2 (R_NDS32_PLTREL_LO12, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_PLTREL_LO12", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* High 20 bits of PLT symbol offset relative to GOT (GP). */ ++ HOWTO2 (R_NDS32_PLT_GOTREL_HI20, /* type */ ++ 12, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_PLT_GOTREL_HI20",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Low 12 bits of PLT symbol offset relative to GOT (GP). */ ++ HOWTO2 (R_NDS32_PLT_GOTREL_LO12,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_PLT_GOTREL_LO12",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Small data area 12 bits offset. */ ++ HOWTO2 (R_NDS32_SDA12S2_DP_RELA,/* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_SDA12S2_DP_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Small data area 12 bits offset. */ ++ HOWTO2 (R_NDS32_SDA12S2_SP_RELA,/* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_SDA12S2_SP_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ /* Lower 12 bits of address. */ ++ ++ HOWTO2 (R_NDS32_LO12S2_DP_RELA, /* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 10, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_LO12S2_DP_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x000003ff, /* src_mask */ ++ 0x000003ff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Lower 12 bits of address. */ ++ HOWTO2 (R_NDS32_LO12S2_SP_RELA,/* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 10, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_LO12S2_SP_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x000003ff, /* src_mask */ ++ 0x000003ff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ /* Lower 12 bits of address. Special identity for or case. */ ++ HOWTO2 (R_NDS32_LO12S0_ORI_RELA,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_LO12S0_ORI_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ /* Small data area 19 bits offset. */ ++ HOWTO2 (R_NDS32_SDA16S3_RELA, /* type */ ++ 3, /* 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_NDS32_SDA16S3_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Small data area 15 bits offset. */ ++ HOWTO2 (R_NDS32_SDA17S2_RELA, /* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 17, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_SDA17S2_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x0001ffff, /* src_mask */ ++ 0x0001ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ HOWTO2 (R_NDS32_SDA18S1_RELA, /* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 18, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_SDA18S1_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x0003ffff, /* src_mask */ ++ 0x0003ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ HOWTO2 (R_NDS32_SDA19S0_RELA, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 19, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_SDA19S0_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x0007ffff, /* src_mask */ ++ 0x0007ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_DWARF2_OP1_RELA,/* type */ ++ 0, /* rightshift */ ++ 0, /* size (0 = byte, 1 = short, 2 = long) */ ++ 8, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_DWARF2_OP1_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xff, /* src_mask */ ++ 0xff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_DWARF2_OP2_RELA,/* type */ ++ 0, /* rightshift */ ++ 1, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_DWARF2_OP2_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffff, /* src_mask */ ++ 0xffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_DWARF2_LEB_RELA,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_DWARF2_LEB_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_UPDATE_TA_RELA,/* type */ ++ 0, /* rightshift */ ++ 1, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_UPDATE_TA_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffff, /* src_mask */ ++ 0xffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ /* Like R_NDS32_PCREL, but referring to the procedure linkage table ++ entry for the symbol. */ ++ HOWTO2 (R_NDS32_9_PLTREL, /* type */ ++ 1, /* rightshift */ ++ 1, /* size (0 = byte, 1 = short, 2 = long) */ ++ 8, /* bitsize */ ++ TRUE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_9_PLTREL", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xff, /* src_mask */ ++ 0xff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ /* Low 20 bits of PLT symbol offset relative to GOT (GP). */ ++ HOWTO2 (R_NDS32_PLT_GOTREL_LO20,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_PLT_GOTREL_LO20",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ /* low 15 bits of PLT symbol offset relative to GOT (GP) */ ++ HOWTO2 (R_NDS32_PLT_GOTREL_LO15,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_PLT_GOTREL_LO15",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00007fff, /* src_mask */ ++ 0x00007fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ /* Low 19 bits of PLT symbol offset relative to GOT (GP). */ ++ HOWTO2 (R_NDS32_PLT_GOTREL_LO19,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 19, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_PLT_GOTREL_LO19",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x0007ffff, /* src_mask */ ++ 0x0007ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_GOT_LO15, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOT_LO15", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00007fff, /* src_mask */ ++ 0x00007fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_GOT_LO19, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 19, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOT_LO19", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x0007ffff, /* src_mask */ ++ 0x0007ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_GOTOFF_LO15, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOTOFF_LO15", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00007fff, /* src_mask */ ++ 0x00007fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_GOTOFF_LO19, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 19, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOTOFF_LO19", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x0007ffff, /* src_mask */ ++ 0x0007ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ /* GOT 15 bits offset. */ ++ HOWTO2 (R_NDS32_GOT15S2_RELA, /* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOT15S2_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00007fff, /* src_mask */ ++ 0x00007fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ /* GOT 17 bits offset. */ ++ HOWTO2 (R_NDS32_GOT17S2_RELA, /* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 17, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_GOT17S2_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x0001ffff, /* src_mask */ ++ 0x0001ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ /* A 5 bit address. */ ++ HOWTO2 (R_NDS32_5_RELA, /* type */ ++ 0, /* rightshift */ ++ 1, /* size (0 = byte, 1 = short, 2 = long) */ ++ 5, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_5_RELA", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x1f, /* src_mask */ ++ 0x1f, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_10_UPCREL_RELA,/* type */ ++ 1, /* rightshift */ ++ 1, /* size (0 = byte, 1 = short, 2 = long) */ ++ 9, /* bitsize */ ++ TRUE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_unsigned,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_10_UPCREL_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x1ff, /* src_mask */ ++ 0x1ff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_SDA_FP7U2_RELA,/* type */ ++ 2, /* rightshift */ ++ 1, /* size (0 = byte, 1 = short, 2 = long) */ ++ 7, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_unsigned,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_SDA_FP7U2_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x0000007f, /* src_mask */ ++ 0x0000007f, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_WORD_9_PCREL_RELA,/* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 8, /* bitsize */ ++ TRUE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_WORD_9_PCREL_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xff, /* src_mask */ ++ 0xff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_25_ABS_RELA, /* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 24, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_25_ABS_RELA", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffff, /* src_mask */ ++ 0xffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* A relative 17 bit relocation for ifc, right shifted by 1. */ ++ HOWTO2 (R_NDS32_17IFC_PCREL_RELA,/* type */ ++ 1, /* 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_NDS32_17IFC_PCREL_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffff, /* src_mask */ ++ 0xffff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ ++ /* A relative unsigned 10 bit relocation for ifc, right shifted by 1. */ ++ HOWTO2 (R_NDS32_10IFCU_PCREL_RELA,/* type */ ++ 1, /* rightshift */ ++ 1, /* size (0 = byte, 1 = short, 2 = long) */ ++ 9, /* bitsize */ ++ TRUE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_unsigned,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_10IFCU_PCREL_RELA",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x1ff, /* src_mask */ ++ 0x1ff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ ++ /* Relax hint for unconditional call sequence */ ++ HOWTO2 (R_NDS32_LONGCALL4, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LONGCALL4", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for conditional call sequence. */ ++ HOWTO2 (R_NDS32_LONGCALL5, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LONGCALL5", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for conditional call sequence. */ ++ HOWTO2 (R_NDS32_LONGCALL6, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LONGCALL6", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for unconditional branch sequence. */ ++ HOWTO2 (R_NDS32_LONGJUMP4, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LONGJUMP4", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for conditional branch sequence. */ ++ HOWTO2 (R_NDS32_LONGJUMP5, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LONGJUMP5", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for conditional branch sequence. */ ++ HOWTO2 (R_NDS32_LONGJUMP6, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LONGJUMP6", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Relax hint for conditional branch sequence. */ ++ HOWTO2 (R_NDS32_LONGJUMP7, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_LONGJUMP7", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Check sum value for security. */ ++ HOWTO2 (R_NDS32_SECURITY_16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 5, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_SECURITY_16", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x1fffe0, /* src_mask */ ++ 0x1fffe0, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++ ++ /* TLS LE TP offset relocation */ ++ HOWTO2 (R_NDS32_TLS_TPOFF, /* 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_NDS32_TLS_TPOFF", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Like R_NDS32_HI20, but referring to the TLS LE entry for the symbol. */ ++ HOWTO2 (R_NDS32_TLS_LE_HI20, /* type */ ++ 12, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_LE_HI20", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_TLS_LE_LO12, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_LE_LO12", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* A 20 bit address. */ ++ HOWTO2 (R_NDS32_TLS_LE_20, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_LE_20", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xfffff, /* src_mask */ ++ 0xfffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_TLS_LE_15S0, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_LE_15S0", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x7fff, /* src_mask */ ++ 0x7fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_TLS_LE_15S1, /* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_LE_15S1", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x7fff, /* src_mask */ ++ 0x7fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_TLS_LE_15S2, /* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 15, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_LE_15S2", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x7fff, /* src_mask */ ++ 0x7fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Like R_NDS32_HI20, but referring to the TLS IE entry for the symbol. */ ++ HOWTO2 (R_NDS32_TLS_IE_HI20, /* type */ ++ 12, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_IE_HI20", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_TLS_IE_LO12, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_IE_LO12", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO2 (R_NDS32_TLS_IE_LO12S2,/* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 10, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_IE_LO12S2",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x000003ff, /* src_mask */ ++ 0x000003ff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Like R_NDS32_HI20, but referring to the TLS IE (PIE) entry for the symbol. */ ++ HOWTO2 (R_NDS32_TLS_IEGP_HI20,/* type */ ++ 12, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_IEGP_HI20",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ HOWTO2 (R_NDS32_TLS_IEGP_LO12,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_IEGP_LO12",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ HOWTO2 (R_NDS32_TLS_IEGP_LO12S2,/* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 10, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_IEGP_LO12S2",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x000003ff, /* src_mask */ ++ 0x000003ff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* TLS description relocation */ ++ HOWTO2 (R_NDS32_TLS_DESC, /* type */ ++ 12, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_hi20_reloc, /* special_function */ ++ "R_NDS32_TLS_DESC_HI20",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* TLS GD/LD description offset high part. */ ++ HOWTO2 (R_NDS32_TLS_DESC_HI20,/* type */ ++ 12, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_hi20_reloc, /* special_function */ ++ "R_NDS32_TLS_DESC_HI20",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ /* TLS GD/LD description offset low part. */ ++ HOWTO2 (R_NDS32_TLS_DESC_LO12,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_lo12_reloc, /* special_function */ ++ "R_NDS32_TLS_DESC_LO12",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* TLS GD/LD description offset set (movi). */ ++ HOWTO2 (R_NDS32_TLS_DESC_20, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_DESC_20", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* TLS GD/LD description offset set (lwi.gp). */ ++ HOWTO2 (R_NDS32_TLS_DESC_SDA17S2,/* type */ ++ 2, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 17, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_TLS_DESC_SDA17S2",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x0001ffff, /* src_mask */ ++ 0x0001ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* Jump-patch table relocations. */ ++ /* High 20 bits of jump-patch table address. */ ++ HOWTO2 (R_NDS32_ICT_HI20, /* type */ ++ 12, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 20, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_ICT_HI20", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000fffff, /* src_mask */ ++ 0x000fffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ /* Lower 12 bits of jump-patch table address. */ ++ HOWTO2 (R_NDS32_ICT_LO12,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 12, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_ICT_LO12",/* name */ ++ FALSE, /* partial_inplace */ ++ 0x00000fff, /* src_mask */ ++ 0x00000fff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ /* A relative 25 bit relocation, right shifted by 2. */ ++ HOWTO2 (R_NDS32_ICT_25PC,/* type */ ++ 1, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 24, /* bitsize */ ++ TRUE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed,/* complain_on_overflow */ ++ bfd_elf_generic_reloc, /* special_function */ ++ "R_NDS32_ICT_25PC",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffff, /* src_mask */ ++ 0xffffff, /* dst_mask */ ++ TRUE), /* pcrel_offset */ ++}; ++ ++/* Relocations used for relaxation. */ ++#define HOWTO3(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \ ++ [C-R_NDS32_RELAX_ENTRY] = HOWTO(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) ++ ++static reloc_howto_type nds32_elf_relax_howto_table[] = { ++ HOWTO3 (R_NDS32_RELAX_ENTRY, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_RELAX_ENTRY", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_GOT_SUFF, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_GOT_SUFF", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_GOTOFF_SUFF, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_bitfield,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_GOTOFF_SUFF", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_PLT_GOT_SUFF, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_PLT_GOT_SUFF",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_MULCALL_SUFF, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_MULCALL_SUFF",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_PTR, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_PTR", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_PTR_COUNT, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_PTR_COUNT", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_PTR_RESOLVED, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_PTR_RESOLVED",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_PLTBLOCK, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_PLTBLOCK", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_RELAX_REGION_BEGIN,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_RELAX_REGION_BEGIN",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_RELAX_REGION_END,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_RELAX_REGION_END",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_MINUEND, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_MINUEND", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_SUBTRAHEND, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_SUBTRAHEND", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_DIFF8, /* type */ ++ 0, /* rightshift */ ++ 0, /* size (0 = byte, 1 = short, 2 = long) */ ++ 8, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_DIFF8", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x000000ff, /* src_mask */ ++ 0x000000ff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_DIFF16, /* type */ ++ 0, /* rightshift */ ++ 1, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_DIFF16", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_DIFF32, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_DIFF32", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_DIFF_ULEB128, /* type */ ++ 0, /* rightshift */ ++ 0, /* size (0 = byte, 1 = short, 2 = long) */ ++ 0, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_DIFF_ULEB128",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_DATA, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_DATA", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_TRAN, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_TRAN", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_EMPTY, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_EMPTY", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ HOWTO3 (R_NDS32_TLS_LE_ADD, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_TLS_LE_ADD", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ HOWTO3 (R_NDS32_TLS_LE_LS, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_TLS_LE_LS", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ HOWTO3 (R_NDS32_TLS_IEGP_LW, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_TLS_IEGP_LW", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* TLS GD/LD description address base addition. */ ++ HOWTO3 (R_NDS32_TLS_DESC_ADD, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_TLS_DESC_ADD",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* TLS GD/LD description function load. */ ++ HOWTO3 (R_NDS32_TLS_DESC_FUNC,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_TLS_DESC_FUNC",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* TLS DESC resolve function call. */ ++ HOWTO3 (R_NDS32_TLS_DESC_CALL,/* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_TLS_DESC_CALL",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* TLS DESC variable access. */ ++ HOWTO3 (R_NDS32_TLS_DESC_MEM, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_TLS_DESC_MEM",/* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* TLS GD/LD description mark (@tlsdec). */ ++ HOWTO3 (R_NDS32_RELAX_REMOVE, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_REMOVE", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* TLS GD/LD description mark (@tlsdec). */ ++ HOWTO3 (R_NDS32_RELAX_GROUP, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 32, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_dont,/* complain_on_overflow */ ++ nds32_elf_ignore_reloc,/* special_function */ ++ "R_NDS32_GROUP", /* name */ ++ FALSE, /* partial_inplace */ ++ 0xffffffff, /* src_mask */ ++ 0xffffffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++}; ++ ++ ++static unsigned long dl_tlsdesc_lazy_trampoline[] = ++{ ++ 0x46200000, /* sethi $r2,#0x0 */ ++ 0x58210000, /* ori $r2,$r2,#0x0 */ ++ 0x40217400, /* add $r2,$r2,$gp */ ++ 0x04210000, /* lwi $r2,[$r2+#0x0] */ ++ 0x46300000, /* sethi $r3,#0x0 */ ++ 0x58318000, /* ori $r3,$r3,#0x0 */ ++ 0x4031f400, /* add $r3,$r3,$gp */ ++ 0x4a000800, /* jr $r2 */ ++}; ++ ++/* === code === */ ++ ++static void ++nds32_put_trampoline (void *contents, const unsigned long *template, ++ unsigned count) ++{ ++ unsigned ix; ++ ++ for (ix = 0; ix != count; ix++) ++ { ++ unsigned long insn = template[ix]; ++ bfd_putb32 (insn, (char *) contents + ix * 4); ++ } ++} ++ ++/* nds32_insertion_sort sorts an array with nmemb elements of size size. ++ This prototype is the same as qsort (). */ ++ ++void ++nds32_insertion_sort (void *base, size_t nmemb, size_t size, ++ int (*compar) (const void *lhs, const void *rhs)) ++{ ++ char *ptr = (char *) base; ++ int i, j; ++ char *tmp = alloca (size); ++ ++ /* If i is less than j, i is inserted before j. ++ ++ |---- j ----- i --------------| ++ \ / \ / ++ sorted unsorted ++ */ ++ ++ for (i = 1; i < (int) nmemb; i++) ++ { ++ for (j = (i - 1); j >= 0; j--) ++ if (compar (ptr + i * size, ptr + j * size) >= 0) ++ break; ++ ++ j++; ++ ++ if (i == j) ++ continue; /* i is in order. */ ++ ++ memcpy (tmp, ptr + i * size, size); ++ memmove (ptr + (j + 1) * size, ptr + j * size, (i - j) * size); ++ memcpy (ptr + j * size, tmp, size); ++ } ++} ++ ++/* Sort relocation by r_offset. ++ ++ We didn't use qsort () in stdlib, because quick-sort is not a stable sorting ++ algorithm. Relocations at the same r_offset must keep their order. ++ For example, RELAX_ENTRY must be the very first relocation entry. ++ ++ Currently, this function implements insertion-sort. ++ ++ FIXME: If we already sort them in assembler, why bother sort them ++ here again? */ ++ ++static int ++compar_reloc (const void *lhs, const void *rhs) ++{ ++ const Elf_Internal_Rela *l = (const Elf_Internal_Rela *) lhs; ++ const Elf_Internal_Rela *r = (const Elf_Internal_Rela *) rhs; ++ ++ if (l->r_offset > r->r_offset) ++ return 1; ++ else if (l->r_offset == r->r_offset) ++ return 0; ++ else ++ return -1; ++} ++ ++/* Functions listed below are only used for old relocs. ++ nds32_elf_9_pcrel_reloc ++ nds32_elf_do_9_pcrel_reloc ++ nds32_elf_hi20_reloc ++ nds32_elf_relocate_hi20 ++ nds32_elf_lo12_reloc ++ nds32_elf_sda15_reloc ++ nds32_elf_generic_reloc */ ++ ++/* Handle the R_NDS32_9_PCREL & R_NDS32_9_PCREL_RELA reloc. */ ++ ++static bfd_reloc_status_type ++nds32_elf_9_pcrel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, ++ void *data, asection *input_section, bfd *output_bfd, ++ char **error_message ATTRIBUTE_UNUSED) ++{ ++ /* This part is from bfd_elf_generic_reloc. */ ++ 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) ++ { ++ /* FIXME: See bfd_perform_relocation. Is this right? */ ++ return bfd_reloc_continue; ++ } ++ ++ return nds32_elf_do_9_pcrel_reloc (abfd, reloc_entry->howto, ++ input_section, ++ data, reloc_entry->address, ++ symbol->section, ++ (symbol->value ++ + symbol->section->output_section->vma ++ + symbol->section->output_offset), ++ reloc_entry->addend); ++} ++ ++/* Utility to actually perform an R_NDS32_9_PCREL reloc. */ ++#define N_ONES(n) (((((bfd_vma) 1 << ((n) - 1)) - 1) << 1) | 1) ++ ++static bfd_reloc_status_type ++nds32_elf_do_9_pcrel_reloc (bfd *abfd, reloc_howto_type *howto, ++ asection *input_section, bfd_byte *data, ++ bfd_vma offset, ++ asection *symbol_section ATTRIBUTE_UNUSED, ++ bfd_vma symbol_value, bfd_vma addend) ++{ ++ bfd_signed_vma relocation; ++ unsigned short x; ++ bfd_reloc_status_type status; ++ ++ /* Sanity check the address (offset in section). */ ++ if (offset > bfd_get_section_limit (abfd, input_section)) ++ return bfd_reloc_outofrange; ++ ++ relocation = symbol_value + addend; ++ /* Make it pc relative. */ ++ relocation -= (input_section->output_section->vma ++ + input_section->output_offset); ++ /* These jumps mask off the lower two bits of the current address ++ before doing pcrel calculations. */ ++ relocation -= (offset & -(bfd_vma) 2); ++ ++ if (relocation < -ACCURATE_8BIT_S1 || relocation >= ACCURATE_8BIT_S1) ++ status = bfd_reloc_overflow; ++ else ++ status = bfd_reloc_ok; ++ ++ x = bfd_getb16 (data + offset); ++ ++ relocation >>= howto->rightshift; ++ relocation <<= howto->bitpos; ++ x = (x & ~howto->dst_mask) ++ | (((x & howto->src_mask) + relocation) & howto->dst_mask); ++ ++ bfd_putb16 ((bfd_vma) x, data + offset); ++ ++ return status; ++} ++ ++/* Handle the R_NDS32_HI20_[SU]LO relocs. ++ HI20_SLO is for the add3 and load/store with displacement instructions. ++ HI20 is for the or3 instruction. ++ For R_NDS32_HI20_SLO, the lower 16 bits are sign extended when added to ++ the high 16 bytes so if the lower 16 bits are negative (bit 15 == 1) then ++ we must add one to the high 16 bytes (which will get subtracted off when ++ the low 16 bits are added). ++ These relocs have to be done in combination with an R_NDS32_LO12 reloc ++ because there is a carry from the LO12 to the HI20. Here we just save ++ the information we need; we do the actual relocation when we see the LO12. ++ This code is copied from the elf32-mips.c. We also support an arbitrary ++ number of HI20 relocs to be associated with a single LO12 reloc. The ++ assembler sorts the relocs to ensure each HI20 immediately precedes its ++ LO12. However if there are multiple copies, the assembler may not find ++ the real LO12 so it picks the first one it finds. */ ++ ++struct nds32_hi20 ++{ ++ struct nds32_hi20 *next; ++ bfd_byte *addr; ++ bfd_vma addend; ++}; ++ ++static struct nds32_hi20 *nds32_hi20_list; ++ ++static bfd_reloc_status_type ++nds32_elf_hi20_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, ++ asymbol *symbol, void *data, asection *input_section, ++ bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED) ++{ ++ bfd_reloc_status_type ret; ++ bfd_vma relocation; ++ struct nds32_hi20 *n; ++ ++ /* This part is from bfd_elf_generic_reloc. ++ 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; ++ } ++ ++ /* Sanity check the address (offset in section). */ ++ if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) ++ return bfd_reloc_outofrange; ++ ++ 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; ++ ++ /* Save the information, and let LO12 do the actual relocation. */ ++ n = (struct nds32_hi20 *) bfd_malloc ((bfd_size_type) sizeof *n); ++ if (n == NULL) ++ return bfd_reloc_outofrange; ++ ++ n->addr = (bfd_byte *) data + reloc_entry->address; ++ n->addend = relocation; ++ n->next = nds32_hi20_list; ++ nds32_hi20_list = n; ++ ++ if (output_bfd != (bfd *) NULL) ++ reloc_entry->address += input_section->output_offset; ++ ++ return ret; ++} ++ ++/* Handle an NDS32 ELF HI20 reloc. */ ++ ++static void ++nds32_elf_relocate_hi20 (bfd *input_bfd ATTRIBUTE_UNUSED, ++ int type ATTRIBUTE_UNUSED, Elf_Internal_Rela *relhi, ++ Elf_Internal_Rela *rello, bfd_byte *contents, ++ bfd_vma addend) ++{ ++ unsigned long insn; ++ bfd_vma addlo; ++ ++ insn = bfd_getb32 (contents + relhi->r_offset); ++ ++ addlo = bfd_getb32 (contents + rello->r_offset); ++ addlo &= 0xfff; ++ ++ addend += ((insn & 0xfffff) << 20) + addlo; ++ ++ insn = (insn & 0xfff00000) | ((addend >> 12) & 0xfffff); ++ bfd_putb32 (insn, contents + relhi->r_offset); ++} ++ ++/* Do an R_NDS32_LO12 relocation. This is a straightforward 12 bit ++ inplace relocation; this function exists in order to do the ++ R_NDS32_HI20_[SU]LO relocation described above. */ ++ ++static bfd_reloc_status_type ++nds32_elf_lo12_reloc (bfd *input_bfd, arelent *reloc_entry, asymbol *symbol, ++ void *data, asection *input_section, bfd *output_bfd, ++ char **error_message) ++{ ++ /* This part is from bfd_elf_generic_reloc. ++ If we're relocating, and this an external symbol, we don't want ++ to change anything. */ ++ if (output_bfd != NULL && (symbol->flags & BSF_SECTION_SYM) == 0 ++ && reloc_entry->addend == 0) ++ { ++ reloc_entry->address += input_section->output_offset; ++ return bfd_reloc_ok; ++ } ++ ++ if (nds32_hi20_list != NULL) ++ { ++ struct nds32_hi20 *l; ++ ++ l = nds32_hi20_list; ++ while (l != NULL) ++ { ++ unsigned long insn; ++ unsigned long val; ++ unsigned long vallo; ++ struct nds32_hi20 *next; ++ ++ /* Do the HI20 relocation. Note that we actually don't need ++ to know anything about the LO12 itself, except where to ++ find the low 12 bits of the addend needed by the LO12. */ ++ insn = bfd_getb32 (l->addr); ++ vallo = bfd_getb32 ((bfd_byte *) data + reloc_entry->address); ++ vallo &= 0xfff; ++ switch (reloc_entry->howto->type) ++ { ++ case R_NDS32_LO12S3: ++ vallo <<= 3; ++ break; ++ ++ case R_NDS32_LO12S2: ++ vallo <<= 2; ++ break; ++ ++ case R_NDS32_LO12S1: ++ vallo <<= 1; ++ break; ++ ++ case R_NDS32_LO12S0: ++ vallo <<= 0; ++ break; ++ } ++ ++ val = ((insn & 0xfffff) << 12) + vallo; ++ val += l->addend; ++ ++ insn = (insn & ~(bfd_vma) 0xfffff) | ((val >> 12) & 0xfffff); ++ bfd_putb32 ((bfd_vma) insn, l->addr); ++ ++ next = l->next; ++ free (l); ++ l = next; ++ } ++ ++ nds32_hi20_list = NULL; ++ } ++ ++ /* Now do the LO12 reloc in the usual way. ++ ??? It would be nice to call bfd_elf_generic_reloc here, ++ but we have partial_inplace set. bfd_elf_generic_reloc will ++ pass the handling back to bfd_install_relocation which will install ++ a section relative addend which is wrong. */ ++ return nds32_elf_generic_reloc (input_bfd, reloc_entry, symbol, data, ++ input_section, output_bfd, error_message); ++} ++ ++/* Do generic partial_inplace relocation. ++ This is a local replacement for bfd_elf_generic_reloc. */ ++ ++static bfd_reloc_status_type ++nds32_elf_generic_reloc (bfd *input_bfd, arelent *reloc_entry, ++ asymbol *symbol, void *data, asection *input_section, ++ bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED) ++{ ++ bfd_reloc_status_type ret; ++ bfd_vma relocation; ++ bfd_byte *inplace_address; ++ ++ /* This part is from bfd_elf_generic_reloc. ++ If we're relocating, and this an external symbol, we don't want ++ to change anything. */ ++ if (output_bfd != NULL && (symbol->flags & BSF_SECTION_SYM) == 0 ++ && reloc_entry->addend == 0) ++ { ++ reloc_entry->address += input_section->output_offset; ++ return bfd_reloc_ok; ++ } ++ ++ /* Now do the reloc in the usual way. ++ ??? It would be nice to call bfd_elf_generic_reloc here, ++ but we have partial_inplace set. bfd_elf_generic_reloc will ++ pass the handling back to bfd_install_relocation which will install ++ a section relative addend which is wrong. */ ++ ++ /* Sanity check the address (offset in section). */ ++ if (reloc_entry->address > bfd_get_section_limit (input_bfd, input_section)) ++ return bfd_reloc_outofrange; ++ ++ 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) || output_bfd != (bfd *) NULL) ++ relocation = 0; ++ else ++ relocation = symbol->value; ++ ++ /* Only do this for a final link. */ ++ if (output_bfd == (bfd *) NULL) ++ { ++ relocation += symbol->section->output_section->vma; ++ relocation += symbol->section->output_offset; ++ } ++ ++ relocation += reloc_entry->addend; ++ switch (reloc_entry->howto->type) ++ { ++ case R_NDS32_LO12S3: ++ relocation >>= 3; ++ break; ++ ++ case R_NDS32_LO12S2: ++ relocation >>= 2; ++ break; ++ ++ case R_NDS32_LO12S1: ++ relocation >>= 1; ++ break; ++ ++ case R_NDS32_LO12S0: ++ default: ++ relocation >>= 0; ++ break; ++ } ++ ++ inplace_address = (bfd_byte *) data + reloc_entry->address; ++ ++#define DOIT(x) \ ++ x = ((x & ~reloc_entry->howto->dst_mask) | \ ++ (((x & reloc_entry->howto->src_mask) + relocation) & \ ++ reloc_entry->howto->dst_mask)) ++ ++ switch (reloc_entry->howto->size) ++ { ++ case 1: ++ { ++ short x = bfd_getb16 (inplace_address); ++ ++ DOIT (x); ++ bfd_putb16 ((bfd_vma) x, inplace_address); ++ } ++ break; ++ case 2: ++ { ++ unsigned long x = bfd_getb32 (inplace_address); ++ ++ DOIT (x); ++ bfd_putb32 ((bfd_vma) x, inplace_address); ++ } ++ break; ++ default: ++ BFD_ASSERT (0); ++ } ++ ++ if (output_bfd != (bfd *) NULL) ++ reloc_entry->address += input_section->output_offset; ++ ++ return ret; ++} ++ ++/* Handle the R_NDS32_SDA15 reloc. ++ This reloc is used to compute the address of objects in the small data area ++ and to perform loads and stores from that area. ++ The lower 15 bits are sign extended and added to the register specified ++ in the instruction, which is assumed to point to _SDA_BASE_. ++ ++ Since the lower 15 bits offset is left-shifted 0, 1 or 2 bits depending on ++ the access size, this must be taken care of. */ ++ ++static bfd_reloc_status_type ++nds32_elf_sda15_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, ++ asymbol *symbol, void *data ATTRIBUTE_UNUSED, ++ asection *input_section, bfd *output_bfd, ++ char **error_message ATTRIBUTE_UNUSED) ++{ ++ /* This part is from bfd_elf_generic_reloc. */ ++ 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) ++ { ++ /* FIXME: See bfd_perform_relocation. Is this right? */ ++ return bfd_reloc_continue; ++ } ++ ++ /* FIXME: not sure what to do here yet. But then again, the linker ++ may never call us. */ ++ abort (); ++} ++ ++/* nds32_elf_ignore_reloc is the special function for ++ relocation types which don't need to be relocated ++ like relaxation relocation types. ++ This function simply return bfd_reloc_ok when it is ++ invoked. */ ++ ++static bfd_reloc_status_type ++nds32_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, ++ asymbol *symbol ATTRIBUTE_UNUSED, ++ void *data ATTRIBUTE_UNUSED, asection *input_section, ++ bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED) ++{ ++ if (output_bfd != NULL) ++ reloc_entry->address += input_section->output_offset; ++ ++ return bfd_reloc_ok; ++} ++ ++ ++/* Map BFD reloc types to NDS32 ELF reloc types. */ ++ ++struct nds32_reloc_map_entry ++{ ++ bfd_reloc_code_real_type bfd_reloc_val; ++ unsigned char elf_reloc_val; ++}; ++ ++static const struct nds32_reloc_map_entry nds32_reloc_map[] = { ++ {BFD_RELOC_NONE, R_NDS32_NONE}, ++ {BFD_RELOC_16, R_NDS32_16_RELA}, ++ {BFD_RELOC_32, R_NDS32_32_RELA}, ++ {BFD_RELOC_NDS32_20, R_NDS32_20_RELA}, ++ {BFD_RELOC_NDS32_5, R_NDS32_5_RELA}, ++ {BFD_RELOC_NDS32_9_PCREL, R_NDS32_9_PCREL_RELA}, ++ {BFD_RELOC_NDS32_WORD_9_PCREL, R_NDS32_WORD_9_PCREL_RELA}, ++ {BFD_RELOC_NDS32_15_PCREL, R_NDS32_15_PCREL_RELA}, ++ {BFD_RELOC_NDS32_17_PCREL, R_NDS32_17_PCREL_RELA}, ++ {BFD_RELOC_NDS32_25_PCREL, R_NDS32_25_PCREL_RELA}, ++ {BFD_RELOC_NDS32_10_UPCREL, R_NDS32_10_UPCREL_RELA}, ++ {BFD_RELOC_NDS32_HI20, R_NDS32_HI20_RELA}, ++ {BFD_RELOC_NDS32_LO12S3, R_NDS32_LO12S3_RELA}, ++ {BFD_RELOC_NDS32_LO12S2, R_NDS32_LO12S2_RELA}, ++ {BFD_RELOC_NDS32_LO12S1, R_NDS32_LO12S1_RELA}, ++ {BFD_RELOC_NDS32_LO12S0, R_NDS32_LO12S0_RELA}, ++ {BFD_RELOC_NDS32_LO12S0_ORI, R_NDS32_LO12S0_ORI_RELA}, ++ {BFD_RELOC_NDS32_SDA15S3, R_NDS32_SDA15S3_RELA}, ++ {BFD_RELOC_NDS32_SDA15S2, R_NDS32_SDA15S2_RELA}, ++ {BFD_RELOC_NDS32_SDA15S1, R_NDS32_SDA15S1_RELA}, ++ {BFD_RELOC_NDS32_SDA15S0, R_NDS32_SDA15S0_RELA}, ++ {BFD_RELOC_VTABLE_INHERIT, R_NDS32_RELA_GNU_VTINHERIT}, ++ {BFD_RELOC_VTABLE_ENTRY, R_NDS32_RELA_GNU_VTENTRY}, ++ ++ {BFD_RELOC_NDS32_GOT20, R_NDS32_GOT20}, ++ {BFD_RELOC_NDS32_9_PLTREL, R_NDS32_9_PLTREL}, ++ {BFD_RELOC_NDS32_25_PLTREL, R_NDS32_25_PLTREL}, ++ {BFD_RELOC_NDS32_COPY, R_NDS32_COPY}, ++ {BFD_RELOC_NDS32_GLOB_DAT, R_NDS32_GLOB_DAT}, ++ {BFD_RELOC_NDS32_JMP_SLOT, R_NDS32_JMP_SLOT}, ++ {BFD_RELOC_NDS32_RELATIVE, R_NDS32_RELATIVE}, ++ {BFD_RELOC_NDS32_GOTOFF, R_NDS32_GOTOFF}, ++ {BFD_RELOC_NDS32_GOTPC20, R_NDS32_GOTPC20}, ++ {BFD_RELOC_NDS32_GOT_HI20, R_NDS32_GOT_HI20}, ++ {BFD_RELOC_NDS32_GOT_LO12, R_NDS32_GOT_LO12}, ++ {BFD_RELOC_NDS32_GOT_LO15, R_NDS32_GOT_LO15}, ++ {BFD_RELOC_NDS32_GOT_LO19, R_NDS32_GOT_LO19}, ++ {BFD_RELOC_NDS32_GOTPC_HI20, R_NDS32_GOTPC_HI20}, ++ {BFD_RELOC_NDS32_GOTPC_LO12, R_NDS32_GOTPC_LO12}, ++ {BFD_RELOC_NDS32_GOTOFF_HI20, R_NDS32_GOTOFF_HI20}, ++ {BFD_RELOC_NDS32_GOTOFF_LO12, R_NDS32_GOTOFF_LO12}, ++ {BFD_RELOC_NDS32_GOTOFF_LO15, R_NDS32_GOTOFF_LO15}, ++ {BFD_RELOC_NDS32_GOTOFF_LO19, R_NDS32_GOTOFF_LO19}, ++ {BFD_RELOC_NDS32_INSN16, R_NDS32_INSN16}, ++ {BFD_RELOC_NDS32_LABEL, R_NDS32_LABEL}, ++ {BFD_RELOC_NDS32_LONGCALL1, R_NDS32_LONGCALL1}, ++ {BFD_RELOC_NDS32_LONGCALL2, R_NDS32_LONGCALL2}, ++ {BFD_RELOC_NDS32_LONGCALL3, R_NDS32_LONGCALL3}, ++ {BFD_RELOC_NDS32_LONGCALL4, R_NDS32_LONGCALL4}, ++ {BFD_RELOC_NDS32_LONGCALL5, R_NDS32_LONGCALL5}, ++ {BFD_RELOC_NDS32_LONGCALL6, R_NDS32_LONGCALL6}, ++ {BFD_RELOC_NDS32_LONGJUMP1, R_NDS32_LONGJUMP1}, ++ {BFD_RELOC_NDS32_LONGJUMP2, R_NDS32_LONGJUMP2}, ++ {BFD_RELOC_NDS32_LONGJUMP3, R_NDS32_LONGJUMP3}, ++ {BFD_RELOC_NDS32_LONGJUMP4, R_NDS32_LONGJUMP4}, ++ {BFD_RELOC_NDS32_LONGJUMP5, R_NDS32_LONGJUMP5}, ++ {BFD_RELOC_NDS32_LONGJUMP6, R_NDS32_LONGJUMP6}, ++ {BFD_RELOC_NDS32_LONGJUMP7, R_NDS32_LONGJUMP7}, ++ {BFD_RELOC_NDS32_SECURITY_16, R_NDS32_SECURITY_16}, ++ {BFD_RELOC_NDS32_LOADSTORE, R_NDS32_LOADSTORE}, ++ {BFD_RELOC_NDS32_9_FIXED, R_NDS32_9_FIXED_RELA}, ++ {BFD_RELOC_NDS32_15_FIXED, R_NDS32_15_FIXED_RELA}, ++ {BFD_RELOC_NDS32_17_FIXED, R_NDS32_17_FIXED_RELA}, ++ {BFD_RELOC_NDS32_25_FIXED, R_NDS32_25_FIXED_RELA}, ++ {BFD_RELOC_NDS32_PLTREL_HI20, R_NDS32_PLTREL_HI20}, ++ {BFD_RELOC_NDS32_PLTREL_LO12, R_NDS32_PLTREL_LO12}, ++ {BFD_RELOC_NDS32_PLT_GOTREL_HI20, R_NDS32_PLT_GOTREL_HI20}, ++ {BFD_RELOC_NDS32_PLT_GOTREL_LO12, R_NDS32_PLT_GOTREL_LO12}, ++ {BFD_RELOC_NDS32_PLT_GOTREL_LO15, R_NDS32_PLT_GOTREL_LO15}, ++ {BFD_RELOC_NDS32_PLT_GOTREL_LO19, R_NDS32_PLT_GOTREL_LO19}, ++ {BFD_RELOC_NDS32_PLT_GOTREL_LO20, R_NDS32_PLT_GOTREL_LO20}, ++ {BFD_RELOC_NDS32_SDA12S2_DP, R_NDS32_SDA12S2_DP_RELA}, ++ {BFD_RELOC_NDS32_SDA12S2_SP, R_NDS32_SDA12S2_SP_RELA}, ++ {BFD_RELOC_NDS32_LO12S2_DP, R_NDS32_LO12S2_DP_RELA}, ++ {BFD_RELOC_NDS32_LO12S2_SP, R_NDS32_LO12S2_SP_RELA}, ++ {BFD_RELOC_NDS32_SDA16S3, R_NDS32_SDA16S3_RELA}, ++ {BFD_RELOC_NDS32_SDA17S2, R_NDS32_SDA17S2_RELA}, ++ {BFD_RELOC_NDS32_SDA18S1, R_NDS32_SDA18S1_RELA}, ++ {BFD_RELOC_NDS32_SDA19S0, R_NDS32_SDA19S0_RELA}, ++ {BFD_RELOC_NDS32_SDA_FP7U2_RELA, R_NDS32_SDA_FP7U2_RELA}, ++ {BFD_RELOC_NDS32_DWARF2_OP1, R_NDS32_DWARF2_OP1_RELA}, ++ {BFD_RELOC_NDS32_DWARF2_OP2, R_NDS32_DWARF2_OP2_RELA}, ++ {BFD_RELOC_NDS32_DWARF2_LEB, R_NDS32_DWARF2_LEB_RELA}, ++ {BFD_RELOC_NDS32_UPDATE_TA, R_NDS32_UPDATE_TA_RELA}, ++ {BFD_RELOC_NDS32_GOT_SUFF, R_NDS32_GOT_SUFF}, ++ {BFD_RELOC_NDS32_GOTOFF_SUFF, R_NDS32_GOTOFF_SUFF}, ++ {BFD_RELOC_NDS32_GOT15S2, R_NDS32_GOT15S2_RELA}, ++ {BFD_RELOC_NDS32_GOT17S2, R_NDS32_GOT17S2_RELA}, ++ {BFD_RELOC_NDS32_PTR, R_NDS32_PTR}, ++ {BFD_RELOC_NDS32_PTR_COUNT, R_NDS32_PTR_COUNT}, ++ {BFD_RELOC_NDS32_PLT_GOT_SUFF, R_NDS32_PLT_GOT_SUFF}, ++ {BFD_RELOC_NDS32_PTR_RESOLVED, R_NDS32_PTR_RESOLVED}, ++ {BFD_RELOC_NDS32_RELAX_ENTRY, R_NDS32_RELAX_ENTRY}, ++ {BFD_RELOC_NDS32_MULCALL_SUFF, R_NDS32_MULCALL_SUFF}, ++ {BFD_RELOC_NDS32_PLTBLOCK, R_NDS32_PLTBLOCK}, ++ {BFD_RELOC_NDS32_RELAX_REGION_BEGIN, R_NDS32_RELAX_REGION_BEGIN}, ++ {BFD_RELOC_NDS32_RELAX_REGION_END, R_NDS32_RELAX_REGION_END}, ++ {BFD_RELOC_NDS32_MINUEND, R_NDS32_MINUEND}, ++ {BFD_RELOC_NDS32_SUBTRAHEND, R_NDS32_SUBTRAHEND}, ++ {BFD_RELOC_NDS32_EMPTY, R_NDS32_EMPTY}, ++ ++ {BFD_RELOC_NDS32_DIFF8, R_NDS32_DIFF8}, ++ {BFD_RELOC_NDS32_DIFF16, R_NDS32_DIFF16}, ++ {BFD_RELOC_NDS32_DIFF32, R_NDS32_DIFF32}, ++ {BFD_RELOC_NDS32_DIFF_ULEB128, R_NDS32_DIFF_ULEB128}, ++ {BFD_RELOC_NDS32_25_ABS, R_NDS32_25_ABS_RELA}, ++ {BFD_RELOC_NDS32_DATA, R_NDS32_DATA}, ++ {BFD_RELOC_NDS32_TRAN, R_NDS32_TRAN}, ++ {BFD_RELOC_NDS32_17IFC_PCREL, R_NDS32_17IFC_PCREL_RELA}, ++ {BFD_RELOC_NDS32_10IFCU_PCREL, R_NDS32_10IFCU_PCREL_RELA}, ++ {BFD_RELOC_NDS32_TLS_LE_HI20, R_NDS32_TLS_LE_HI20}, ++ {BFD_RELOC_NDS32_TLS_LE_LO12, R_NDS32_TLS_LE_LO12}, ++ {BFD_RELOC_NDS32_TLS_LE_ADD, R_NDS32_TLS_LE_ADD}, ++ {BFD_RELOC_NDS32_TLS_LE_LS, R_NDS32_TLS_LE_LS}, ++ {BFD_RELOC_NDS32_TLS_IE_HI20, R_NDS32_TLS_IE_HI20}, ++ {BFD_RELOC_NDS32_TLS_IE_LO12S2, R_NDS32_TLS_IE_LO12S2}, ++ {BFD_RELOC_NDS32_TLS_LE_20, R_NDS32_TLS_LE_20}, ++ {BFD_RELOC_NDS32_TLS_LE_15S0, R_NDS32_TLS_LE_15S0}, ++ {BFD_RELOC_NDS32_TLS_LE_15S1, R_NDS32_TLS_LE_15S1}, ++ {BFD_RELOC_NDS32_TLS_LE_15S2, R_NDS32_TLS_LE_15S2}, ++ ++ {BFD_RELOC_NDS32_TLS_DESC, R_NDS32_TLS_DESC}, ++ {BFD_RELOC_NDS32_TLS_DESC_HI20, R_NDS32_TLS_DESC_HI20}, ++ {BFD_RELOC_NDS32_TLS_DESC_LO12, R_NDS32_TLS_DESC_LO12}, ++ {BFD_RELOC_NDS32_TLS_DESC_ADD, R_NDS32_TLS_DESC_ADD}, ++ {BFD_RELOC_NDS32_TLS_DESC_FUNC, R_NDS32_TLS_DESC_FUNC}, ++ {BFD_RELOC_NDS32_TLS_DESC_CALL, R_NDS32_TLS_DESC_CALL}, ++ {BFD_RELOC_NDS32_TLS_DESC_MEM, R_NDS32_TLS_DESC_MEM}, ++ {BFD_RELOC_NDS32_TLS_DESC_20, R_NDS32_TLS_DESC_20}, ++ {BFD_RELOC_NDS32_TLS_DESC_SDA17S2, R_NDS32_TLS_DESC_SDA17S2}, ++ {BFD_RELOC_NDS32_TLS_IE_LO12, R_NDS32_TLS_IE_LO12}, ++ {BFD_RELOC_NDS32_TLS_IEGP_HI20, R_NDS32_TLS_IEGP_HI20}, ++ {BFD_RELOC_NDS32_TLS_IEGP_LO12, R_NDS32_TLS_IEGP_LO12}, ++ {BFD_RELOC_NDS32_TLS_IEGP_LO12S2, R_NDS32_TLS_IEGP_LO12S2}, ++ {BFD_RELOC_NDS32_TLS_IEGP_LW, R_NDS32_TLS_IEGP_LW}, ++ ++ {BFD_RELOC_NDS32_REMOVE, R_NDS32_RELAX_REMOVE}, ++ {BFD_RELOC_NDS32_GROUP, R_NDS32_RELAX_GROUP}, ++ ++ {BFD_RELOC_NDS32_ICT_HI20, R_NDS32_ICT_HI20}, ++ {BFD_RELOC_NDS32_ICT_LO12, R_NDS32_ICT_LO12}, ++ {BFD_RELOC_NDS32_ICT_25PC, R_NDS32_ICT_25PC}, ++}; ++ ++/* Patch tag. */ ++ ++/* Reserve space for COUNT dynamic relocations in relocation selection ++ SRELOC. */ ++ ++static inline void ++elf32_nds32_allocate_dynrelocs (struct bfd_link_info *info, asection *sreloc, ++ bfd_size_type count) ++{ ++ BFD_ASSERT (elf_hash_table (info)->dynamic_sections_created); ++ if (sreloc == NULL) ++ abort (); ++ sreloc->size += sizeof (Elf32_External_Rela) * count; ++} ++ ++static reloc_howto_type * ++bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, ++ const char *r_name) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < ARRAY_SIZE (nds32_elf_howto_table); i++) ++ if (nds32_elf_howto_table[i].name != NULL ++ && strcasecmp (nds32_elf_howto_table[i].name, r_name) == 0) ++ return &nds32_elf_howto_table[i]; ++ ++ for (i = 0; i < ARRAY_SIZE (nds32_elf_relax_howto_table); i++) ++ if (nds32_elf_relax_howto_table[i].name != NULL ++ && strcasecmp (nds32_elf_relax_howto_table[i].name, r_name) == 0) ++ return &nds32_elf_relax_howto_table[i]; ++ ++ return NULL; ++} ++ ++static reloc_howto_type * ++bfd_elf32_bfd_reloc_type_table_lookup (enum elf_nds32_reloc_type code) ++{ ++ if (code < R_NDS32_RELAX_ENTRY) ++ { ++ BFD_ASSERT (code < ARRAY_SIZE (nds32_elf_howto_table)); ++ return &nds32_elf_howto_table[code]; ++ } ++ else ++ { ++ if ((size_t) (code - R_NDS32_RELAX_ENTRY) >= ++ ARRAY_SIZE (nds32_elf_relax_howto_table)) ++ { ++ int i = code; ++ i += 1; ++ } ++ ++ BFD_ASSERT ((size_t) (code - R_NDS32_RELAX_ENTRY) ++ < ARRAY_SIZE (nds32_elf_relax_howto_table)); ++ return &nds32_elf_relax_howto_table[code - R_NDS32_RELAX_ENTRY]; ++ } ++} ++ ++static reloc_howto_type * ++bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, ++ bfd_reloc_code_real_type code) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < ARRAY_SIZE (nds32_reloc_map); i++) ++ { ++ if (nds32_reloc_map[i].bfd_reloc_val == code) ++ return bfd_elf32_bfd_reloc_type_table_lookup ++ (nds32_reloc_map[i].elf_reloc_val); ++ } ++ ++ return NULL; ++} ++ ++/* Set the howto pointer for an NDS32 ELF reloc. */ ++ ++static void ++nds32_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr, ++ Elf_Internal_Rela *dst) ++{ ++ enum elf_nds32_reloc_type r_type; ++ ++ r_type = ELF32_R_TYPE (dst->r_info); ++ BFD_ASSERT (ELF32_R_TYPE (dst->r_info) <= R_NDS32_GNU_VTENTRY); ++ cache_ptr->howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type); ++} ++ ++static void ++nds32_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr, ++ Elf_Internal_Rela *dst) ++{ ++ BFD_ASSERT ((ELF32_R_TYPE (dst->r_info) == R_NDS32_NONE) ++ || ((ELF32_R_TYPE (dst->r_info) > R_NDS32_GNU_VTENTRY) ++ && (ELF32_R_TYPE (dst->r_info) < R_NDS32_max))); ++ cache_ptr->howto = ++ bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (dst->r_info)); ++} ++ ++/* Support for core dump NOTE sections. ++ Reference to include/linux/elfcore.h in Linux. */ ++ ++static bfd_boolean ++nds32_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) ++{ ++ int offset; ++ size_t size; ++ ++ switch (note->descsz) ++ { ++ case 0x114: ++ /* Linux/NDS32 32-bit, ABI1 */ ++ ++ /* pr_cursig */ ++ elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12); ++ ++ /* pr_pid */ ++ elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24); ++ ++ /* pr_reg */ ++ offset = 72; ++ size = 200; ++ break; ++ ++ case 0xfc: ++ /* Linux/NDS32 32-bit */ ++ ++ /* pr_cursig */ ++ elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12); ++ ++ /* pr_pid */ ++ elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24); ++ ++ /* pr_reg */ ++ offset = 72; ++ size = 176; ++ break; ++ ++ default: ++ return FALSE; ++ } ++ ++ /* Make a ".reg" section. */ ++ return _bfd_elfcore_make_pseudosection (abfd, ".reg", ++ size, note->descpos + offset); ++} ++ ++static bfd_boolean ++nds32_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) ++{ ++ switch (note->descsz) ++ { ++ case 124: ++ /* Linux/NDS32 */ ++ ++ /* __kernel_uid_t, __kernel_gid_t are short on NDS32 platform. */ ++ elf_tdata (abfd)->core->program = ++ _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); ++ elf_tdata (abfd)->core->command = ++ _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); ++ ++ default: ++ return FALSE; ++ } ++ ++ /* 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 *command = elf_tdata (abfd)->core->command; ++ int n = strlen (command); ++ ++ if (0 < n && command[n - 1] == ' ') ++ command[n - 1] = '\0'; ++ } ++ ++ return TRUE; ++} ++ ++/* Hook called by the linker routine which adds symbols from an object ++ file. We must handle the special NDS32 section numbers here. ++ We also keep watching for whether we need to create the sdata special ++ linker sections. */ ++ ++static bfd_boolean ++nds32_elf_add_symbol_hook (bfd *abfd, ++ struct bfd_link_info *info ATTRIBUTE_UNUSED, ++ Elf_Internal_Sym *sym, ++ const char **namep ATTRIBUTE_UNUSED, ++ flagword *flagsp ATTRIBUTE_UNUSED, ++ asection **secp, bfd_vma *valp) ++{ ++ 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) ++ || ELF_ST_TYPE (sym->st_info) == STT_TLS) ++ break; ++ ++ /* st_value is the alignemnt constraint. ++ That might be its actual size if it is an array or structure. */ ++ switch (sym->st_value) ++ { ++ case 1: ++ *secp = bfd_make_section_old_way (abfd, ".scommon_b"); ++ break; ++ case 2: ++ *secp = bfd_make_section_old_way (abfd, ".scommon_h"); ++ break; ++ case 4: ++ *secp = bfd_make_section_old_way (abfd, ".scommon_w"); ++ break; ++ case 8: ++ *secp = bfd_make_section_old_way (abfd, ".scommon_d"); ++ break; ++ default: ++ return TRUE; ++ } ++ ++ (*secp)->flags |= SEC_IS_COMMON; ++ *valp = sym->st_size; ++ break; ++ } ++ ++ return TRUE; ++} ++ ++ ++/* This function can figure out the best location for a base register to access ++ data relative to this base register ++ INPUT: ++ sda_d0: size of first DOUBLE WORD data section ++ sda_w0: size of first WORD data section ++ sda_h0: size of first HALF WORD data section ++ sda_b : size of BYTE data section ++ sda_hi: size of second HALF WORD data section ++ sda_w1: size of second WORD data section ++ sda_d1: size of second DOUBLE WORD data section ++ OUTPUT: ++ offset (always positive) from the beginning of sda_d0 if OK ++ a negative error value if fail ++ NOTE: ++ these 7 sections have to be located back to back if exist ++ a pass in 0 value for non-existing section */ ++ ++/* Due to the interpretation of simm15 field of load/store depending on ++ data accessing size, the organization of base register relative data shall ++ like the following figure ++ ------------------------------------------- ++ | DOUBLE WORD sized data (range +/- 128K) ++ ------------------------------------------- ++ | WORD sized data (range +/- 64K) ++ ------------------------------------------- ++ | HALF WORD sized data (range +/- 32K) ++ ------------------------------------------- ++ | BYTE sized data (range +/- 16K) ++ ------------------------------------------- ++ | HALF WORD sized data (range +/- 32K) ++ ------------------------------------------- ++ | WORD sized data (range +/- 64K) ++ ------------------------------------------- ++ | DOUBLE WORD sized data (range +/- 128K) ++ ------------------------------------------- ++ Its base register shall be set to access these data freely. */ ++ ++/* We have to figure out the SDA_BASE value, so that we can adjust the ++ symbol value correctly. We look up the symbol _SDA_BASE_ 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 relocatable output. */ ++ ++static asection *sda_rela_sec = NULL; ++ ++#define SDA_SECTION_NUM 10 ++ ++static bfd_reloc_status_type ++nds32_elf_final_sda_base (bfd *output_bfd, struct bfd_link_info *info, ++ bfd_vma *psb, bfd_boolean add_symbol) ++{ ++ int relax_fp_as_gp; ++ struct elf_nds32_link_hash_table *table; ++ struct bfd_link_hash_entry *h, *h2; ++ long unsigned int total = 0; ++ asection *first = NULL, *final = NULL, *temp; ++ bfd_vma sda_base = 0; ++ ++ h = bfd_link_hash_lookup (info->hash, "_SDA_BASE_", FALSE, FALSE, TRUE); ++ if (!h || (h->type != bfd_link_hash_defined && h->type != bfd_link_hash_defweak)) ++ { ++ /* The first section must be 4-byte aligned to promise _SDA_BASE_ being ++ 4 byte-aligned. Therefore, it has to set the first section ".data" ++ 4 byte-aligned. */ ++ static const char sec_name[SDA_SECTION_NUM][10] = { ++ ".data", ".got", ".sdata_d", ".sdata_w", ".sdata_h", ".sdata_b", ++ ".sbss_b", ".sbss_h", ".sbss_w", ".sbss_d" ++ }; ++ size_t i = 0; ++ ++ if (output_bfd->sections == NULL) ++ { ++ *psb = elf_gp (output_bfd); ++ return bfd_reloc_ok; ++ } ++ ++ /* Get the first and final section. */ ++ while (i < ARRAY_SIZE (sec_name)) ++ { ++ temp = bfd_get_section_by_name (output_bfd, sec_name[i]); ++ if (temp && !first && (temp->size != 0 || temp->rawsize != 0)) ++ first = temp; ++ if (temp && (temp->size != 0 || temp->rawsize != 0)) ++ final = temp; ++ ++ /* Summarize the sections in order to check if joining .bss. */ ++ if (temp && temp->size != 0) ++ total += temp->size; ++ else if (temp && temp->rawsize != 0) ++ total += temp->rawsize; ++ ++ i++; ++ } ++ ++ /* Check .bss size. */ ++ temp = bfd_get_section_by_name (output_bfd, ".bss"); ++ if (temp) ++ { ++ if (temp->size != 0) ++ total += temp->size; ++ else if (temp->rawsize != 0) ++ total += temp->rawsize; ++ ++ if (total < 0x80000) ++ { ++ if (!first && (temp->size != 0 || temp->rawsize != 0)) ++ first = temp; ++ if ((temp->size != 0 || temp->rawsize != 0)) ++ final = temp; ++ } ++ } ++ ++ if (first && final) ++ { ++ /* The middle of data region. */ ++ sda_base = final->vma / 2 + final->rawsize / 2 + first->vma / 2; ++ ++ /* Find the section sda_base located. */ ++ i = 0; ++ while (i < ARRAY_SIZE (sec_name)) ++ { ++ final = bfd_get_section_by_name (output_bfd, sec_name[i]); ++ if (final && (final->size != 0 || final->rawsize != 0) ++ && sda_base >= final->vma) ++ { ++ first = final; ++ i++; ++ } ++ else ++ break; ++ } ++ } ++ else ++ { ++ /* If there is not any default data section in output bfd, try to find ++ the first data section. If no data section be found, just simplily ++ choose the first output section. */ ++ temp = output_bfd->sections; ++ while (temp) ++ { ++ if (temp->flags & SEC_ALLOC ++ && (((temp->flags & SEC_DATA) ++ && ((temp->flags & SEC_READONLY) == 0)) ++ || (temp->flags & SEC_LOAD) == 0) ++ && (temp->size != 0 || temp->rawsize != 0)) ++ { ++ if (!first) ++ first = temp; ++ final = temp; ++ } ++ temp = temp->next; ++ } ++ ++ /* There is no data or bss section. */ ++ if (!first || (first->size == 0 && first->rawsize == 0)) ++ { ++ first = output_bfd->sections; ++ while (first && first->size == 0 && first->rawsize == 0) ++ first = first->next; ++ } ++ ++ /* There is no concrete section. */ ++ if (!first) ++ { ++ *psb = elf_gp (output_bfd); ++ return bfd_reloc_ok; ++ } ++ ++ if (final && (final->vma + final->rawsize - first->vma) <= 0x4000) ++ sda_base = final->vma / 2 + final->rawsize / 2 + first->vma / 2; ++ else ++ sda_base = first->vma + 0x2000; ++ } ++ ++ sda_base -= first->vma; ++ sda_base = sda_base & (~7); ++ ++ if (!_bfd_generic_link_add_one_symbol ++ (info, output_bfd, "_SDA_BASE_", BSF_GLOBAL | BSF_WEAK, first, ++ (bfd_vma) sda_base, (const char *) NULL, FALSE, ++ get_elf_backend_data (output_bfd)->collect, &h)) ++ return FALSE; ++ ++ sda_rela_sec = first; ++ ++ } ++ ++ /* Set _FP_BASE_ to _SDA_BASE_. */ ++ table = nds32_elf_hash_table (info); ++ relax_fp_as_gp = table->relax_fp_as_gp; ++ h2 = bfd_link_hash_lookup (info->hash, FP_BASE_NAME, FALSE, FALSE, FALSE); ++ /* _SDA_BASE_ is difined in linker script. */ ++ if (!first) ++ { ++ first = h->u.def.section; ++ sda_base = h->u.def.value; ++ } ++ ++ if (relax_fp_as_gp && h2 ++ && (h2->type == bfd_link_hash_undefweak ++ || h2->type == bfd_link_hash_undefined)) ++ { ++ /* Define a weak FP_BASE_NAME here to prevent the undefined symbol. ++ And set FP equal to SDA_BASE to do relaxation for ++ la $fp, _FP_BASE_. */ ++ if (!_bfd_generic_link_add_one_symbol ++ (info, output_bfd, FP_BASE_NAME, BSF_GLOBAL | BSF_WEAK, ++ first, sda_base, (const char *) NULL, ++ FALSE, get_elf_backend_data (output_bfd)->collect, &h2)) ++ return FALSE; ++ } ++ ++ if (add_symbol == TRUE) ++ { ++ if (h) ++ { ++ /* Now set gp. */ ++ elf_gp (output_bfd) = (h->u.def.value ++ + h->u.def.section->output_section->vma ++ + h->u.def.section->output_offset); ++ } ++ else ++ { ++ (*_bfd_error_handler) (_("error: Can't find symbol: _SDA_BASE_.")); ++ return bfd_reloc_dangerous; ++ } ++ } ++ ++ *psb = h->u.def.value + h->u.def.section->output_section->vma ++ + h->u.def.section->output_offset; ++ return bfd_reloc_ok; ++} ++ ++ ++/* Return size of a PLT entry. */ ++#define elf_nds32_sizeof_plt(info) PLT_ENTRY_SIZE ++ ++ ++/* Create an entry in an nds32 ELF linker hash table. */ ++ ++static struct bfd_hash_entry * ++nds32_elf_link_hash_newfunc (struct bfd_hash_entry *entry, ++ struct bfd_hash_table *table, ++ const char *string) ++{ ++ struct elf_nds32_link_hash_entry *ret; ++ ++ ret = (struct elf_nds32_link_hash_entry *) entry; ++ ++ /* Allocate the structure if it has not already been allocated by a ++ subclass. */ ++ if (ret == NULL) ++ ret = (struct elf_nds32_link_hash_entry *) ++ bfd_hash_allocate (table, sizeof (struct elf_nds32_link_hash_entry)); ++ ++ if (ret == NULL) ++ return (struct bfd_hash_entry *) ret; ++ ++ /* Call the allocation method of the superclass. */ ++ ret = (struct elf_nds32_link_hash_entry *) ++ _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, table, string); ++ ++ if (ret != NULL) ++ { ++ struct elf_nds32_link_hash_entry *eh; ++ ++ eh = (struct elf_nds32_link_hash_entry *) ret; ++ eh->dyn_relocs = NULL; ++ eh->tls_type = GOT_UNKNOWN; ++ eh->offset_to_gp = 0; ++ eh->indirect_call = FALSE; ++ } ++ ++ return (struct bfd_hash_entry *) ret; ++} ++ ++/* Create an nds32 ELF linker hash table. */ ++ ++static struct bfd_link_hash_table * ++nds32_elf_link_hash_table_create (bfd *abfd) ++{ ++ struct elf_nds32_link_hash_table *ret; ++ ++ bfd_size_type amt = sizeof (struct elf_nds32_link_hash_table); ++ ++ ret = (struct elf_nds32_link_hash_table *) bfd_zmalloc (amt); ++ if (ret == NULL) ++ return NULL; ++ ++ /* patch tag. */ ++ if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, ++ nds32_elf_link_hash_newfunc, ++ sizeof (struct elf_nds32_link_hash_entry), ++ NDS32_ELF_DATA)) ++ { ++ free (ret); ++ return NULL; ++ } ++ ++ ret->sdynbss = NULL; ++ ret->srelbss = NULL; ++ ret->sym_ld_script = NULL; ++ ret->ex9_export_file = NULL; ++ ret->ex9_import_file = NULL; ++ ++ return &ret->root.root; ++} ++ ++/* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up ++ shortcuts to them in our hash table. */ ++ ++static bfd_boolean ++create_got_section (bfd *dynobj, struct bfd_link_info *info) ++{ ++ struct elf_link_hash_table *ehtab; ++ ++ if (!_bfd_elf_create_got_section (dynobj, info)) ++ return FALSE; ++ ++ ehtab = elf_hash_table (info); ++ ehtab->sgot = bfd_get_section_by_name (dynobj, ".got"); ++ ehtab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt"); ++ if (!ehtab->sgot || !ehtab->sgotplt) ++ abort (); ++ ++ /* _bfd_elf_create_got_section will create it for us. */ ++ ehtab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); ++ if (ehtab->srelgot == NULL ++ || !bfd_set_section_flags (dynobj, ehtab->srelgot, ++ (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS ++ | SEC_IN_MEMORY | SEC_LINKER_CREATED ++ | SEC_READONLY)) ++ || !bfd_set_section_alignment (dynobj, ehtab->srelgot, 2)) ++ return FALSE; ++ ++ return TRUE; ++} ++ ++/* Create dynamic sections when linking against a dynamic object. */ ++ ++static bfd_boolean ++nds32_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) ++{ ++ struct elf_link_hash_table *ehtab; ++ struct elf_nds32_link_hash_table *htab; ++ flagword flags, pltflags; ++ register asection *s; ++ const struct elf_backend_data *bed; ++ int ptralign = 2; /* 32-bit */ ++ const char *secname; ++ char *relname; ++ flagword secflags; ++ asection *sec; ++ ++ bed = get_elf_backend_data (abfd); ++ ehtab = elf_hash_table (info); ++ htab = nds32_elf_hash_table (info); ++ ++ /* 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 ++ | SEC_LINKER_CREATED); ++ ++ pltflags = flags; ++ pltflags |= SEC_CODE; ++ if (bed->plt_not_loaded) ++ pltflags &= ~(SEC_LOAD | SEC_HAS_CONTENTS); ++ if (bed->plt_readonly) ++ pltflags |= SEC_READONLY; ++ ++ s = bfd_make_section (abfd, ".plt"); ++ ehtab->splt = s; ++ if (s == NULL ++ || !bfd_set_section_flags (abfd, s, pltflags) ++ || !bfd_set_section_alignment (abfd, s, bed->plt_alignment)) ++ return FALSE; ++ ++ if (bed->want_plt_sym) ++ { ++ /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the ++ .plt section. */ ++ struct bfd_link_hash_entry *bh = NULL; ++ struct elf_link_hash_entry *h; ++ ++ 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, &bh))) ++ return FALSE; ++ ++ h = (struct elf_link_hash_entry *) bh; ++ h->def_regular = 1; ++ h->type = STT_OBJECT; ++ ++ if (info->shared && !bfd_elf_link_record_dynamic_symbol (info, h)) ++ return FALSE; ++ } ++ ++ s = bfd_make_section (abfd, ++ bed->default_use_rela_p ? ".rela.plt" : ".rel.plt"); ++ ehtab->srelplt = s; ++ if (s == NULL ++ || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY) ++ || !bfd_set_section_alignment (abfd, s, ptralign)) ++ return FALSE; ++ ++ if (ehtab->sgot == NULL && !create_got_section (abfd, info)) ++ return FALSE; ++ ++ for (sec = abfd->sections; sec; sec = sec->next) ++ { ++ secflags = bfd_get_section_flags (abfd, sec); ++ if ((secflags & (SEC_DATA | SEC_LINKER_CREATED)) ++ || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS)) ++ continue; ++ secname = bfd_get_section_name (abfd, sec); ++ relname = (char *) bfd_malloc ((bfd_size_type) strlen (secname) + 6); ++ strcpy (relname, ".rela"); ++ strcat (relname, secname); ++ if (bfd_get_section_by_name (abfd, secname)) ++ continue; ++ s = bfd_make_section (abfd, relname); ++ if (s == NULL ++ || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY) ++ || !bfd_set_section_alignment (abfd, s, ptralign)) ++ return FALSE; ++ } ++ ++ if (bed->want_dynbss) ++ { ++ /* 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"); ++ htab->sdynbss = s; ++ if (s == NULL ++ || !bfd_set_section_flags (abfd, s, SEC_ALLOC | SEC_LINKER_CREATED)) ++ 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->default_use_rela_p ++ ? ".rela.bss" : ".rel.bss")); ++ htab->srelbss = s; ++ if (s == NULL ++ || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY) ++ || !bfd_set_section_alignment (abfd, s, ptralign)) ++ return FALSE; ++ } ++ } ++ ++ return TRUE; ++} ++ ++/* Copy the extra info we tack onto an elf_link_hash_entry. */ ++static void ++nds32_elf_copy_indirect_symbol (struct bfd_link_info *info, ++ struct elf_link_hash_entry *dir, ++ struct elf_link_hash_entry *ind) ++{ ++ struct elf_nds32_link_hash_entry *edir, *eind; ++ ++ edir = (struct elf_nds32_link_hash_entry *) dir; ++ eind = (struct elf_nds32_link_hash_entry *) ind; ++ ++ if (eind->dyn_relocs != NULL) ++ { ++ if (edir->dyn_relocs != NULL) ++ { ++ struct elf_nds32_dyn_relocs **pp; ++ struct elf_nds32_dyn_relocs *p; ++ ++ if (ind->root.type == bfd_link_hash_indirect) ++ abort (); ++ ++ /* Add reloc counts against the weak sym to the strong sym ++ list. Merge any entries against the same section. */ ++ for (pp = &eind->dyn_relocs; (p = *pp) != NULL;) ++ { ++ struct elf_nds32_dyn_relocs *q; ++ ++ for (q = edir->dyn_relocs; q != NULL; q = q->next) ++ if (q->sec == p->sec) ++ { ++ q->pc_count += p->pc_count; ++ q->count += p->count; ++ *pp = p->next; ++ break; ++ } ++ if (q == NULL) ++ pp = &p->next; ++ } ++ *pp = edir->dyn_relocs; ++ } ++ ++ edir->dyn_relocs = eind->dyn_relocs; ++ eind->dyn_relocs = NULL; ++ } ++ ++ if (ind->root.type == bfd_link_hash_indirect) ++ { ++ if (dir->got.refcount <= 0) ++ { ++ edir->tls_type = eind->tls_type; ++ eind->tls_type = GOT_UNKNOWN; ++ } ++ } ++ ++ _bfd_elf_link_hash_copy_indirect (info, dir, ind); ++} ++ ++ ++/* 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 bfd_boolean ++nds32_elf_adjust_dynamic_symbol (struct bfd_link_info *info, ++ struct elf_link_hash_entry *h) ++{ ++ struct elf_nds32_link_hash_table *htab; ++ struct elf_nds32_link_hash_entry *eh; ++ struct elf_nds32_dyn_relocs *p; ++ 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->needs_plt ++ || h->u.weakdef != NULL ++ || (h->def_dynamic && h->ref_regular && !h->def_regular))); ++ ++ ++ /* 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->needs_plt) ++ { ++ if (!info->shared ++ && !h->def_dynamic ++ && !h->ref_dynamic ++ && h->root.type != bfd_link_hash_undefweak ++ && h->root.type != bfd_link_hash_undefined) ++ { ++ /* This case can occur if we saw a PLT 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 PCREL ++ reloc instead. */ ++ h->plt.offset = (bfd_vma) - 1; ++ h->needs_plt = 0; ++ } ++ ++ return TRUE; ++ } ++ else ++ h->plt.offset = (bfd_vma) - 1; ++ ++ /* 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->u.weakdef != NULL) ++ { ++ BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined ++ || h->u.weakdef->root.type == bfd_link_hash_defweak); ++ h->root.u.def.section = h->u.weakdef->root.u.def.section; ++ h->root.u.def.value = h->u.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; ++ ++ /* If there are no references to this symbol that do not use the ++ GOT, we don't need to generate a copy reloc. */ ++ if (!h->non_got_ref) ++ return TRUE; ++ ++ /* If -z nocopyreloc was given, we won't generate them either. */ ++ if (info->nocopyreloc) ++ { ++ h->non_got_ref = 0; ++ return TRUE; ++ } ++ ++ eh = (struct elf_nds32_link_hash_entry *) h; ++ for (p = eh->dyn_relocs; p != NULL; p = p->next) ++ { ++ s = p->sec->output_section; ++ if (s != NULL && (s->flags & (SEC_READONLY | SEC_HAS_CONTENTS)) != 0) ++ break; ++ } ++ ++ /* If we didn't find any dynamic relocs in sections which needs the ++ copy reloc, then we'll be keeping the dynamic relocs and avoiding ++ the copy reloc. */ ++ if (p == NULL) ++ { ++ h->non_got_ref = 0; ++ 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. */ ++ ++ htab = nds32_elf_hash_table (info); ++ s = htab->sdynbss; ++ BFD_ASSERT (s != NULL); ++ ++ /* We must generate a R_NDS32_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_ALLOC) != 0) ++ { ++ asection *srel; ++ ++ srel = htab->srelbss; ++ BFD_ASSERT (srel != NULL); ++ srel->size += sizeof (Elf32_External_Rela); ++ h->needs_copy = 1; ++ } ++ ++ /* 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->size = BFD_ALIGN (s->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->size; ++ ++ /* Increment the section size to make room for the symbol. */ ++ s->size += h->size; ++ ++ return TRUE; ++} ++ ++/* Allocate space in .plt, .got and associated reloc sections for ++ dynamic relocs. */ ++ ++static bfd_boolean ++allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) ++{ ++ struct bfd_link_info *info; ++ struct elf_link_hash_table *ehtab; ++ struct elf_nds32_link_hash_table *htab; ++ struct elf_nds32_link_hash_entry *eh; ++ struct elf_nds32_dyn_relocs *p; ++ ++ if (h->root.type == bfd_link_hash_indirect) ++ return TRUE; ++ ++ /* When warning symbols are created, they **replace** the "real" ++ entry in the hash table, thus we never get to see the real ++ symbol in a hash traversal. So look at it now. */ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf_nds32_link_hash_entry *) h; ++ ++ info = (struct bfd_link_info *) inf; ++ ehtab = elf_hash_table (info); ++ htab = nds32_elf_hash_table (info); ++ if (htab == NULL) ++ return FALSE; ++ ++ if ((htab->root.dynamic_sections_created || h->type == STT_GNU_IFUNC) ++ && h->plt.refcount > 0 ++ && !(info->pie && h->def_regular)) ++ { ++ /* Make sure this symbol is output as a dynamic symbol. ++ Undefined weak syms won't yet be marked as dynamic. */ ++ if (h->dynindx == -1 && !h->forced_local) ++ { ++ if (!bfd_elf_link_record_dynamic_symbol (info, h)) ++ return FALSE; ++ } ++ ++ if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h)) ++ { ++ asection *s = ehtab->splt; ++ ++ /* If this is the first .plt entry, make room for the special ++ first entry. */ ++ if (s->size == 0) ++ s->size += PLT_ENTRY_SIZE; ++ ++ h->plt.offset = s->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->def_regular) ++ { ++ h->root.u.def.section = s; ++ h->root.u.def.value = h->plt.offset; ++ } ++ ++ /* Make room for this entry. */ ++ s->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. */ ++ ehtab->sgotplt->size += 4; ++ ++ /* We also need to make an entry in the .rel.plt section. */ ++ ehtab->srelplt->size += sizeof (Elf32_External_Rela); ++ htab->next_tls_desc_index++; ++ } ++ else ++ { ++ h->plt.offset = (bfd_vma) - 1; ++ h->needs_plt = 0; ++ } ++ } ++ else ++ { ++ h->plt.offset = (bfd_vma) - 1; ++ h->needs_plt = 0; ++ } ++ ++ if (h->got.refcount > 0) ++ { ++ asection *sgot; ++ bfd_boolean dyn; ++ int tls_type = elf32_nds32_hash_entry (h)->tls_type; ++ ++ /* Make sure this symbol is output as a dynamic symbol. ++ Undefined weak syms won't yet be marked as dynamic. */ ++ if (h->dynindx == -1 && !h->forced_local) ++ { ++ if (!bfd_elf_link_record_dynamic_symbol (info, h)) ++ return FALSE; ++ } ++ ++ sgot = elf_hash_table (info)->sgot; ++ h->got.offset = sgot->size; ++ ++ if (tls_type == GOT_UNKNOWN) ++ abort (); ++ ++ /* Non-TLS symbols, and TLS_IE need one GOT slot. */ ++ if (tls_type & (GOT_NORMAL | GOT_TLS_IE | GOT_TLS_IEGP)) ++ sgot->size += 4; ++ else ++ { ++ /* TLS_DESC, TLS_GD, and TLS_LD need 2 consecutive GOT slots. */ ++ if (tls_type & GOT_TLS_DESC) ++ sgot->size += 8; ++ } ++ ++ dyn = htab->root.dynamic_sections_created; ++ ++ if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)) ++ { ++ if (tls_type == GOT_TLS_DESC) ++ { ++ /* TLS_DESC needs a relocation slot within .rela.plt. */ ++ htab->num_tls_desc++; ++ ehtab->srelplt->size += sizeof (Elf32_External_Rela); ++ htab->tls_trampoline = -1; ++ } ++ else ++ { ++ /* other relocations need a relocation slot within .rela.got. */ ++ ehtab->srelgot->size += sizeof (Elf32_External_Rela); ++ } ++ } ++ } ++ else ++ h->got.offset = (bfd_vma) -1; ++ ++ if (eh->dyn_relocs == NULL) ++ return TRUE; ++ ++ /* In the shared -Bsymbolic case, discard space allocated for ++ dynamic pc-relative relocs against symbols which turn out to be ++ defined in regular objects. For the normal shared case, discard ++ space for pc-relative relocs that have become local due to symbol ++ visibility changes. */ ++ ++ if (info->shared) ++ { ++ if (h->def_regular && (h->forced_local || info->symbolic)) ++ { ++ struct elf_nds32_dyn_relocs **pp; ++ ++ for (pp = &eh->dyn_relocs; (p = *pp) != NULL;) ++ { ++ p->count -= p->pc_count; ++ p->pc_count = 0; ++ if (p->count == 0) ++ *pp = p->next; ++ else ++ pp = &p->next; ++ } ++ } ++ } ++ else ++ { ++ /* For the non-shared case, discard space for relocs against ++ symbols which turn out to need copy relocs or are not dynamic. */ ++ ++ if (!h->non_got_ref ++ && ((h->def_dynamic ++ && !h->def_regular) ++ || (htab->root.dynamic_sections_created ++ && (h->root.type == bfd_link_hash_undefweak ++ || h->root.type == bfd_link_hash_undefined)))) ++ { ++ /* Make sure this symbol is output as a dynamic symbol. ++ Undefined weak syms won't yet be marked as dynamic. */ ++ if (h->dynindx == -1 && !h->forced_local) ++ { ++ if (!bfd_elf_link_record_dynamic_symbol (info, h)) ++ return FALSE; ++ } ++ ++ /* If that succeeded, we know we'll be keeping all the ++ relocs. */ ++ if (h->dynindx != -1) ++ goto keep; ++ } ++ ++ eh->dyn_relocs = NULL; ++ ++keep:; ++ } ++ ++ /* Finally, allocate space. */ ++ for (p = eh->dyn_relocs; p != NULL; p = p->next) ++ { ++ asection *sreloc = elf_section_data (p->sec)->sreloc; ++ sreloc->size += p->count * sizeof (Elf32_External_Rela); ++ } ++ ++ return TRUE; ++} ++ ++/* Add relocation REL to the end of relocation section SRELOC. */ ++ ++static void ++elf32_nds32_add_dynreloc (bfd *output_bfd, ++ struct bfd_link_info *info ATTRIBUTE_UNUSED, ++ asection *sreloc, Elf_Internal_Rela *rel) ++{ ++ bfd_byte *loc; ++ if (sreloc == NULL) ++ abort (); ++ ++ loc = sreloc->contents; ++ loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela); ++ if (sreloc->reloc_count * sizeof (Elf32_External_Rela) > sreloc->size) ++ abort (); ++ ++ bfd_elf32_swap_reloca_out (output_bfd, rel, loc); ++} ++ ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf) ++{ ++ struct elf_nds32_link_hash_entry *eh; ++ struct elf_nds32_dyn_relocs *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf_nds32_link_hash_entry *) h; ++ for (p = eh->dyn_relocs; p != NULL; p = p->next) ++ { ++ asection *s = p->sec->output_section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ ++/* Set the sizes of the dynamic sections. */ ++ ++static bfd_boolean ++nds32_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, ++ struct bfd_link_info *info) ++{ ++ bfd *dynobj; ++ asection *s; ++ bfd_boolean plt; ++ bfd_boolean relocs; ++ bfd *ibfd; ++ struct elf_nds32_link_hash_table *htab; ++ ++ htab = nds32_elf_hash_table (info); ++ if (htab == NULL) ++ return FALSE; ++ ++ 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->executable) ++ { ++ s = bfd_get_section_by_name (dynobj, ".interp"); ++ BFD_ASSERT (s != NULL); ++ s->size = sizeof ELF_DYNAMIC_INTERPRETER; ++ s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; ++ } ++ } ++ ++ /* Set up .got offsets for local syms, and space for local dynamic ++ relocs. */ ++ for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) ++ { ++ bfd_signed_vma *local_got; ++ bfd_signed_vma *end_local_got; ++ bfd_size_type locsymcount; ++ Elf_Internal_Shdr *symtab_hdr; ++ asection *sgot; ++ char *local_tls_type; ++ unsigned long symndx; ++ bfd_vma *local_tlsdesc_gotent; ++ ++ if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) ++ continue; ++ ++ for (s = ibfd->sections; s != NULL; s = s->next) ++ { ++ struct elf_nds32_dyn_relocs *p; ++ ++ for (p = ((struct elf_nds32_dyn_relocs *) ++ elf_section_data (s)->local_dynrel); ++ p != NULL; p = p->next) ++ { ++ if (!bfd_is_abs_section (p->sec) ++ && bfd_is_abs_section (p->sec->output_section)) ++ { ++ /* Input section has been discarded, either because ++ it is a copy of a linkonce section or due to ++ linker script /DISCARD/, so we'll be discarding ++ the relocs too. */ ++ } ++ else if (p->count != 0) ++ { ++ asection *sreloc = elf_section_data (p->sec)->sreloc; ++ sreloc->size += p->count * sizeof (Elf32_External_Rela); ++ if ((p->sec->output_section->flags & SEC_READONLY) != 0) ++ info->flags |= DF_TEXTREL; ++ } ++ } ++ } ++ ++ local_got = elf_local_got_refcounts (ibfd); ++ if (!local_got) ++ continue; ++ ++ symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; ++ locsymcount = symtab_hdr->sh_info; ++ end_local_got = local_got + locsymcount; ++ sgot = elf_hash_table (info)->sgot; ++ local_tls_type = elf32_nds32_local_got_tls_type (ibfd); ++ local_tlsdesc_gotent = elf32_nds32_local_tlsdesc_gotent (ibfd); ++ for (symndx = 0; local_got < end_local_got; ++ ++local_got, ++local_tls_type, ++local_tlsdesc_gotent, ++symndx) ++ { ++ if (*local_got > 0) ++ { ++ int num_of_got_entry_needed = 0; ++ *local_got = sgot->size; ++ *local_tlsdesc_gotent = sgot->size; ++ ++ /* TLS_NORMAL, and TLS_IE need one slot in .got. */ ++ if (*local_tls_type & (GOT_NORMAL | GOT_TLS_IE | GOT_TLS_IEGP)) ++ num_of_got_entry_needed = 1; ++ /* TLS_GD, TLS_LD, and TLS_DESC need an 8-byte structure in the GOT. */ ++ else if (*local_tls_type & GOT_TLS_DESC) ++ num_of_got_entry_needed = 2; ++ ++ sgot->size += (num_of_got_entry_needed << 2); ++ ++ /* non-relax-able TLS_DESCs need a slot in .rela.plt. ++ others need a slot in .rela.got. */ ++ if (*local_tls_type == GOT_TLS_DESC) ++ { ++ if (info->shared) ++ { ++ htab->num_tls_desc++; ++ htab->root.srelplt->size += sizeof (Elf32_External_Rela); ++ htab->tls_trampoline = -1; ++ } ++ else ++ { ++ /* TLS_DESC -> TLS_LE */ ++ } ++ } ++ else ++ { ++ htab->root.srelgot->size += sizeof (Elf32_External_Rela); ++ } ++ } ++ else ++ { ++ *local_got = (bfd_vma) -1; ++ *local_tlsdesc_gotent = (bfd_vma) -1; ++ } ++ } ++ } ++ ++ /* Allocate global sym .plt and .got entries, and space for global ++ sym dynamic relocs. */ ++ elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (void *) info); ++ ++ /* For every jump slot reserved in the sgotplt, reloc_count is ++ incremented. However, when we reserve space for TLS descriptors, ++ it's not incremented, so in order to compute the space reserved ++ for them, it suffices to multiply the reloc count by the jump ++ slot size. */ ++ if (htab->root.srelplt) ++ htab->sgotplt_jump_table_size = elf32_nds32_compute_jump_table_size (htab); ++ ++ if (htab->tls_trampoline) ++ { ++ htab->tls_trampoline = htab->root.splt->size; ++ ++ /* If we're not using lazy TLS relocations, don't generate the ++ PLT and GOT entries they require. */ ++ if (!(info->flags & DF_BIND_NOW)) ++ { ++ htab->dt_tlsdesc_got = htab->root.sgot->size; ++ htab->root.sgot->size += 4; ++ ++ htab->dt_tlsdesc_plt = htab->root.splt->size; ++ htab->root.splt->size += 4 * ARRAY_SIZE (dl_tlsdesc_lazy_trampoline); ++ } ++ } ++ ++ /* We now have determined the sizes of the various dynamic sections. ++ Allocate memory for them. */ ++ /* 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; ++ for (s = dynobj->sections; s != NULL; s = s->next) ++ { ++ if ((s->flags & SEC_LINKER_CREATED) == 0) ++ continue; ++ ++ if (s == htab->root.splt) ++ { ++ /* Strip this section if we don't need it; see the ++ comment below. */ ++ plt = s->size != 0; ++ } ++ else if (s == elf_hash_table (info)->sgot) ++ { ++ got_size += s->size; ++ } ++ else if (s == elf_hash_table (info)->sgotplt) ++ { ++ got_size += s->size; ++ } ++ else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0) ++ { ++ if (s->size != 0 && s != elf_hash_table (info)->srelplt) ++ relocs = 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 ++ { ++ /* It's not one of our sections, so don't allocate space. */ ++ continue; ++ } ++ ++ if (s->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. */ ++ s->flags |= SEC_EXCLUDE; ++ continue; ++ } ++ ++ /* Allocate memory for the section contents. We use bfd_zalloc ++ here in case unused entries are not reclaimed before the ++ section's contents are written out. This should not happen, ++ but this way if it does, we get a R_NDS32_NONE reloc instead ++ of garbage. */ ++ s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); ++ if (s->contents == NULL) ++ return FALSE; ++ } ++ ++ ++ if (htab->root.dynamic_sections_created) ++ { ++ /* Add some entries to the .dynamic section. We fill in the ++ values later, in nds32_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. */ ++#define add_dynamic_entry(TAG, VAL) _bfd_elf_add_dynamic_entry (info, TAG, VAL) ++ ++ if (info->executable) ++ { ++ if (!add_dynamic_entry (DT_DEBUG, 0)) ++ return FALSE; ++ } ++ ++ if (elf_hash_table (info)->splt->size != 0) ++ { ++ if (!add_dynamic_entry (DT_PLTGOT, 0) ++ || !add_dynamic_entry (DT_PLTRELSZ, 0) ++ || !add_dynamic_entry (DT_PLTREL, DT_RELA) ++ || !add_dynamic_entry (DT_JMPREL, 0)) ++ return FALSE; ++ } ++ ++ if (plt) ++ { ++ if (htab->dt_tlsdesc_plt ++ && (!add_dynamic_entry (DT_TLSDESC_PLT, 0) ++ || !add_dynamic_entry (DT_TLSDESC_GOT, 0))) ++ return FALSE; ++ } ++ ++ if (relocs) ++ { ++ if (!add_dynamic_entry (DT_RELA, 0) ++ || !add_dynamic_entry (DT_RELASZ, 0) ++ || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela))) ++ return FALSE; ++ ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, readonly_dynrelocs, ++ (void *) info); ++ ++ if ((info->flags & DF_TEXTREL) != 0) ++ { ++ if (!add_dynamic_entry (DT_TEXTREL, 0)) ++ return FALSE; ++ } ++ } ++ } ++#undef add_dynamic_entry ++ ++ return TRUE; ++} ++ ++static bfd_reloc_status_type ++nds32_relocate_contents (reloc_howto_type *howto, bfd *input_bfd, ++ bfd_vma relocation, bfd_byte *location) ++{ ++ int size; ++ bfd_vma x = 0; ++ bfd_reloc_status_type flag; ++ unsigned int rightshift = howto->rightshift; ++ unsigned int bitpos = howto->bitpos; ++ ++ /* 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: ++ case 1: ++ case 8: ++ abort (); ++ break; ++ case 2: ++ x = bfd_getb16 (location); ++ break; ++ case 4: ++ x = bfd_getb32 (location); ++ 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. */ ++ flag = bfd_reloc_ok; ++ if (howto->complain_on_overflow != complain_overflow_dont) ++ { ++ bfd_vma addrmask, fieldmask, signmask, ss; ++ bfd_vma a, b, sum; ++ ++ /* Get the values to be added together. For signed and unsigned ++ relocations, we assume that all values should be truncated to ++ the size of an address. For bitfields, all the bits matter. ++ See also bfd_check_overflow. */ ++ fieldmask = N_ONES (howto->bitsize); ++ signmask = ~fieldmask; ++ addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask; ++ a = (relocation & addrmask) >> rightshift; ++ b = (x & howto->src_mask & addrmask) >> bitpos; ++ ++ switch (howto->complain_on_overflow) ++ { ++ case complain_overflow_signed: ++ /* If any sign bits are set, all sign bits must be set. ++ That is, A must be a valid negative address after ++ shifting. */ ++ signmask = ~(fieldmask >> 1); ++ /* Fall through. */ ++ ++ case complain_overflow_bitfield: ++ /* Much like the signed check, but for a field one bit ++ wider. We allow a bitfield to represent numbers in the ++ range -2**n to 2**n-1, where n is the number of bits in the ++ field. Note that when bfd_vma is 32 bits, a 32-bit reloc ++ can't overflow, which is exactly what we want. */ ++ ss = a & signmask; ++ if (ss != 0 && ss != ((addrmask >> rightshift) & signmask)) ++ flag = bfd_reloc_overflow; ++ ++ /* We only need this next bit of code if the sign bit of B ++ is below the sign bit of A. This would only happen if ++ SRC_MASK had fewer bits than BITSIZE. Note that if ++ SRC_MASK has more bits than BITSIZE, we can get into ++ trouble; we would need to verify that B is in range, as ++ we do for A above. */ ++ ss = ((~howto->src_mask) >> 1) & howto->src_mask; ++ ss >>= bitpos; ++ ++ /* Set all the bits above the sign bit. */ ++ b = (b ^ ss) - ss; ++ ++ /* Now we can do the addition. */ ++ sum = a + b; ++ ++ /* See if the result has the correct sign. Bits above the ++ sign bit are junk now; ignore them. If the sum is ++ positive, make sure we did not have all negative inputs; ++ if the sum is negative, make sure we did not have all ++ positive inputs. The test below looks only at the sign ++ bits, and it really just ++ SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM) ++ ++ We mask with addrmask here to explicitly allow an address ++ wrap-around. The Linux kernel relies on it, and it is ++ the only way to write assembler code which can run when ++ loaded at a location 0x80000000 away from the location at ++ which it is linked. */ ++ if (((~(a ^ b)) & (a ^ sum)) & signmask & addrmask) ++ flag = bfd_reloc_overflow; ++ ++ break; ++ ++ case complain_overflow_unsigned: ++ /* Checking for an unsigned overflow is relatively easy: ++ trim the addresses and add, and trim the result as well. ++ Overflow is normally indicated when the result does not ++ fit in the field. However, we also need to consider the ++ case when, e.g., fieldmask is 0x7fffffff or smaller, an ++ input is 0x80000000, and bfd_vma is only 32 bits; then we ++ will get sum == 0, but there is an overflow, since the ++ inputs did not fit in the field. Instead of doing a ++ separate test, we can check for this by or-ing in the ++ operands when testing for the sum overflowing its final ++ field. */ ++ sum = (a + b) & addrmask; ++ if ((a | b | sum) & signmask) ++ flag = bfd_reloc_overflow; ++ break; ++ ++ default: ++ abort (); ++ } ++ } ++ ++ /* Put RELOCATION in the right bits. */ ++ relocation >>= (bfd_vma) rightshift; ++ relocation <<= (bfd_vma) bitpos; ++ ++ /* Add RELOCATION to the right bits of X. */ ++ /* FIXME : 090616 ++ Because the relaxation may generate duplicate relocation at one address, ++ an addition to immediate in the instruction may cause the relocation added ++ several times. ++ This bug should be fixed in assembler, but a check is also needed here. */ ++ if (howto->partial_inplace) ++ x = ((x & ~howto->dst_mask) ++ | (((x & howto->src_mask) + relocation) & howto->dst_mask)); ++ else ++ x = ((x & ~howto->dst_mask) | ((relocation) & howto->dst_mask)); ++ ++ ++ /* Put the relocated value back in the object file. */ ++ switch (size) ++ { ++ default: ++ case 0: ++ case 1: ++ case 8: ++ abort (); ++ break; ++ case 2: ++ bfd_putb16 (x, location); ++ break; ++ case 4: ++ bfd_putb32 (x, location); ++ break; ++ } ++ ++ return flag; ++} ++ ++static bfd_reloc_status_type ++nds32_elf_final_link_relocate (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 > bfd_get_section_limit (input_bfd, input_section)) ++ 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 nds32_relocate_contents (howto, input_bfd, relocation, ++ contents + address); ++} ++ ++static bfd_boolean ++nds32_elf_output_symbol_hook (struct bfd_link_info *info, ++ const char *name, ++ Elf_Internal_Sym *elfsym ATTRIBUTE_UNUSED, ++ asection *input_sec, ++ struct elf_link_hash_entry *h ATTRIBUTE_UNUSED) ++{ ++ const char *source; ++ FILE *sym_ld_script = NULL; ++ struct elf_nds32_link_hash_table *table; ++ ++ table = nds32_elf_hash_table (info); ++ sym_ld_script = table->sym_ld_script; ++ if (!sym_ld_script) ++ return TRUE; ++ ++ if (!h || !name || *name == '\0') ++ return TRUE; ++ ++ if (input_sec->flags & SEC_EXCLUDE) ++ return TRUE; ++ ++ if (!check_start_export_sym) ++ { ++ fprintf (sym_ld_script, "SECTIONS\n{\n"); ++ check_start_export_sym = 1; ++ } ++ ++ if (h->root.type == bfd_link_hash_defined ++ || h->root.type == bfd_link_hash_defweak) ++ { ++ if (!h->root.u.def.section->output_section) ++ return TRUE; ++ ++ if (bfd_is_const_section (input_sec)) ++ source = input_sec->name; ++ else ++ source = input_sec->owner->filename; ++ ++ fprintf (sym_ld_script, "\t%s = 0x%08lx;\t /* %s */\n", ++ h->root.root.string, ++ (h->root.u.def.value ++ + h->root.u.def.section->output_section->vma ++ + h->root.u.def.section->output_offset), source); ++ } ++ ++ return TRUE; ++} ++ ++/* Relocate an NDS32/D ELF section. ++ There is some attempt to make this function usable for many architectures, ++ both for RELA and REL type relocs, if only to serve as a learning tool. ++ ++ The RELOCATE_SECTION function is called by the new 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 ++ relocatable 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 relocatable 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. */ ++ ++/* Return the base VMA address which should be subtracted from real addresses ++ when resolving @dtpoff relocation. ++ This is PT_TLS segment p_vaddr. */ ++ ++/* Return the relocation value for @tpoff relocation ++ if STT_TLS virtual address is ADDRESS. */ ++ ++/* Return the relocation value for @gottpoff relocation ++ if STT_TLS virtual address is ADDRESS. */ ++static bfd_vma ++gottpoff (struct bfd_link_info *info, bfd_vma address) ++{ ++ bfd_vma tp_base; ++ bfd_vma tp_offset; ++ ++ /* If tls_sec is NULL, we should have signalled an error already. */ ++ if (elf_hash_table (info)->tls_sec == NULL) ++ return 0; ++ ++ tp_base = elf_hash_table (info)->tls_sec->vma; ++ tp_offset = address - tp_base; ++ ++ return tp_offset; ++} ++ ++#define POLY 0x755b /* crc = (0x10000 | POLY) >> 1 = 0xbaad. */ ++#define INV_POLY 0xb55d ++ ++/* Initial the crc table value. */ ++ ++static void ++nds32_precompute_byte_crc_table (void) ++{ ++ int i; ++ int j; ++ unsigned short r; ++ r = 0; ++ for (i = 0; i < 0x100; ++i) ++ { ++ r = i << 8; ++ for (j = 7; j >= 0; --j) ++ { ++ unsigned short p = (r & 0x8000) ? POLY : 0; ++ r = (r << 1) ^ p; ++ } ++ byte_crc_table[i] = r; ++ } ++} ++ ++static void ++nds32_precompute_byte_inv_crc_table (void) ++{ ++ int i; ++ int j; ++ unsigned short r; ++ r = 0; ++ for (i = 0; i < 0x100; ++i) ++ { ++ r = i << 8; ++ for (j = 7; j >= 0; --j) ++ { ++ unsigned short p = (r & 0x8000) ? INV_POLY : 0; ++ r = (r << 1) ^ p; ++ } ++ byte_inv_crc_table[i] = r; ++ } ++} ++ ++/* Perform the crc computation. */ ++ ++static void ++nds32_crc_compute (bfd_byte *ptr, unsigned int size, unsigned short *sum) ++{ ++ unsigned char b; ++ ++ if (size == 2) ++ { ++ b = *ptr++ ^ (*sum >> 8); ++ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b]; ++ b = *ptr++ ^ (*sum >> 8); ++ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b]; ++ b = (*sum >> 8); ++ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b]; ++ b = (*sum >> 8); ++ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b]; ++ } ++ else ++ { ++ b = *ptr++ ^ (*sum >> 8); ++ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b]; ++ b = *ptr++ ^ (*sum >> 8); ++ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b]; ++ b = *ptr++ ^ (*sum >> 8); ++ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b]; ++ b = *ptr++ ^ (*sum >> 8); ++ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b]; ++ } ++} ++ ++static void ++nds32_crc_final (int num, unsigned short *sum) ++{ ++ int i, tmp, r = 0; ++ unsigned short crc, inv_crc = 0; ++ ++ crc = *sum; ++ /* Reverse it. */ ++ for (i = 0; i < 16; ++i) ++ { ++ tmp = crc & 0x1; ++ inv_crc = (inv_crc << 1) | tmp; ++ crc = crc >> 1; ++ } ++ ++ for (i = 0; i < num + 2; ++i) ++ { ++ if (i == 0) ++ tmp = (inv_crc >> 8) ^ (r >> 8); ++ else if (i == 1) ++ tmp = (inv_crc & 0xff) ^ (r >> 8); ++ else ++ tmp = (r >> 8); ++ r = (0xffff & (r << 8)) ^ byte_inv_crc_table[tmp]; ++ } ++ crc = r; ++ inv_crc = 0; ++ ++ for (i = 0; i < 16; ++i) ++ { ++ tmp = crc & 0x1; ++ inv_crc = (inv_crc << 1) | tmp; ++ crc = crc >> 1; ++ } ++ ++ *sum = inv_crc; ++} ++ ++/* Traverse the security region and get the crc. */ ++ ++static bfd_vma ++nds32_elf_crc_relocation (Elf_Internal_Rela *start_rel, ++ Elf_Internal_Rela *end_rel, ++ Elf_Internal_Rela *irelend, ++ bfd_byte *contents) ++{ ++ static bfd_boolean init = FALSE; ++ bfd_byte *location; ++ bfd_vma address; ++ bfd_vma x; ++ unsigned short sum = 0; ++ int num = 0; ++ static bfd_byte *ex9_contents = NULL; ++ Elf_Internal_Rela *irel; ++ bfd_boolean ex_final = FALSE; ++ ++ if (init == FALSE) ++ { ++ nds32_precompute_byte_crc_table (); ++ nds32_precompute_byte_inv_crc_table (); ++ init = TRUE; ++ if (ex9_section) ++ nds32_get_section_contents (ex9_section->owner, ex9_section, ++ &ex9_contents, TRUE); ++ } ++ ++ /* Check the final instruction is isps or not. */ ++ irel = end_rel; ++ while (irel < irelend && irel->r_offset == end_rel->r_offset) ++ { ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SECURITY_16 ++ && irel->r_addend == NDS32_SECURITY_RESTART) ++ { ++ ex_final = TRUE; ++ break; ++ } ++ irel++; ++ } ++ ++ ++ /* It doesn't have to add crc itself. */ ++ ++ for (address = start_rel->r_offset + 4; address <= end_rel->r_offset;) ++ { ++ /* Don't check the next crc itself. */ ++ if (address == end_rel->r_offset && ex_final) ++ break; ++ ++ num += 4; ++ location = contents + address; ++ x = bfd_getb32 (location); ++ if (INSN_32BIT (x)) ++ { ++ /* 4byte instruction. */ ++ nds32_crc_compute (location, 4, &sum); ++ address += 4; ++ } ++ else ++ { ++ /* 2byte instruction. */ ++ /* Ex9 has to fetch table instruction. */ ++ if (((x >> 16) & 0xfe00) == INSN_EX9_IT_1 && ((x >> 16) & 0x1e0)) ++ { ++ if (!ex9_contents) ++ (*_bfd_error_handler) (_("SIG error: Can't get ex9 contents.")); ++ nds32_crc_compute (ex9_contents + ((x >> 16) & 0x1ff) * 4, ++ 4, &sum); ++ } ++ else if (((x >> 16) & 0xffe0) == INSN_EX9_IT_2) ++ { ++ if (!ex9_contents) ++ (*_bfd_error_handler) (_("SIG error: Can't get ex9 contents.")); ++ nds32_crc_compute (ex9_contents + ((x >> 16) & 0x1f) * 4, ++ 4, &sum); ++ } ++ else ++ nds32_crc_compute (location, 2, &sum); ++ address += 2; ++ } ++ } ++ ++ nds32_crc_final (num, &sum); ++ ++ return sum; ++} ++ ++/* Move all SECURITY_16 to the final one for each instruction. */ ++ ++static void ++nds32_elf_crc_adjust_reloc (Elf_Internal_Rela *relocs, ++ Elf_Internal_Rela *relend) ++{ ++ Elf_Internal_Rela *rel, *crc_rel = NULL; ++ Elf_Internal_Rela rel_temp; ++ ++ for (rel = relocs; rel < relend; rel++) ++ { ++ if (crc_rel && crc_rel->r_offset == rel->r_offset) ++ { ++ memcpy (&rel_temp, rel, sizeof (Elf_Internal_Rela)); ++ memcpy (rel, crc_rel, sizeof (Elf_Internal_Rela)); ++ memcpy (crc_rel, &rel_temp, sizeof (Elf_Internal_Rela)); ++ crc_rel = rel; ++ } ++ else if (ELF32_R_TYPE (rel->r_info) == R_NDS32_SECURITY_16) ++ { ++ crc_rel = rel; ++ continue; ++ } ++ } ++} ++ ++static bfd_boolean ++patch_tls_desc_to_ie (bfd_byte *contents, Elf_Internal_Rela *rel, bfd *ibfd) ++{ ++ /* TLS_GD/TLS_LD model #1 ++ 46 00 00 00 sethi $r0,#0x0 ++ 58 00 00 00 ori $r0,$r0,#0x0 ++ 40 00 74 00 add $r0,$r0,$gp ++ 04 10 00 00 lwi $r1,[$r0+#0x0] ++ 4b e0 04 01 jral $lp,$r1 */ ++ ++ /* TLS_GD/TLS_LD model #2 ++ 46 00 00 00 sethi $r0,#0x0 ++ 58 00 00 00 ori $r0,$r0,#0x0 ++ 38 10 74 02 lw $r1,[$r0+($gp<<#0x0)] <= TODO: not necessary $r1 register allocation ++ 40 00 74 00 add $r0,$r0,$gp ++ 4b e0 04 01 jral $lp,$r1 */ ++ ++ /* TLS_IE model (non-PIC) ++ 46 00 00 00 sethi $r0,#0x0 ++ 04 00 00 00 lwi $r0,[$r0+#0x0] ++ 38 00 64 02 lw $r0,[$r0+($r25<<#0x0)] */ ++ ++ /* TLS_IE model (PIC) ++ 46 00 00 00 sethi $r0,#0x0 ++ 58 00 00 00 ori $r0,$r0,#0x0 ++ 38 00 74 02 lw $r0,[$r0+($gp<<#0x0)] ++ 38 00 64 02 lw $r0,[$r0+($r25<<#0x0)] */ ++ ++ /* TLS_GD_TO_IE model ++ 46 00 00 00 sethi $r0,#0x0 ++ 58 00 00 00 ori $r0,$r0,#0x0 ++ 40 00 74 00 add $r0,$rM,$gp ++ 04 00 00 01 lwi $r0,[$r0+#0x4] ++ 40 00 64 00 add $r0,$r0,$r25 */ ++ ++ bfd_boolean rz = FALSE; ++ ++ typedef struct ++ { ++ uint32_t opcode; ++ uint32_t mask; ++ } pat_t; ++ ++ uint32_t patch[3] = ++ { ++ 0x40007400, /* add $r0,$rM,$gp */ ++ 0x04000001, /* lwi $r0,[$r0+#0x4] */ ++ 0x40006400, /* add $r0,$r0,$r25 */ ++ }; ++ ++ pat_t mode0[3] = ++ { ++ { 0x40000000, 0xfe0003ff }, ++ { 0x04000000, 0xfe000000 }, ++ { 0x4be00001, 0xffff83ff }, ++ }; ++ ++ pat_t mode1[3] = ++ { ++ { 0x38007402, 0xfe007fff }, ++ { 0x40007400, 0xfe007fff }, ++ { 0x4be00001, 0xffff83ff }, ++ }; ++ ++ unsigned char *p = contents + rel->r_offset; ++ ++ uint32_t insn; ++ uint32_t regidx = 0; ++ insn = bfd_getb32 (p); ++ if (INSN_SETHI == (0xfe0fffffu & insn)) ++ { ++ regidx = 0x1f & (insn >> 20); ++ p += 4; ++ } ++ ++ insn = bfd_getb32 (p); ++ if (INSN_ORI == (0xfe007fffu & insn)) ++ { ++ regidx = 0x1f & (insn >> 20); ++ p += 4; ++ } ++ ++ if (patch[2] == bfd_getb32 (p + 8)) /* character instruction */ ++ { ++ /* already patched? */ ++ if ((patch[0] == (0xfff07fffu & bfd_getb32 (p + 0))) && ++ (patch[1] == bfd_getb32 (p + 4))) ++ rz = TRUE; ++ } ++ else if (mode0[0].opcode == (mode0[0].mask & bfd_getb32 (p + 0))) ++ { ++ if ((mode0[1].opcode == (mode0[1].mask & bfd_getb32 (p + 4))) && ++ (mode0[2].opcode == (mode0[2].mask & bfd_getb32 (p + 8)))) ++ { ++ bfd_putb32 (patch[0] | (regidx << 15), p + 0); ++ bfd_putb32 (patch[1], p + 4); ++ bfd_putb32 (patch[2], p + 8); ++ rz = TRUE; ++ } ++ } ++ else if (mode1[0].opcode == (mode1[0].mask & bfd_getb32 (p + 0))) ++ { ++ if ((mode1[1].opcode == (mode1[1].mask & bfd_getb32 (p + 4))) && ++ (mode1[2].opcode == (mode1[2].mask & bfd_getb32 (p + 8)))) ++ { ++ bfd_putb32 (patch[0] | (regidx << 15), p + 0); ++ bfd_putb32 (patch[1], p + 4); ++ bfd_putb32 (patch[2], p + 8); ++ rz = TRUE; ++ } ++ } ++ ++ if (!rz) ++ { ++ printf ("%s: %s @ 0x%08x\n", __func__, ibfd->filename, ++ (int) rel->r_offset); ++ BFD_ASSERT(0); /* unsupported pattern */ ++ } ++ ++ return rz; ++} ++ ++static enum elf_nds32_tls_type ++get_tls_type (enum elf_nds32_reloc_type r_type, struct elf_link_hash_entry *h); ++ ++static unsigned int ++ones32 (register unsigned int x) ++{ ++ /* 32-bit recursive reduction using SWAR... ++ but first step is mapping 2-bit values ++ into sum of 2 1-bit values in sneaky way. */ ++ x -= ((x >> 1) & 0x55555555); ++ x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); ++ x = (((x >> 4) + x) & 0x0f0f0f0f); ++ x += (x >> 8); ++ x += (x >> 16); ++ return (x & 0x0000003f); ++} ++ ++/* ++static unsigned int ++fls (register unsigned int x) ++{ ++ return ffs (x & (-x)); ++} ++*/ ++ ++#define nds32_elf_local_tlsdesc_gotent(bfd) \ ++ (elf_nds32_tdata (bfd)->local_tlsdesc_gotent) ++ ++static bfd_boolean ++nds32_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, ++ 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, *relend; ++ bfd_boolean ret = TRUE; /* Assume success. */ ++ int align = 0; ++ bfd_reloc_status_type r; ++ const char *errmsg = NULL; ++ bfd_vma gp; ++ struct elf_link_hash_table *ehtab; ++ struct elf_nds32_link_hash_table *htab; ++ bfd *dynobj; ++ bfd_vma *local_got_offsets; ++ asection *sgot, *splt, *sreloc; ++ bfd_vma high_address; ++ struct elf_nds32_link_hash_table *table; ++ int eliminate_gc_relocs; ++ bfd_vma fpbase_addr; ++ Elf_Internal_Rela *crc_rel = NULL; ++ ++ symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; ++ sym_hashes = elf_sym_hashes (input_bfd); ++ ehtab = elf_hash_table (info); ++ htab = nds32_elf_hash_table (info); ++ high_address = bfd_get_section_limit (input_bfd, input_section); ++ ++ dynobj = htab->root.dynobj; ++ local_got_offsets = elf_local_got_offsets (input_bfd); ++ ++ sgot = ehtab->sgot; ++ splt = ehtab->splt; ++ sreloc = NULL; ++ ++ rel = relocs; ++ relend = relocs + input_section->reloc_count; ++ ++ table = nds32_elf_hash_table (info); ++ eliminate_gc_relocs = table->eliminate_gc_relocs; ++ ++ /* explain _SDA_BASE_ */ ++ /* By this time, we can adjust the value of _SDA_BASE_. */ ++ if ((!info->relocatable)) ++ { ++ is_SDA_BASE_set = 1; ++ r = nds32_elf_final_sda_base (output_bfd, info, &gp, TRUE); ++ if (r != bfd_reloc_ok) ++ return FALSE; ++ } ++ ++#ifdef NDS32_LINUX_TOOLCHAIN ++ /* Do TLS model conversion once at first. */ ++ nds32_elf_unify_tls_model (input_bfd, input_section, contents, info); ++#endif ++ ++ if (is_ITB_BASE_set == 0) ++ { ++ /* Set the _ITB_BASE_. */ ++ if (!nds32_elf_ex9_itb_base (info)) ++ { ++ (*_bfd_error_handler) (_("%B: error: Cannot set _ITB_BASE_"), ++ output_bfd); ++ bfd_set_error (bfd_error_bad_value); ++ } ++ } ++ ++ if (table->target_optimize & NDS32_RELAX_IFC_ON) ++ if (!nds32_elf_ifc_reloc ()) ++ (*_bfd_error_handler) (_("error: IFC relocation error.")); ++ ++ /* Relocation for .ex9.itable. */ ++ if ((table->target_optimize & NDS32_RELAX_EX9_ON) ++ || (table->ex9_import_file && table->update_ex9_table)) ++ nds32_elf_ex9_reloc_jmp (info); ++ ++ if (indirect_call_table.count > 0) ++ nds32_elf_ict_relocate (info); ++ ++ /* Use gp as fp to prevent truncated fit. Because in relaxation time ++ the fp value is set as gp, and it has be reverted for instruction ++ setting fp. */ ++ fpbase_addr = elf_gp (output_bfd); ++ ++ /* Move all SECURITY_16 to the final one for each instruction. */ ++ nds32_elf_crc_adjust_reloc (relocs, relend); ++ ++ /* Deal with (dynamic) relocations. */ ++ for (rel = relocs; rel < relend; rel++) ++ { ++ enum elf_nds32_reloc_type r_type; ++ reloc_howto_type *howto = NULL; ++ unsigned long r_symndx; ++ struct elf_link_hash_entry *h = NULL; ++ struct bfd_link_hash_entry *h2; ++ Elf_Internal_Sym *sym = NULL; ++ asection *sec; ++ bfd_vma relocation; ++ struct elf_nds32_ict_hash_entry *entry; ++ bfd_vma relocation_sym = 0xdeadbeef; ++ Elf_Internal_Rela *lorel; ++ bfd_vma off; ++ ++ /* We can't modify r_addend here as elf_link_input_bfd has an assert to ++ ensure it's zero (we use REL relocs, not RELA). Therefore this ++ should be assigning zero to `addend', but for clarity we use ++ `r_addend'. */ ++ ++ bfd_vma addend = rel->r_addend; ++ bfd_vma offset = rel->r_offset; ++ ++ r_type = ELF32_R_TYPE (rel->r_info); ++ if (r_type >= R_NDS32_max) ++ { ++ (*_bfd_error_handler) (_("%B: error: unknown relocation type %d."), ++ input_bfd, r_type); ++ bfd_set_error (bfd_error_bad_value); ++ ret = FALSE; ++ continue; ++ } ++ ++ if (r_type == R_NDS32_GNU_VTENTRY ++ || r_type == R_NDS32_GNU_VTINHERIT ++ || r_type == R_NDS32_NONE ++ || r_type == R_NDS32_RELA_GNU_VTENTRY ++ || r_type == R_NDS32_RELA_GNU_VTINHERIT ++ || (r_type >= R_NDS32_INSN16 && r_type <= R_NDS32_25_FIXED_RELA) ++ || r_type == R_NDS32_DATA ++ || r_type == R_NDS32_TRAN ++ || (r_type >= R_NDS32_LONGCALL4 && r_type <= R_NDS32_LONGJUMP7)) ++ continue; ++ ++ /* Save security beginning. */ ++ if (r_type == R_NDS32_SECURITY_16 && crc_rel == NULL) ++ { ++ crc_rel = rel; ++ continue; ++ } ++ ++ /* If we enter the fp-as-gp region. Resolve the address of best fp-base. */ ++ if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_BEGIN ++ && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG)) ++ { ++ int dist; ++ ++ /* Distance to relocation of best fp-base is encoded in R_SYM. */ ++ dist = rel->r_addend >> 16; ++ fpbase_addr = calculate_memory_address (input_bfd, rel + dist, ++ local_syms, symtab_hdr); ++ } ++ else if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_END ++ && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG)) ++ { ++ fpbase_addr = elf_gp (output_bfd); ++ } ++ ++ if (((r_type >= R_NDS32_DWARF2_OP1_RELA ++ && r_type <= R_NDS32_DWARF2_LEB_RELA) || r_type >= R_NDS32_RELAX_ENTRY) ++ && !info->relocatable) ++ continue; ++ ++ howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type); ++ r_symndx = ELF32_R_SYM (rel->r_info); ++ ++ /* This is a final link. */ ++ sym = NULL; ++ sec = NULL; ++ h = NULL; ++ ++ if (r_symndx < symtab_hdr->sh_info) ++ { ++ /* Local symbol. */ ++ sym = local_syms + r_symndx; ++ sec = local_sections[r_symndx]; ++ ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); ++ addend = rel->r_addend; ++ ++ /* keep symbol location for static TLS_IE GOT entry */ ++ relocation_sym = relocation; ++ } ++ else ++ { ++ /* External symbol. */ ++ bfd_boolean warned, unresolved_reloc; ++ int symndx = r_symndx - symtab_hdr->sh_info; ++ ++ RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, ++ r_symndx, symtab_hdr, sym_hashes, h, sec, ++ relocation, unresolved_reloc, warned); ++ ++ /* keep symbol location for static TLS_IE GOT entry */ ++ relocation_sym = relocation; ++ ++ /* la $fp, _FP_BASE_ is per-function (region). ++ Handle it specially. */ ++ switch ((int) r_type) ++ { ++ case R_NDS32_SDA19S0_RELA: ++ case R_NDS32_SDA15S0_RELA: ++ case R_NDS32_20_RELA: ++ if (strcmp (elf_sym_hashes (input_bfd)[symndx]->root.root.string, ++ FP_BASE_NAME) == 0) ++ { ++ relocation = fpbase_addr; ++ break; ++ } ++ } ++ } ++ ++ if (info->relocatable) ++ { ++ /* This is a relocatable 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 (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION) ++ rel->r_addend += sec->output_offset + sym->st_value; ++ ++ continue; ++ } ++ ++ /* Sanity check the address. */ ++ if (offset > high_address) ++ { ++ r = bfd_reloc_outofrange; ++ goto check_reloc; ++ } ++ ++ if ((r_type >= R_NDS32_DWARF2_OP1_RELA ++ && r_type <= R_NDS32_DWARF2_LEB_RELA) ++ || r_type >= R_NDS32_RELAX_ENTRY) ++ continue; ++ ++ switch ((int) r_type) ++ { ++ case R_NDS32_GOTOFF: ++ /* Relocation is relative to the start of the global offset ++ table (for ld24 rx, #uimm24), e.g. access at label + addend ++ ++ ld24 rx. #label@GOTOFF + addend ++ sub rx, r12. */ ++ case R_NDS32_GOTOFF_HI20: ++ case R_NDS32_GOTOFF_LO12: ++ case R_NDS32_GOTOFF_LO15: ++ case R_NDS32_GOTOFF_LO19: ++ BFD_ASSERT (sgot != NULL); ++ ++ relocation -= elf_gp (output_bfd); ++ break; ++ ++ case R_NDS32_9_PLTREL: ++ case R_NDS32_25_PLTREL: ++ /* Relocation is to the entry for this symbol in the ++ procedure linkage table. */ ++ ++ /* The native assembler will generate a 25_PLTREL reloc ++ for a local symbol if you assemble a call from one ++ section to another when using -K pic. */ ++ if (h == NULL) ++ break; ++ ++ if (h->forced_local) ++ break; ++ ++ /* We didn't make a PLT entry for this symbol. This ++ happens when statically linking PIC code, or when ++ using -Bsymbolic. */ ++ if (h->plt.offset == (bfd_vma) - 1) ++ break; ++ ++ relocation = (splt->output_section->vma ++ + splt->output_offset + h->plt.offset); ++ break; ++ ++ case R_NDS32_PLT_GOTREL_HI20: ++ case R_NDS32_PLT_GOTREL_LO12: ++ case R_NDS32_PLT_GOTREL_LO15: ++ case R_NDS32_PLT_GOTREL_LO19: ++ case R_NDS32_PLT_GOTREL_LO20: ++ if (h == NULL ++ || h->forced_local ++ || h->plt.offset == (bfd_vma) -1 ++ || (info->pie && h->def_regular)) ++ { ++ /* TODO: find better checking to optimize PIE PLT relocations. */ ++ /* We didn't make a PLT entry for this symbol. This ++ happens when statically linking PIC code, or when ++ using -Bsymbolic. */ ++ if (h) ++ h->plt.offset = (bfd_vma) -1; /* cancel PLT trampoline. */ ++ relocation -= elf_gp(output_bfd); ++ break; ++ } ++ ++ relocation = (splt->output_section->vma ++ + splt->output_offset + h->plt.offset); ++ ++ relocation -= elf_gp (output_bfd); ++ break; ++ ++ case R_NDS32_PLTREL_HI20: ++ case R_NDS32_PLTREL_LO12: ++ ++ /* Relocation is to the entry for this symbol in the ++ procedure linkage table. */ ++ ++ /* The native assembler will generate a 25_PLTREL reloc ++ for a local symbol if you assemble a call from one ++ section to another when using -K pic. */ ++ if (h == NULL) ++ break; ++ ++ if (h->forced_local) ++ 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) ++ break; ++ ++ relocation = (splt->output_section->vma ++ + splt->output_offset ++ + h->plt.offset + 4) ++ - (input_section->output_section->vma ++ + input_section->output_offset ++ + rel->r_offset); ++ ++ break; ++ ++ case R_NDS32_GOTPC20: ++ /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation ++ ld24 rx,#_GLOBAL_OFFSET_TABLE_ */ ++ relocation = elf_gp (output_bfd); ++ break; ++ ++ case R_NDS32_GOTPC_HI20: ++ case R_NDS32_GOTPC_LO12: ++ /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation ++ bl .+4 ++ seth rx,#high(_GLOBAL_OFFSET_TABLE_) ++ or3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4) ++ or ++ bl .+4 ++ seth rx,#shigh(_GLOBAL_OFFSET_TABLE_) ++ add3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4) */ ++ relocation = elf_gp (output_bfd); ++ relocation -= (input_section->output_section->vma ++ + input_section->output_offset + rel->r_offset); ++ break; ++ ++ case R_NDS32_GOT20: ++ /* Fall through. */ ++ case R_NDS32_GOT_HI20: ++ case R_NDS32_GOT_LO12: ++ case R_NDS32_GOT_LO15: ++ case R_NDS32_GOT_LO19: ++ /* Relocation is to the entry for this symbol in the global ++ offset table. */ ++ BFD_ASSERT (sgot != NULL); ++ ++ if (h != NULL) /* External symbol */ ++ { ++ bfd_boolean dyn; ++ ++ off = h->got.offset; ++ BFD_ASSERT (off != (bfd_vma) - 1); ++ dyn = htab->root.dynamic_sections_created; ++ if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) ++ || (info->shared ++ && (info->symbolic ++ || h->dynindx == -1 ++ || h->forced_local) && h->def_regular)) ++ { ++ /* This is actually a static link, or it is a ++ -Bsymbolic link and the symbol is defined ++ locally, or the symbol was forced to be local ++ because of a version file. 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) /* clear LSB */ ++ off &= ~1; ++ else ++ { ++ bfd_put_32 (output_bfd, relocation, sgot->contents + off); ++ h->got.offset |= 1; /* mark initialized */ ++ } ++ } ++ relocation = sgot->output_section->vma + sgot->output_offset + off ++ - elf_gp (output_bfd); ++ } ++ else /* Local symbol */ ++ { ++ bfd_byte *loc; ++ ++ 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) /* clear LSB */ ++ 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_NDS32_RELATIVE reloc ++ for the dynamic linker. */ ++ srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); ++ BFD_ASSERT (srelgot != NULL); ++ ++ outrel.r_offset = (elf_gp (output_bfd) ++ + sgot->output_offset + off); ++ outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE); ++ outrel.r_addend = relocation; ++ loc = srelgot->contents; ++ loc += ++ srelgot->reloc_count * sizeof (Elf32_External_Rela); ++ bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); ++ ++srelgot->reloc_count; ++ } ++ local_got_offsets[r_symndx] |= 1; ++ } ++ relocation = sgot->output_section->vma + sgot->output_offset + off ++ - elf_gp (output_bfd); ++ } ++ ++ break; ++ ++ case R_NDS32_25_PCREL_RELA: ++ case R_NDS32_HI20_RELA: ++ case R_NDS32_LO12S0_RELA: ++ /* Merge normal and indirect call functions. */ ++ if (!ignore_indirect_call && h ++ && elf32_nds32_hash_entry (h)->indirect_call) ++ { ++ (*_bfd_error_handler) ++ (_("%B: Warning: there are mixed" ++ " indirect call function \'%s\'\n"), ++ input_bfd, h->root.root.string); ++ ++ entry = (struct elf_nds32_ict_hash_entry*) ++ bfd_hash_lookup (&indirect_call_table, h->root.root.string, ++ FALSE, FALSE); ++ if (!entry) ++ { ++ (*_bfd_error_handler) ++ (_("%B %A: internal error indirect call relocation " ++ "0x%lx without hash.\n"), ++ input_bfd, sec, rel->r_offset); ++ bfd_set_error (bfd_error_bad_value); ++ return FALSE; ++ } ++ ++ h2 = bfd_link_hash_lookup (info->hash, ++ "_INDIRECT_CALL_TABLE_BASE_", ++ FALSE, FALSE, FALSE); ++ relocation = ((h2->u.def.value ++ + h2->u.def.section->output_section->vma ++ + h2->u.def.section->output_offset) ++ + (entry->order * 4)); ++ break; ++ } ++ ++ /* Fall through. */ ++ case R_NDS32_16_RELA: ++ case R_NDS32_20_RELA: ++ case R_NDS32_5_RELA: ++ case R_NDS32_32_RELA: ++ case R_NDS32_9_PCREL_RELA: ++ case R_NDS32_WORD_9_PCREL_RELA: ++ case R_NDS32_10_UPCREL_RELA: ++ case R_NDS32_15_PCREL_RELA: ++ case R_NDS32_17_PCREL_RELA: ++ case R_NDS32_LO12S3_RELA: ++ case R_NDS32_LO12S2_RELA: ++ case R_NDS32_LO12S2_DP_RELA: ++ case R_NDS32_LO12S2_SP_RELA: ++ case R_NDS32_LO12S1_RELA: ++ case R_NDS32_LO12S0_ORI_RELA: ++ if (info->shared && r_symndx != 0 ++ && (input_section->flags & SEC_ALLOC) != 0 ++ && (eliminate_gc_relocs == 0 ++ || (sec && (sec->flags & SEC_EXCLUDE) == 0)) ++ && ((r_type != R_NDS32_9_PCREL_RELA ++ && r_type != R_NDS32_WORD_9_PCREL_RELA ++ && r_type != R_NDS32_10_UPCREL_RELA ++ && r_type != R_NDS32_15_PCREL_RELA ++ && r_type != R_NDS32_17_PCREL_RELA ++ && r_type != R_NDS32_25_PCREL_RELA ++ && !(r_type == R_NDS32_32_RELA ++ && strcmp (input_section->name, ".eh_frame") == 0)) ++ || (h != NULL && h->dynindx != -1 ++ && (!info->symbolic || !h->def_regular)))) ++ { ++ Elf_Internal_Rela outrel; ++ bfd_boolean skip, relocate; ++ bfd_byte *loc; ++ ++ /* 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)->rela.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); ++ } ++ ++ skip = FALSE; ++ relocate = FALSE; ++ ++ outrel.r_offset = _bfd_elf_section_offset (output_bfd, ++ info, ++ input_section, ++ rel->r_offset); ++ if (outrel.r_offset == (bfd_vma) - 1) ++ skip = TRUE; ++ else if (outrel.r_offset == (bfd_vma) - 2) ++ skip = TRUE, relocate = TRUE; ++ outrel.r_offset += (input_section->output_section->vma ++ + input_section->output_offset); ++ ++ if (skip) ++ memset (&outrel, 0, sizeof outrel); ++ else if (r_type == R_NDS32_17_PCREL_RELA ++ || r_type == R_NDS32_15_PCREL_RELA ++ || r_type == R_NDS32_25_PCREL_RELA) ++ { ++ BFD_ASSERT (h != NULL && h->dynindx != -1); ++ outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); ++ outrel.r_addend = rel->r_addend; ++ } ++ else ++ { ++ /* h->dynindx may be -1 if this symbol was marked to ++ become local. */ ++ if (h == NULL ++ || ((info->symbolic || h->dynindx == -1) ++ && h->def_regular) ++ || (info->pie && h->def_regular)) ++ { ++ relocate = TRUE; ++ outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE); ++ outrel.r_addend = relocation + rel->r_addend; ++ if (h) ++ h->plt.offset = (bfd_vma) -1; /* cancel PLT trampoline. */ ++ } ++ else ++ { ++ if (h->dynindx == -1) ++ { ++ (*_bfd_error_handler) ++ (_("%B: relocation %s against `%s' can not be used when" ++ "making a shared object; recompile with -fPIC"), ++ input_bfd, nds32_elf_howto_table[r_type].name, h->root.root.string); ++ bfd_set_error (bfd_error_bad_value); ++ return FALSE; ++ } ++ outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); ++ outrel.r_addend = rel->r_addend; ++ } ++ } ++ ++ loc = sreloc->contents; ++ loc += sreloc->reloc_count * sizeof (Elf32_External_Rela); ++ bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); ++ ++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; ++ ++ case R_NDS32_25_ABS_RELA: ++ if (info->shared) ++ { ++ (*_bfd_error_handler) ++ (_("%s: warning: cannot deal R_NDS32_25_ABS_RELA in shared mode."), ++ bfd_get_filename (input_bfd)); ++ return FALSE; ++ } ++ break; ++ ++ case R_NDS32_9_PCREL: ++ r = nds32_elf_do_9_pcrel_reloc (input_bfd, howto, input_section, ++ contents, offset, ++ sec, relocation, addend); ++ goto check_reloc; ++ ++ case R_NDS32_HI20: ++ /* We allow an arbitrary number of HI20 relocs before the ++ LO12 reloc. This permits GCC to emit the HI and LO relocs ++ itself. */ ++ for (lorel = rel + 1; ++ (lorel < relend ++ && ELF32_R_TYPE (lorel->r_info) == R_NDS32_HI20); lorel++) ++ continue; ++ if (lorel < relend ++ && (ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S3 ++ || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S2 ++ || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S1 ++ || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S0)) ++ { ++ nds32_elf_relocate_hi20 (input_bfd, r_type, rel, lorel, ++ contents, relocation + addend); ++ r = bfd_reloc_ok; ++ } ++ else ++ r = _bfd_final_link_relocate (howto, input_bfd, input_section, ++ contents, offset, relocation, ++ addend); ++ ++ goto check_reloc; ++ ++ case R_NDS32_GOT17S2_RELA: ++ case R_NDS32_GOT15S2_RELA: ++ BFD_ASSERT (sgot != NULL); ++ ++ if (h != NULL) ++ { ++ bfd_boolean dyn; ++ ++ off = h->got.offset; ++ BFD_ASSERT (off != (bfd_vma) - 1); ++ ++ dyn = htab->root.dynamic_sections_created; ++ if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL ++ (dyn, info->shared, h) || (info->shared ++ && (info->symbolic ++ || h->dynindx == -1 ++ || h->forced_local) ++ && h->def_regular)) ++ { ++ /* This is actually a static link, or it is a ++ -Bsymbolic link and the symbol is defined ++ locally, or the symbol was forced to be local ++ because of a version file. 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_byte *loc; ++ ++ 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_NDS32_RELATIVE reloc ++ for the dynamic linker. */ ++ srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); ++ BFD_ASSERT (srelgot != NULL); ++ ++ outrel.r_offset = (elf_gp (output_bfd) ++ + sgot->output_offset + off); ++ outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE); ++ outrel.r_addend = relocation; ++ loc = srelgot->contents; ++ loc += ++ srelgot->reloc_count * sizeof (Elf32_External_Rela); ++ bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); ++ ++srelgot->reloc_count; ++ } ++ local_got_offsets[r_symndx] |= 1; ++ } ++ } ++ relocation = sgot->output_section->vma + sgot->output_offset + off ++ - elf_gp (output_bfd); ++ ++ if (relocation & align) ++ { ++ /* Incorrect alignment. */ ++ (*_bfd_error_handler) ++ (_("%B: warning: unaligned access to GOT entry."), input_bfd); ++ ret = FALSE; ++ r = bfd_reloc_dangerous; ++ goto check_reloc; ++ } ++ break; ++ ++ case R_NDS32_SDA16S3_RELA: ++ case R_NDS32_SDA15S3_RELA: ++ case R_NDS32_SDA15S3: ++ align = 0x7; ++ goto handle_sda; ++ ++ case R_NDS32_SDA17S2_RELA: ++ case R_NDS32_SDA15S2_RELA: ++ case R_NDS32_SDA12S2_SP_RELA: ++ case R_NDS32_SDA12S2_DP_RELA: ++ case R_NDS32_SDA15S2: ++ case R_NDS32_SDA_FP7U2_RELA: ++ align = 0x3; ++ goto handle_sda; ++ ++ case R_NDS32_SDA18S1_RELA: ++ case R_NDS32_SDA15S1_RELA: ++ case R_NDS32_SDA15S1: ++ align = 0x1; ++ goto handle_sda; ++ ++ case R_NDS32_SDA19S0_RELA: ++ case R_NDS32_SDA15S0_RELA: ++ case R_NDS32_SDA15S0: ++ align = 0x0; ++handle_sda: ++ BFD_ASSERT (sec != NULL); ++ ++ /* If the symbol is in the abs section, the out_bfd will be null. ++ This happens when the relocation has a symbol@GOTOFF. */ ++ r = nds32_elf_final_sda_base (output_bfd, info, &gp, FALSE); ++ if (r != bfd_reloc_ok) ++ { ++ (*_bfd_error_handler) ++ (_("%B: warning: relocate SDA_BASE failed."), input_bfd); ++ ret = FALSE; ++ goto check_reloc; ++ } ++ ++ /* At this point `relocation' contains the object's ++ address. */ ++ if (r_type == R_NDS32_SDA_FP7U2_RELA) ++ { ++ relocation -= fpbase_addr; ++ } ++ else ++ relocation -= gp; ++ /* Now it contains the offset from _SDA_BASE_. */ ++ ++ /* Make sure alignment is correct. */ ++ ++ if (relocation & align) ++ { ++ /* Incorrect alignment. */ ++ (*_bfd_error_handler) ++ (_("%B(%A): warning: unaligned small data access of type %d."), ++ input_bfd, input_section, r_type); ++ ret = FALSE; ++ goto check_reloc; ++ } ++ ++ break; ++ case R_NDS32_17IFC_PCREL_RELA: ++ case R_NDS32_10IFCU_PCREL_RELA: ++ /* do nothing */ ++ break; ++ ++ case R_NDS32_TLS_LE_HI20: ++ case R_NDS32_TLS_LE_LO12: ++ case R_NDS32_TLS_LE_20: ++ case R_NDS32_TLS_LE_15S0: ++ case R_NDS32_TLS_LE_15S1: ++ case R_NDS32_TLS_LE_15S2: ++ if (elf_hash_table (info)->tls_sec != NULL) ++ relocation -= (elf_hash_table (info)->tls_sec->vma + TP_OFFSET); ++ break; ++ case R_NDS32_TLS_IE_HI20: ++ case R_NDS32_TLS_IE_LO12S2: ++ case R_NDS32_TLS_DESC_HI20: ++ case R_NDS32_TLS_DESC_LO12: ++ case R_NDS32_TLS_IE_LO12: ++ case R_NDS32_TLS_IEGP_HI20: ++ case R_NDS32_TLS_IEGP_LO12: ++ case R_NDS32_TLS_IEGP_LO12S2: ++ { ++ /* Relocation is to the entry for this symbol in the global ++ offset table. */ ++ enum elf_nds32_tls_type tls_type, org_tls_type, eff_tls_type; ++ asection *srelgot; ++ Elf_Internal_Rela outrel; ++ bfd_byte *loc; ++ int indx = 0; ++ ++ eff_tls_type = org_tls_type = get_tls_type (r_type, h); ++ ++ BFD_ASSERT (sgot != NULL); ++ if (h != NULL) ++ { ++ bfd_boolean dyn; ++ ++ off = h->got.offset; ++ BFD_ASSERT (off != (bfd_vma) -1); ++ dyn = htab->root.dynamic_sections_created; ++ tls_type = ((struct elf_nds32_link_hash_entry *) h)->tls_type; ++ if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) ++ && (!info->shared ++ || !SYMBOL_REFERENCES_LOCAL (info, h))) ++ indx = h->dynindx; ++ } ++ else ++ { ++ BFD_ASSERT (local_got_offsets != NULL ++ && local_got_offsets[r_symndx] != (bfd_vma) - 1); ++ ++ off = local_got_offsets[r_symndx]; ++ tls_type = elf32_nds32_local_got_tls_type (input_bfd)[r_symndx]; ++ } ++ ++ relocation = sgot->output_section->vma + sgot->output_offset + off; ++ ++ if (1 < ones32 (tls_type)) ++ { ++ eff_tls_type = 1 << (fls (tls_type) - 1); ++ /* TLS model shall be handled in nds32_elf_unify_tls_model () */ ++ ++ /* TLS model X -> LE is not implement yet! ++ * workaround here! */ ++ if (eff_tls_type == GOT_TLS_LE) ++ { ++ eff_tls_type = 1 << (fls (tls_type ^ eff_tls_type) - 1); ++ } ++ } ++ ++ /* The offset must always be a multiple of 4. We use ++ the least significant bit to record whether we have ++ already processed this entry. */ ++ bfd_boolean need_relocs = FALSE; ++ srelgot = ehtab->srelgot; ++ if ((info->shared || indx != 0) ++ && (h == NULL || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT ++ || h->root.type != bfd_link_hash_undefweak)) ++ { ++ need_relocs = TRUE; ++ BFD_ASSERT (srelgot != NULL); ++ } ++ ++ if (off & 1) ++ { ++ off &= ~1; ++ relocation &= ~1; ++ ++ if (eff_tls_type & GOT_TLS_DESC) ++ { ++ relocation -= elf_gp (output_bfd); ++ if ((R_NDS32_TLS_DESC_HI20 == r_type) && (!need_relocs)) ++ { ++ /* TLS model shall be converted */ ++ BFD_ASSERT(0); ++ } ++ } ++ else if (eff_tls_type & GOT_TLS_IEGP) ++ { ++ relocation -= elf_gp (output_bfd); ++ } ++ } ++ else ++ { ++ if ((eff_tls_type & GOT_TLS_LE) && (tls_type ^ eff_tls_type)) ++ { ++ /* TLS model workaround shall be applied */ ++ BFD_ASSERT(0); ++ } ++ else if (eff_tls_type & (GOT_TLS_IE | GOT_TLS_IEGP)) ++ { ++ if (eff_tls_type & GOT_TLS_IEGP) ++ relocation -= elf_gp(output_bfd); ++ ++ if (need_relocs) ++ { ++ if (indx == 0) ++ outrel.r_addend = gottpoff (info, relocation_sym); ++ else ++ outrel.r_addend = 0; ++ outrel.r_offset = (sgot->output_section->vma ++ + sgot->output_offset + off); ++ outrel.r_info = ELF32_R_INFO (indx, R_NDS32_TLS_TPOFF); ++ ++ elf32_nds32_add_dynreloc (output_bfd, info, srelgot, ++ &outrel); ++ } ++ else ++ { ++ bfd_put_32 (output_bfd, gottpoff (info, relocation_sym), ++ sgot->contents + off); ++ } ++ } ++ else if (eff_tls_type & GOT_TLS_DESC) ++ { ++ relocation -= elf_gp (output_bfd); ++ if (need_relocs) ++ { ++ asection *srelplt; ++ srelplt = ehtab->srelplt; ++ ++ if (indx == 0) ++ outrel.r_addend = gottpoff (info, relocation_sym); ++ else ++ outrel.r_addend = 0; ++ outrel.r_offset = (sgot->output_section->vma ++ + sgot->output_offset + off); ++ outrel.r_info = ELF32_R_INFO (indx, R_NDS32_TLS_DESC); ++ ++ loc = srelplt->contents; ++ loc += htab->next_tls_desc_index++ * sizeof (Elf32_External_Rela); ++ BFD_ASSERT (loc + sizeof (Elf32_External_Rela) ++ <= srelplt->contents + srelplt->size); ++ ++ bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); ++ } ++ else ++ { ++ /* feed me! */ ++ bfd_put_32 (output_bfd, 0xdeadbeef, ++ sgot->contents + off); ++ bfd_put_32 (output_bfd, gottpoff (info, relocation_sym), ++ sgot->contents + off + 4); ++ patch_tls_desc_to_ie (contents, rel, input_bfd); ++ BFD_ASSERT(0); ++ } ++ } ++ else ++ { ++ /* TLS model workaround shall be applied */ ++ BFD_ASSERT(0); ++ } ++ ++ if (h != NULL) ++ h->got.offset |= 1; ++ else ++ local_got_offsets[r_symndx] |= 1; ++ } ++ } ++ break; ++ ++ case R_NDS32_SECURITY_16: ++ relocation = nds32_elf_crc_relocation (crc_rel, rel, relend, ++ contents); ++ crc_rel->r_addend = NDS32_SECURITY_NONE; ++ r = nds32_elf_final_link_relocate (howto, input_bfd, ++ input_section, contents, ++ crc_rel->r_offset, relocation, ++ crc_rel->r_addend); ++ crc_rel = NULL; ++ goto check_reloc; ++ break; ++ /* DON'T fall through. */ ++ case R_NDS32_ICT_HI20: ++ case R_NDS32_ICT_LO12: ++ case R_NDS32_ICT_25PC: ++ if (!ignore_indirect_call) ++ { ++ entry = (struct elf_nds32_ict_hash_entry*) ++ bfd_hash_lookup (&indirect_call_table, h->root.root.string, ++ FALSE, FALSE); ++ if (!entry) ++ { ++ (*_bfd_error_handler) ++ (_("%B %A: internal error indirect call relocation " ++ "0x%lx without hash.\n"), ++ input_bfd, sec, rel->r_offset); ++ bfd_set_error (bfd_error_bad_value); ++ return FALSE; ++ } ++ ++ h2 = bfd_link_hash_lookup (info->hash, ++ "_INDIRECT_CALL_TABLE_BASE_", ++ FALSE, FALSE, FALSE); ++ relocation = ((h2->u.def.value ++ + h2->u.def.section->output_section->vma ++ + h2->u.def.section->output_offset) ++ + (entry->order * 4)); ++ } ++ break; ++ /* DON'T fall through. */ ++ ++ default: ++ /* OLD_NDS32_RELOC. */ ++ ++ r = _bfd_final_link_relocate (howto, input_bfd, input_section, ++ contents, offset, relocation, addend); ++ goto check_reloc; ++ } ++ ++ switch ((int) r_type) ++ { ++ case R_NDS32_20_RELA: ++ case R_NDS32_5_RELA: ++ case R_NDS32_9_PCREL_RELA: ++ case R_NDS32_WORD_9_PCREL_RELA: ++ case R_NDS32_10_UPCREL_RELA: ++ case R_NDS32_15_PCREL_RELA: ++ case R_NDS32_17_PCREL_RELA: ++ case R_NDS32_25_PCREL_RELA: ++ case R_NDS32_25_ABS_RELA: ++ case R_NDS32_HI20_RELA: ++ case R_NDS32_LO12S3_RELA: ++ case R_NDS32_LO12S2_RELA: ++ case R_NDS32_LO12S2_DP_RELA: ++ case R_NDS32_LO12S2_SP_RELA: ++ case R_NDS32_LO12S1_RELA: ++ case R_NDS32_LO12S0_RELA: ++ case R_NDS32_LO12S0_ORI_RELA: ++ case R_NDS32_SDA16S3_RELA: ++ case R_NDS32_SDA17S2_RELA: ++ case R_NDS32_SDA18S1_RELA: ++ case R_NDS32_SDA19S0_RELA: ++ case R_NDS32_SDA15S3_RELA: ++ case R_NDS32_SDA15S2_RELA: ++ case R_NDS32_SDA12S2_DP_RELA: ++ case R_NDS32_SDA12S2_SP_RELA: ++ case R_NDS32_SDA15S1_RELA: ++ case R_NDS32_SDA15S0_RELA: ++ case R_NDS32_SDA_FP7U2_RELA: ++ case R_NDS32_9_PLTREL: ++ case R_NDS32_25_PLTREL: ++ case R_NDS32_GOT20: ++ case R_NDS32_GOT_HI20: ++ case R_NDS32_GOT_LO12: ++ case R_NDS32_GOT_LO15: ++ case R_NDS32_GOT_LO19: ++ case R_NDS32_GOT15S2_RELA: ++ case R_NDS32_GOT17S2_RELA: ++ case R_NDS32_GOTPC20: ++ case R_NDS32_GOTPC_HI20: ++ case R_NDS32_GOTPC_LO12: ++ case R_NDS32_GOTOFF: ++ case R_NDS32_GOTOFF_HI20: ++ case R_NDS32_GOTOFF_LO12: ++ case R_NDS32_GOTOFF_LO15: ++ case R_NDS32_GOTOFF_LO19: ++ case R_NDS32_PLTREL_HI20: ++ case R_NDS32_PLTREL_LO12: ++ case R_NDS32_PLT_GOTREL_HI20: ++ case R_NDS32_PLT_GOTREL_LO12: ++ case R_NDS32_PLT_GOTREL_LO15: ++ case R_NDS32_PLT_GOTREL_LO19: ++ case R_NDS32_PLT_GOTREL_LO20: ++ case R_NDS32_17IFC_PCREL_RELA: ++ case R_NDS32_10IFCU_PCREL_RELA: ++ case R_NDS32_TLS_LE_HI20: ++ case R_NDS32_TLS_LE_LO12: ++ case R_NDS32_TLS_IE_HI20: ++ case R_NDS32_TLS_IE_LO12S2: ++ case R_NDS32_TLS_LE_20: ++ case R_NDS32_TLS_LE_15S0: ++ case R_NDS32_TLS_LE_15S1: ++ case R_NDS32_TLS_LE_15S2: ++ case R_NDS32_TLS_DESC_HI20: ++ case R_NDS32_TLS_DESC_LO12: ++ case R_NDS32_TLS_IE_LO12: ++ case R_NDS32_TLS_IEGP_HI20: ++ case R_NDS32_TLS_IEGP_LO12: ++ case R_NDS32_TLS_IEGP_LO12S2: ++ /* Instruction related relocs must handle endian properly. */ ++ /* NOTE: PIC IS NOT HANDLE YET; DO IT LATER. */ ++ r = nds32_elf_final_link_relocate (howto, input_bfd, ++ input_section, contents, ++ rel->r_offset, relocation, ++ rel->r_addend); ++ break; ++ ++ case R_NDS32_ICT_HI20: ++ case R_NDS32_ICT_LO12: ++ case R_NDS32_ICT_25PC: ++ r = nds32_elf_final_link_relocate (howto, input_bfd, input_section, ++ contents, rel->r_offset, ++ relocation, 0); ++ break; ++ ++ default: ++ /* All other relocs can use default handler. */ ++ r = _bfd_final_link_relocate (howto, input_bfd, input_section, ++ contents, rel->r_offset, ++ relocation, rel->r_addend); ++ break; ++ } ++ ++check_reloc: ++ ++ if (r != bfd_reloc_ok) ++ { ++ /* FIXME: This should be generic enough to go in a utility. */ ++ 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 || *name == '\0') ++ name = bfd_section_name (input_bfd, sec); ++ } ++ ++ if (errmsg != NULL) ++ goto common_error; ++ ++ switch (r) ++ { ++ case bfd_reloc_overflow: ++ if (!((*info->callbacks->reloc_overflow) ++ (info, (h ? &h->root : NULL), name, howto->name, ++ (bfd_vma) 0, input_bfd, input_section, offset))) ++ return FALSE; ++ break; ++ ++ case bfd_reloc_undefined: ++ if (!((*info->callbacks->undefined_symbol) ++ (info, name, input_bfd, input_section, offset, TRUE))) ++ return FALSE; ++ break; ++ ++ case bfd_reloc_outofrange: ++ errmsg = _("internal error: out of range error"); ++ goto common_error; ++ ++ case bfd_reloc_notsupported: ++ errmsg = _("internal error: unsupported relocation error"); ++ goto common_error; ++ ++ case bfd_reloc_dangerous: ++ errmsg = _("internal error: dangerous error"); ++ goto common_error; ++ ++ default: ++ errmsg = _("internal error: unknown error"); ++ /* Fall through. */ ++ ++common_error: ++ if (!((*info->callbacks->warning) ++ (info, errmsg, name, input_bfd, input_section, offset))) ++ return FALSE; ++ break; ++ } ++ } ++ } ++ ++ /* Resotre header size to avoid overflow load. */ ++ if (elf_nds32_tdata (input_bfd)->hdr_size != 0) ++ symtab_hdr->sh_size = elf_nds32_tdata (input_bfd)->hdr_size; ++ ++ return ret; ++} ++ ++/* Finish up dynamic symbol handling. We set the contents of various ++ dynamic sections here. */ ++ ++static bfd_boolean ++nds32_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, ++ struct elf_link_hash_entry *h, ++ Elf_Internal_Sym *sym) ++{ ++ struct elf_link_hash_table *ehtab; ++ struct elf_nds32_link_hash_entry *hent; ++ bfd_byte *loc; ++ ++ ehtab = elf_hash_table (info); ++ hent = (struct elf_nds32_link_hash_entry *) h; ++ ++ if (h->plt.offset != (bfd_vma) - 1) ++ { ++ asection *splt; ++ asection *sgot; ++ asection *srela; ++ ++ bfd_vma plt_index; ++ bfd_vma got_offset; ++ bfd_vma local_plt_offset; ++ Elf_Internal_Rela rela; ++ ++ /* This symbol has an entry in the procedure linkage table. Set ++ it up. */ ++ ++ BFD_ASSERT (h->dynindx != -1); ++ ++ splt = ehtab->splt; ++ sgot = ehtab->sgotplt; ++ srela = ehtab->srelplt; ++ 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. */ ++ if (!info->shared) ++ { ++ unsigned long insn; ++ ++ insn = PLT_ENTRY_WORD0 + (((sgot->output_section->vma ++ + sgot->output_offset + got_offset) >> 12) ++ & 0xfffff); ++ bfd_putb32 (insn, splt->contents + h->plt.offset); ++ ++ insn = PLT_ENTRY_WORD1 + (((sgot->output_section->vma ++ + sgot->output_offset + got_offset) & 0x0fff) ++ >> 2); ++ bfd_putb32 (insn, splt->contents + h->plt.offset + 4); ++ ++ insn = PLT_ENTRY_WORD2; ++ bfd_putb32 (insn, splt->contents + h->plt.offset + 8); ++ ++ insn = PLT_ENTRY_WORD3 + (plt_index & 0x7ffff); ++ bfd_putb32 (insn, splt->contents + h->plt.offset + 12); ++ ++ insn = PLT_ENTRY_WORD4 ++ + (((unsigned int) ((-(h->plt.offset + 16)) >> 1)) & 0xffffff); ++ bfd_putb32 (insn, splt->contents + h->plt.offset + 16); ++ local_plt_offset = 12; ++ } ++ else ++ { ++ /* sda_base must be set at this time. */ ++ unsigned long insn; ++ long offset; ++ ++ /* FIXME, sda_base is 65536, it will damage opcode. */ ++ offset = sgot->output_section->vma + sgot->output_offset + got_offset ++ - elf_gp (output_bfd); ++ insn = PLT_PIC_ENTRY_WORD0 + ((offset >> 12) & 0xfffff); ++ bfd_putb32 (insn, splt->contents + h->plt.offset); ++ ++ insn = PLT_PIC_ENTRY_WORD1 + (offset & 0xfff); ++ bfd_putb32 (insn, splt->contents + h->plt.offset + 4); ++ ++ insn = PLT_PIC_ENTRY_WORD2; ++ bfd_putb32 (insn, splt->contents + h->plt.offset + 8); ++ ++ insn = PLT_PIC_ENTRY_WORD3; ++ bfd_putb32 (insn, splt->contents + h->plt.offset + 12); ++ ++ insn = PLT_PIC_ENTRY_WORD4 + (plt_index & 0x7fffff); ++ bfd_putb32 (insn, splt->contents + h->plt.offset + 16); ++ ++ insn = PLT_PIC_ENTRY_WORD5 ++ + (((unsigned int) ((-(h->plt.offset + 20)) >> 1)) & 0xffffff); ++ bfd_putb32 (insn, splt->contents + h->plt.offset + 20); ++ ++ local_plt_offset = 16; ++ } ++ ++ /* Fill in the entry in the global offset table, ++ so it will fall through to the next instruction for the first time. */ ++ bfd_put_32 (output_bfd, ++ (splt->output_section->vma + splt->output_offset ++ + h->plt.offset + local_plt_offset), ++ 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_NDS32_JMP_SLOT); ++ rela.r_addend = 0; ++ loc = srela->contents; ++ loc += plt_index * sizeof (Elf32_External_Rela); ++ bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); ++ ++ if (!h->def_regular) ++ { ++ /* Mark the symbol as undefined, rather than as defined in ++ the .plt section. Leave the value alone. */ ++ sym->st_shndx = SHN_UNDEF; ++ if (!h->ref_regular_nonweak) ++ sym->st_value = 0; ++ } ++ } ++ ++ if ((h->got.offset != (bfd_vma) -1) && (hent->tls_type == GOT_NORMAL)) ++ { ++ asection *sgot; ++ asection *srelagot; ++ Elf_Internal_Rela rela; ++ ++ /* This symbol has an entry in the global offset table. ++ Set it up. */ ++ ++ sgot = ehtab->sgot; ++ srelagot = ehtab->srelgot; ++ BFD_ASSERT (sgot != NULL && srelagot != 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. Likewise if ++ the symbol was forced to be local because of a version file. ++ The entry in the global offset table will already have been ++ initialized in the relocate_section function. */ ++ if ((info->shared ++ && (info->symbolic || h->dynindx == -1 || h->forced_local) ++ && h->def_regular) ++ || (info->pie && h->def_regular)) ++ { ++ rela.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE); ++ rela.r_addend = (h->root.u.def.value ++ + h->root.u.def.section->output_section->vma ++ + h->root.u.def.section->output_offset); ++ ++ /* FIXME: cancel PLT trampoline, too late ?? */ ++ /* h->plt.offset = (bfd_vma) -1; */ ++ } ++ else ++ { ++ BFD_ASSERT ((h->got.offset & 1) == 0); ++ bfd_put_32 (output_bfd, (bfd_vma) 0, ++ sgot->contents + h->got.offset); ++ rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_GLOB_DAT); ++ rela.r_addend = 0; ++ } ++ ++ loc = srelagot->contents; ++ loc += srelagot->reloc_count * sizeof (Elf32_External_Rela); ++ bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); ++ ++srelagot->reloc_count; ++ BFD_ASSERT (loc < (srelagot->contents + srelagot->size)); ++ } ++ ++ if (h->needs_copy) ++ { ++ asection *s; ++ Elf_Internal_Rela rela; ++ ++ /* This symbols 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_NDS32_COPY); ++ rela.r_addend = 0; ++ loc = s->contents; ++ loc += s->reloc_count * sizeof (Elf32_External_Rela); ++ bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); ++ ++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) ++ sym->st_shndx = SHN_ABS; ++ ++ return TRUE; ++} ++ ++ ++/* Finish up the dynamic sections. */ ++ ++static bfd_boolean ++nds32_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) ++{ ++ bfd *dynobj; ++ asection *sdyn; ++ asection *sgotplt; ++ struct elf_link_hash_table *ehtab; ++ struct elf_nds32_link_hash_table *htab; ++ ++ ehtab = elf_hash_table (info); ++ htab = nds32_elf_hash_table (info); ++ if (htab == NULL) ++ return FALSE; ++ ++ dynobj = elf_hash_table (info)->dynobj; ++ ++ sgotplt = ehtab->sgotplt; ++ /* A broken linker script might have discarded the dynamic sections. ++ Catch this here so that we do not seg-fault later on. */ ++ if (sgotplt != NULL && bfd_is_abs_section (sgotplt->output_section)) ++ return FALSE; ++ sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); ++ ++ if (elf_hash_table (info)->dynamic_sections_created) ++ { ++ asection *splt; ++ Elf32_External_Dyn *dyncon, *dynconend; ++ ++ BFD_ASSERT (sgotplt != NULL && sdyn != NULL); ++ ++ dyncon = (Elf32_External_Dyn *) sdyn->contents; ++ dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size); ++ ++ for (; dyncon < dynconend; dyncon++) ++ { ++ Elf_Internal_Dyn dyn; ++ asection *s; ++ ++ bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn); ++ ++ switch (dyn.d_tag) ++ { ++ default: ++ break; ++ ++ case DT_PLTGOT: ++ /* name = ".got"; */ ++ s = ehtab->sgot->output_section; ++ goto get_vma; ++ case DT_JMPREL: ++ s = ehtab->srelplt->output_section; ++get_vma: ++ 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 = ehtab->srelplt->output_section; ++ BFD_ASSERT (s != NULL); ++ dyn.d_un.d_val = s->size; ++ bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); ++ break; ++ ++ case DT_RELASZ: ++ /* My reading of the SVR4 ABI indicates that the ++ procedure linkage table relocs (DT_JMPREL) should be ++ included in the overall relocs (DT_RELA). This is ++ what Solaris does. However, UnixWare can not handle ++ that case. 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. */ ++ if (ehtab->srelplt != NULL) ++ { ++ s = ehtab->srelplt->output_section; ++ dyn.d_un.d_val -= s->size; ++ } ++ bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); ++ break; ++ ++ case DT_TLSDESC_PLT: ++ s = htab->root.splt; ++ dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset ++ + htab->dt_tlsdesc_plt); ++ bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); ++ break; ++ ++ case DT_TLSDESC_GOT: ++ s = htab->root.sgot; ++ dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset ++ + htab->dt_tlsdesc_got); ++ bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); ++ break; ++ } ++ } ++ ++ /* Fill in the first entry in the procedure linkage table. */ ++ splt = ehtab->splt; ++ if (splt && splt->size > 0) ++ { ++ if (info->shared) ++ { ++ unsigned long insn; ++ long offset; ++ ++ /* FIXME, sda_base is 65536, it will damage opcode. */ ++ offset = sgotplt->output_section->vma + sgotplt->output_offset + 4 ++ - elf_gp (output_bfd); ++ insn = PLT0_PIC_ENTRY_WORD0 | ((offset >> 12) & 0xfffff); ++ bfd_putb32 (insn, splt->contents); ++ ++ /* here has a typo? */ ++ insn = PLT0_PIC_ENTRY_WORD1 | (offset & 0xfff); ++ bfd_putb32 (insn, splt->contents + 4); ++ ++ insn = PLT0_PIC_ENTRY_WORD2; ++ bfd_putb32 (insn, splt->contents + 8); ++ ++ insn = PLT0_PIC_ENTRY_WORD3; ++ bfd_putb32 (insn, splt->contents + 12); ++ ++ insn = PLT0_PIC_ENTRY_WORD4; ++ bfd_putb32 (insn, splt->contents + 16); ++ ++ insn = PLT0_PIC_ENTRY_WORD5; ++ bfd_putb32 (insn, splt->contents + 20); ++ } ++ else ++ { ++ unsigned long insn; ++ unsigned long addr; ++ ++ /* addr = .got + 4 */ ++ addr = sgotplt->output_section->vma + sgotplt->output_offset + 4; ++ insn = PLT0_ENTRY_WORD0 | ((addr >> 12) & 0xfffff); ++ bfd_putb32 (insn, splt->contents); ++ ++ insn = PLT0_ENTRY_WORD1 | (addr & 0x0fff); ++ bfd_putb32 (insn, splt->contents + 4); ++ ++ insn = PLT0_ENTRY_WORD2; ++ bfd_putb32 (insn, splt->contents + 8); ++ ++ insn = PLT0_ENTRY_WORD3; ++ bfd_putb32 (insn, splt->contents + 12); ++ ++ insn = PLT0_ENTRY_WORD4; ++ bfd_putb32 (insn, splt->contents + 16); ++ } ++ ++ elf_section_data (splt->output_section)->this_hdr.sh_entsize = ++ PLT_ENTRY_SIZE; ++ } ++ ++ if (htab->dt_tlsdesc_plt) ++ { ++ /* Calculate addresses. */ ++ asection *sgot = sgot = ehtab->sgot; ++ bfd_vma pltgot = sgotplt->output_section->vma ++ + sgotplt->output_offset; ++ bfd_vma tlsdesc_got = sgot->output_section->vma + sgot->output_offset ++ + htab->dt_tlsdesc_got; ++ ++ /* Get GP offset. */ ++ pltgot -= elf_gp (output_bfd) - 4; /* PLTGOT[1] */ ++ tlsdesc_got -= elf_gp (output_bfd); ++ ++ /* Do relocation. */ ++ dl_tlsdesc_lazy_trampoline[0] += ((1 << 20) - 1) & (tlsdesc_got >> 12); ++ dl_tlsdesc_lazy_trampoline[1] += 0xfff & tlsdesc_got; ++ dl_tlsdesc_lazy_trampoline[4] += ((1 << 20) - 1) & (pltgot >> 12); ++ dl_tlsdesc_lazy_trampoline[5] += 0xfff & pltgot; ++ ++ /* TODO: relaxation. */ ++ ++ /* Insert .plt. */ ++ nds32_put_trampoline (splt->contents + htab->dt_tlsdesc_plt, ++ dl_tlsdesc_lazy_trampoline, ++ ARRAY_SIZE (dl_tlsdesc_lazy_trampoline)); ++ } ++ } ++ ++ /* Fill in the first three entries in the global offset table. */ ++ if (sgotplt && sgotplt->size > 0) ++ { ++ if (sdyn == NULL) ++ bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents); ++ else ++ bfd_put_32 (output_bfd, ++ sdyn->output_section->vma + sdyn->output_offset, ++ sgotplt->contents); ++ bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4); ++ bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8); ++ ++ elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4; ++ } ++ ++ return TRUE; ++} ++ ++ ++/* Set the right machine number. */ ++ ++static bfd_boolean ++nds32_elf_object_p (bfd *abfd) ++{ ++ static unsigned int cur_arch = 0; ++ ++ if (E_N1_ARCH != (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH)) ++ { ++ /* E_N1_ARCH is a wild card, so it is set only when no others exist. */ ++ cur_arch = (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH); ++ } ++ ++ switch (cur_arch) ++ { ++ default: ++ case E_N1_ARCH: ++ bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1); ++ break; ++ case E_N1H_ARCH: ++ bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h); ++ break; ++ case E_NDS_ARCH_STAR_V2_0: ++ bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v2); ++ break; ++ case E_NDS_ARCH_STAR_V3_0: ++ bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3); ++ break; ++ case E_NDS_ARCH_STAR_V3_M: ++ bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3m); ++ break; ++ } ++ ++ return TRUE; ++} ++ ++/* Store the machine number in the flags field. */ ++ ++static void ++nds32_elf_final_write_processing (bfd *abfd, ++ bfd_boolean linker ATTRIBUTE_UNUSED) ++{ ++ unsigned long val; ++ static unsigned int cur_mach = 0; ++ unsigned int i; ++ ++ if (bfd_mach_n1 != bfd_get_mach (abfd)) ++ { ++ cur_mach = bfd_get_mach (abfd); ++ } ++ ++ switch (cur_mach) ++ { ++ case bfd_mach_n1: ++ /* Only happen when object is empty, since the case is abandon. */ ++ val = E_N1_ARCH; ++ val |= E_NDS_ABI_AABI; ++ val |= E_NDS32_ELF_VER_1_4; ++ break; ++ case bfd_mach_n1h: ++ val = E_N1H_ARCH; ++ break; ++ case bfd_mach_n1h_v2: ++ val = E_NDS_ARCH_STAR_V2_0; ++ break; ++ case bfd_mach_n1h_v3: ++ val = E_NDS_ARCH_STAR_V3_0; ++ break; ++ case bfd_mach_n1h_v3m: ++ val = E_NDS_ARCH_STAR_V3_M; ++ break; ++ default: ++ val = 0; ++ break; ++ } ++ ++ elf_elfheader (abfd)->e_flags &= ~EF_NDS_ARCH; ++ elf_elfheader (abfd)->e_flags |= val; ++ ++ if (ict_file) ++ { ++ fprintf (ict_file, ".section " NDS32_ICT_SECTION ", \"ax\"\n" ++ ".globl _INDIRECT_CALL_TABLE_BASE_\n" ++ "_INDIRECT_CALL_TABLE_BASE_:\n"); ++ /* Output rom patch entries. */ ++ indirect_call_table.frozen = 1; ++ for (i = 0; i < indirect_call_table.size; i++) ++ { ++ struct bfd_hash_entry *p; ++ struct elf_nds32_ict_hash_entry *entry; ++ ++ for (p = indirect_call_table.table[i]; p != NULL; p = p->next) ++ { ++ entry = (struct elf_nds32_ict_hash_entry *) p; ++ fprintf (ict_file, "\tj\t%s\n", entry->root.string); ++ } ++ } ++ indirect_call_table.frozen = 0; ++ } ++} ++ ++/* Function to keep NDS32 specific file flags. */ ++ ++static bfd_boolean ++nds32_elf_set_private_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; ++} ++ ++static unsigned int ++convert_e_flags (unsigned int e_flags, unsigned int arch) ++{ ++ if ((e_flags & EF_NDS_ARCH) == E_NDS_ARCH_STAR_V0_9) ++ { ++ /* From 0.9 to 1.0. */ ++ e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V1_0; ++ ++ /* Invert E_NDS32_HAS_NO_MAC_INST. */ ++ e_flags ^= E_NDS32_HAS_NO_MAC_INST; ++ if (arch == E_NDS_ARCH_STAR_V1_0) ++ { ++ /* Done. */ ++ return e_flags; ++ } ++ } ++ ++ /* From 1.0 to 2.0. */ ++ e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V2_0; ++ ++ /* Clear E_NDS32_HAS_MFUSR_PC_INST. */ ++ e_flags &= ~E_NDS32_HAS_MFUSR_PC_INST; ++ ++ /* Invert E_NDS32_HAS_NO_MAC_INST. */ ++ e_flags ^= E_NDS32_HAS_NO_MAC_INST; ++ return e_flags; ++} ++ ++static bfd_boolean ++nds32_check_vec_size (bfd *ibfd) ++{ ++ static unsigned int nds32_vec_size = 0; ++ ++ asection *sec_t = NULL; ++ bfd_byte *contents = NULL; ++ ++ sec_t = bfd_get_section_by_name (ibfd, ".nds32_e_flags"); ++ ++ if (sec_t && sec_t->size >= 4) ++ { ++ /* Get vec_size in file. */ ++ unsigned int flag_t; ++ ++ nds32_get_section_contents (ibfd, sec_t, &contents, TRUE); ++ flag_t = bfd_get_32 (ibfd, contents); ++ ++ /* The value could only be 4 or 16. */ ++ ++ if (!nds32_vec_size) ++ /* Set if not set yet. */ ++ nds32_vec_size = (flag_t & 0x3); ++ else if (nds32_vec_size != (flag_t & 0x3)) ++ { ++ (*_bfd_error_handler) (_("%B: ISR vector size mismatch" ++ " with previous modules, previous %u-byte, current %u-byte"), ++ ibfd, ++ nds32_vec_size == 1 ? 4 : nds32_vec_size == 2 ? 16 : 0xffffffff, ++ (flag_t & 0x3) == 1 ? 4 : (flag_t & 0x3) == 2 ? 16 : 0xffffffff); ++ return FALSE; ++ } ++ else ++ /* Only keep the first vec_size section. */ ++ sec_t->flags |= SEC_EXCLUDE; ++ } ++ ++ return TRUE; ++} ++ ++/* Merge backend specific data from an object file to the output ++ object file when linking. */ ++ ++static bfd_boolean ++nds32_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd) ++{ ++ flagword out_flags; ++ flagword in_flags; ++ flagword out_16regs; ++ flagword in_no_mac; ++ flagword out_no_mac; ++ flagword in_16regs; ++ flagword out_version; ++ flagword in_version; ++ flagword out_fpu_config; ++ flagword in_fpu_config; ++ ++ /* TODO: Revise to use object-attributes instead. */ ++ if (!nds32_check_vec_size (ibfd)) ++ return FALSE; ++ ++ if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour ++ || bfd_get_flavour (obfd) != bfd_target_elf_flavour) ++ return TRUE; ++ ++ if (bfd_little_endian (ibfd) != bfd_little_endian (obfd)) ++ { ++ (*_bfd_error_handler) ++ (_("%B: warning: Endian mismatch with previous modules."), ibfd); ++ ++ bfd_set_error (bfd_error_bad_value); ++ return FALSE; ++ } ++ ++ /* [Bug 11585] [Ticket 7067] -B option in objcopy cannot work as expected. ++ e_flags = 0 shall be treat as generic one. ++ no checking, and no merging. ++ */ ++ if (elf_elfheader (ibfd)->e_flags) ++ { ++ in_version = elf_elfheader (ibfd)->e_flags & EF_NDS32_ELF_VERSION; ++ if (in_version == E_NDS32_ELF_VER_1_2) ++ { ++ (*_bfd_error_handler) ++ (_("%B: warning: Older version of object file encountered, " ++ "Please recompile with current tool chain."), ibfd); ++ } ++ ++ /* We may need to merge V1 and V2 arch object files to V2. */ ++ if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH) ++ != (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH)) ++ { ++ /* Need to convert version. */ ++ if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH) ++ == E_NDS_ARCH_STAR_RESERVED) ++ { ++ elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags; ++ } ++ else if ((elf_elfheader (obfd)->e_flags & EF_NDS_ARCH) ++ == E_NDS_ARCH_STAR_V0_9 ++ || (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH) ++ > (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH)) ++ { ++ elf_elfheader (obfd)->e_flags = ++ convert_e_flags (elf_elfheader (obfd)->e_flags, ++ (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)); ++ } ++ else ++ { ++ elf_elfheader (ibfd)->e_flags = ++ convert_e_flags (elf_elfheader (ibfd)->e_flags, ++ (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH)); ++ } ++ } ++ ++ /* Extract some flags. */ ++ in_flags = elf_elfheader (ibfd)->e_flags ++ & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION ++ | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF)); ++ ++ /* The following flags need special treatment. */ ++ in_16regs = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_REDUCED_REGS; ++ in_no_mac = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_NO_MAC_INST; ++ in_fpu_config = elf_elfheader (ibfd)->e_flags & E_NDS32_FPU_REG_CONF; ++ ++ /* Extract some flags. */ ++ out_flags = elf_elfheader (obfd)->e_flags ++ & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION ++ | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF)); ++ ++ /* The following flags need special treatment. */ ++ out_16regs = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_REDUCED_REGS; ++ out_no_mac = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_NO_MAC_INST; ++ out_fpu_config = elf_elfheader (obfd)->e_flags & E_NDS32_FPU_REG_CONF; ++ out_version = elf_elfheader (obfd)->e_flags & EF_NDS32_ELF_VERSION; ++ if (!elf_flags_init (obfd)) ++ { ++ /* If the input is the default architecture then do not ++ bother setting the flags for the output architecture, ++ instead allow future merges to do this. If no future ++ merges ever set these flags then they will retain their ++ unitialised values, which surprise surprise, correspond ++ to the default values. */ ++ if (bfd_get_arch_info (ibfd)->the_default) ++ return TRUE; ++ ++ elf_flags_init (obfd) = TRUE; ++ elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags; ++ ++ if (bfd_get_arch (obfd) == bfd_get_arch (ibfd) ++ && bfd_get_arch_info (obfd)->the_default) ++ { ++ return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), ++ bfd_get_mach (ibfd)); ++ } ++ ++ return TRUE; ++ } ++ ++ /* Check flag compatibility. */ ++ if ((in_flags & EF_NDS_ABI) != (out_flags & EF_NDS_ABI)) ++ { ++ (*_bfd_error_handler) ++ (_("%B: error: ABI mismatch with previous modules."), ibfd); ++ ++ bfd_set_error (bfd_error_bad_value); ++ return FALSE; ++ } ++ ++ if ((in_flags & EF_NDS_ARCH) != (out_flags & EF_NDS_ARCH)) ++ { ++ if (((in_flags & EF_NDS_ARCH) != E_N1_ARCH)) ++ { ++ (*_bfd_error_handler) ++ (_("%B: error: Instruction set mismatch with previous modules."), ibfd); ++ ++ bfd_set_error (bfd_error_bad_value); ++ return FALSE; ++ } ++ } ++ ++ /* When linking with V1.2 and V1.3 objects together the output is V1.2. ++ and perf ext1 and DIV are mergerd to perf ext1. */ ++ if (in_version == E_NDS32_ELF_VER_1_2 || out_version == E_NDS32_ELF_VER_1_2) ++ { ++ elf_elfheader (obfd)->e_flags = ++ (in_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST))) ++ | (out_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST))) ++ | (((in_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST))) ++ ? E_NDS32_HAS_EXT_INST : 0) ++ | (((out_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST))) ++ ? E_NDS32_HAS_EXT_INST : 0) ++ | (in_16regs & out_16regs) | (in_no_mac & out_no_mac) ++ | ((in_version > out_version) ? out_version : in_version); ++ } ++ else ++ { ++ if (in_version != out_version) ++ (*_bfd_error_handler) ( ++ _("%B: warning: Incompatible elf-versions %s and %s."), ibfd, ++ nds32_elfver_strtab[out_version], ++ nds32_elfver_strtab[in_version]); ++ ++ elf_elfheader (obfd)->e_flags = in_flags | out_flags ++ | (in_16regs & out_16regs) | (in_no_mac & out_no_mac) ++ | (in_fpu_config > out_fpu_config ? in_fpu_config : out_fpu_config) ++ | (in_version > out_version ? out_version : in_version); ++ } ++ } ++ return TRUE; ++} ++ ++/* Display the flags field. */ ++ ++static bfd_boolean ++nds32_elf_print_private_bfd_data (bfd *abfd, void *ptr) ++{ ++ FILE *file = (FILE *) ptr; ++ ++ BFD_ASSERT (abfd != NULL && ptr != NULL); ++ ++ _bfd_elf_print_private_bfd_data (abfd, ptr); ++ ++ fprintf (file, _("private flags = %lx"), elf_elfheader (abfd)->e_flags); ++ ++ switch (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH) ++ { ++ default: ++ case E_N1_ARCH: ++ fprintf (file, _(": n1 instructions")); ++ break; ++ case E_N1H_ARCH: ++ fprintf (file, _(": n1h instructions")); ++ break; ++ } ++ ++ fputc ('\n', file); ++ ++ return TRUE; ++} ++ ++static unsigned int ++nds32_elf_action_discarded (asection *sec) ++{ ++ ++ if (strncmp ++ (".gcc_except_table", sec->name, sizeof (".gcc_except_table") - 1) == 0) ++ return 0; ++ ++ return _bfd_elf_default_action_discarded (sec); ++} ++ ++static asection * ++nds32_elf_gc_mark_hook (asection *sec, struct bfd_link_info *info, ++ Elf_Internal_Rela *rel, struct elf_link_hash_entry *h, ++ Elf_Internal_Sym *sym) ++{ ++ if (h != NULL) ++ switch (ELF32_R_TYPE (rel->r_info)) ++ { ++ case R_NDS32_GNU_VTINHERIT: ++ case R_NDS32_GNU_VTENTRY: ++ case R_NDS32_RELA_GNU_VTINHERIT: ++ case R_NDS32_RELA_GNU_VTENTRY: ++ return NULL; ++ } ++ ++ return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); ++} ++ ++static bfd_boolean ++nds32_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, asection *sec, ++ const Elf_Internal_Rela *relocs) ++{ ++ /* Update the got entry reference counts for the section being removed. */ ++ Elf_Internal_Shdr *symtab_hdr; ++ struct elf_link_hash_entry **sym_hashes; ++ bfd_signed_vma *local_got_refcounts; ++ const Elf_Internal_Rela *rel, *relend; ++ ++ elf_section_data (sec)->local_dynrel = NULL; ++ ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ sym_hashes = elf_sym_hashes (abfd); ++ local_got_refcounts = elf_local_got_refcounts (abfd); ++ ++ relend = relocs + sec->reloc_count; ++ for (rel = relocs; rel < relend; rel++) ++ { ++ unsigned long r_symndx; ++ struct elf_link_hash_entry *h = NULL; ++ ++ r_symndx = ELF32_R_SYM (rel->r_info); ++ if (r_symndx >= symtab_hdr->sh_info) ++ { ++ /* External symbol. */ ++ 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; ++ } ++ ++ switch (ELF32_R_TYPE (rel->r_info)) ++ { ++ case R_NDS32_GOT_HI20: ++ case R_NDS32_GOT_LO12: ++ case R_NDS32_GOT_LO15: ++ case R_NDS32_GOT_LO19: ++ case R_NDS32_GOT17S2_RELA: ++ case R_NDS32_GOT15S2_RELA: ++ case R_NDS32_GOTOFF: ++ case R_NDS32_GOTOFF_HI20: ++ case R_NDS32_GOTOFF_LO12: ++ case R_NDS32_GOTOFF_LO15: ++ case R_NDS32_GOTOFF_LO19: ++ case R_NDS32_GOT20: ++ case R_NDS32_GOTPC_HI20: ++ case R_NDS32_GOTPC_LO12: ++ case R_NDS32_GOTPC20: ++ if (h != NULL) ++ { ++ if (h->got.refcount > 0) ++ h->got.refcount--; ++ } ++ else ++ { ++ if (local_got_refcounts && local_got_refcounts[r_symndx] > 0) ++ local_got_refcounts[r_symndx]--; ++ } ++ break; ++ ++ case R_NDS32_16_RELA: ++ case R_NDS32_20_RELA: ++ case R_NDS32_5_RELA: ++ case R_NDS32_32_RELA: ++ case R_NDS32_HI20_RELA: ++ case R_NDS32_LO12S3_RELA: ++ case R_NDS32_LO12S2_RELA: ++ case R_NDS32_LO12S2_DP_RELA: ++ case R_NDS32_LO12S2_SP_RELA: ++ case R_NDS32_LO12S1_RELA: ++ case R_NDS32_LO12S0_RELA: ++ case R_NDS32_LO12S0_ORI_RELA: ++ case R_NDS32_SDA16S3_RELA: ++ case R_NDS32_SDA17S2_RELA: ++ case R_NDS32_SDA18S1_RELA: ++ case R_NDS32_SDA19S0_RELA: ++ case R_NDS32_SDA15S3_RELA: ++ case R_NDS32_SDA15S2_RELA: ++ case R_NDS32_SDA12S2_DP_RELA: ++ case R_NDS32_SDA12S2_SP_RELA: ++ case R_NDS32_SDA15S1_RELA: ++ case R_NDS32_SDA15S0_RELA: ++ case R_NDS32_SDA_FP7U2_RELA: ++ case R_NDS32_15_PCREL_RELA: ++ case R_NDS32_17_PCREL_RELA: ++ case R_NDS32_25_PCREL_RELA: ++ if (h != NULL) ++ { ++ struct elf_nds32_link_hash_entry *eh; ++ struct elf_nds32_dyn_relocs **pp; ++ struct elf_nds32_dyn_relocs *p; ++ ++ if (!info->shared && h->plt.refcount > 0) ++ h->plt.refcount -= 1; ++ ++ eh = (struct elf_nds32_link_hash_entry *) h; ++ ++ for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next) ++ if (p->sec == sec) ++ { ++ if (ELF32_R_TYPE (rel->r_info) == R_NDS32_15_PCREL_RELA ++ || ELF32_R_TYPE (rel->r_info) == R_NDS32_17_PCREL_RELA ++ || ELF32_R_TYPE (rel->r_info) == R_NDS32_25_PCREL_RELA) ++ p->pc_count -= 1; ++ p->count -= 1; ++ if (p->count == 0) ++ *pp = p->next; ++ break; ++ } ++ } ++ break; ++ ++ case R_NDS32_9_PLTREL: ++ case R_NDS32_25_PLTREL: ++ if (h != NULL) ++ { ++ if (h->plt.refcount > 0) ++ h->plt.refcount--; ++ } ++ break; ++ ++ default: ++ break; ++ } ++ } ++ ++ return TRUE; ++} ++ ++static enum elf_nds32_tls_type ++get_tls_type (enum elf_nds32_reloc_type r_type, ++ struct elf_link_hash_entry *h ATTRIBUTE_UNUSED) ++{ ++ enum elf_nds32_tls_type tls_type; ++ switch (r_type) ++ { ++ case R_NDS32_TLS_LE_HI20: ++ case R_NDS32_TLS_LE_LO12: ++ tls_type = GOT_TLS_LE; ++ break; ++ case R_NDS32_TLS_IE_HI20: ++ case R_NDS32_TLS_IE_LO12S2: ++ case R_NDS32_TLS_IE_LO12: ++ tls_type = GOT_TLS_IE; ++ break; ++ case R_NDS32_TLS_IEGP_HI20: ++ case R_NDS32_TLS_IEGP_LO12: ++ case R_NDS32_TLS_IEGP_LO12S2: ++ tls_type = GOT_TLS_IEGP; ++ break; ++ case R_NDS32_TLS_DESC_HI20: ++ case R_NDS32_TLS_DESC_LO12: ++ case R_NDS32_TLS_DESC_ADD: ++ case R_NDS32_TLS_DESC_FUNC: ++ case R_NDS32_TLS_DESC_CALL: ++ tls_type = GOT_TLS_DESC; ++ break; ++ default: ++ tls_type = GOT_NORMAL; ++ break; ++ } ++ return tls_type; ++} ++ ++/* Ensure that we have allocated bookkeeping structures for ABFD's local ++ symbols. */ ++ ++static bfd_boolean ++elf32_nds32_allocate_local_sym_info (bfd *abfd) ++{ ++ if (elf_local_got_refcounts (abfd) == NULL) ++ { ++ bfd_size_type num_syms; ++ bfd_size_type size; ++ char *data; ++ ++ num_syms = elf_tdata (abfd)->symtab_hdr.sh_info; ++ /* This space is for got_refcounts, got_tls_type, tlsdesc_gotent, and ++ gp_offset. The details can refer to struct elf_nds32_obj_tdata. */ ++ size = num_syms * (sizeof (bfd_signed_vma) + sizeof (char) ++ + sizeof (bfd_vma) + sizeof (int) ++ + sizeof (bfd_boolean) + sizeof (bfd_vma)); ++ data = bfd_zalloc (abfd, size); ++ if (data == NULL) ++ return FALSE; ++ ++ elf_local_got_refcounts (abfd) = (bfd_signed_vma *) data; ++ data += num_syms * sizeof (bfd_signed_vma); ++ ++ elf32_nds32_local_got_tls_type (abfd) = (char *) data; ++ data += num_syms * sizeof (char); ++ ++ elf32_nds32_local_tlsdesc_gotent (abfd) = (bfd_vma *) data; ++ data += num_syms * sizeof (bfd_vma); ++ ++ elf32_nds32_local_gp_offset (abfd) = (int *) data; ++ data += num_syms * sizeof (int); ++ } ++ ++ return TRUE; ++} ++ ++/* Look through the relocs for a section during the first phase. ++ Since we don't do .gots or .plts, we just need to consider the ++ virtual table relocs for gc. */ ++ ++static bfd_boolean ++nds32_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, ++ asection *sec, const Elf_Internal_Rela *relocs) ++{ ++ Elf_Internal_Shdr *symtab_hdr; ++ struct elf_link_hash_entry **sym_hashes, **sym_hashes_end; ++ const Elf_Internal_Rela *rel; ++ const Elf_Internal_Rela *rel_end; ++ struct elf_link_hash_table *ehtab; ++ struct elf_nds32_link_hash_table *htab; ++ bfd *dynobj; ++ asection *sreloc = NULL; ++ ++ /* No need for relocation if relocatable already. */ ++ if (info->relocatable) ++ { ++ elf32_nds32_check_relax_group (abfd, sec); ++ return TRUE; ++ } ++ ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ sym_hashes = elf_sym_hashes (abfd); ++ sym_hashes_end = ++ sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym); ++ if (!elf_bad_symtab (abfd)) ++ sym_hashes_end -= symtab_hdr->sh_info; ++ ++ ehtab = elf_hash_table (info); ++ htab = nds32_elf_hash_table (info); ++ dynobj = htab->root.dynobj; ++ ++ rel_end = relocs + sec->reloc_count; ++ for (rel = relocs; rel < rel_end; rel++) ++ { ++ enum elf_nds32_reloc_type r_type; ++ struct elf_link_hash_entry *h; ++ unsigned long r_symndx; ++ enum elf_nds32_tls_type tls_type, old_tls_type; ++ struct elf_nds32_ict_hash_entry *entry; ++ ++ r_symndx = ELF32_R_SYM (rel->r_info); ++ r_type = ELF32_R_TYPE (rel->r_info); ++ if (r_symndx < symtab_hdr->sh_info) ++ h = NULL; ++ 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; ++ } ++ ++ /* create .got section if necessary ++ Some relocs require a global offset table. We create ++ got section here, since these relocation need a got section ++ and if it is not created yet. */ ++ if (ehtab->sgot == NULL) ++ { ++ switch (r_type) ++ { ++ case R_NDS32_GOT_HI20: ++ case R_NDS32_GOT_LO12: ++ case R_NDS32_GOT_LO15: ++ case R_NDS32_GOT_LO19: ++ case R_NDS32_GOT17S2_RELA: ++ case R_NDS32_GOT15S2_RELA: ++ case R_NDS32_GOTOFF: ++ case R_NDS32_GOTOFF_HI20: ++ case R_NDS32_GOTOFF_LO12: ++ case R_NDS32_GOTOFF_LO15: ++ case R_NDS32_GOTOFF_LO19: ++ case R_NDS32_GOTPC20: ++ case R_NDS32_GOTPC_HI20: ++ case R_NDS32_GOTPC_LO12: ++ case R_NDS32_GOT20: ++ case R_NDS32_TLS_IE_HI20: ++ case R_NDS32_TLS_IE_LO12: ++ case R_NDS32_TLS_IE_LO12S2: ++ case R_NDS32_TLS_IEGP_HI20: ++ case R_NDS32_TLS_IEGP_LO12: ++ case R_NDS32_TLS_IEGP_LO12S2: ++ case R_NDS32_TLS_DESC_HI20: ++ case R_NDS32_TLS_DESC_LO12: ++ if (dynobj == NULL) ++ htab->root.dynobj = dynobj = abfd; ++ if (!create_got_section (dynobj, info)) ++ return FALSE; ++ break; ++ ++ default: ++ break; ++ } ++ } ++ ++ /* Check relocation type. */ ++ switch ((int) r_type) ++ { ++ case R_NDS32_TLS_LE_HI20: ++ case R_NDS32_TLS_LE_LO12: ++ case R_NDS32_GOT_HI20: ++ case R_NDS32_GOT_LO12: ++ case R_NDS32_GOT_LO15: ++ case R_NDS32_GOT_LO19: ++ case R_NDS32_GOT20: ++ case R_NDS32_TLS_IE_HI20: ++ case R_NDS32_TLS_IE_LO12: ++ case R_NDS32_TLS_IE_LO12S2: ++ case R_NDS32_TLS_IEGP_HI20: ++ case R_NDS32_TLS_IEGP_LO12: ++ case R_NDS32_TLS_IEGP_LO12S2: ++ case R_NDS32_TLS_DESC_HI20: ++ case R_NDS32_TLS_DESC_LO12: ++ tls_type = get_tls_type (r_type, h); ++ if (h) ++ { ++ if (tls_type != GOT_TLS_LE) ++ h->got.refcount += 1; ++ old_tls_type = elf32_nds32_hash_entry (h)->tls_type; ++ } ++ else ++ { ++ /* This is a global offset table entry for a local symbol. */ ++ if (!elf32_nds32_allocate_local_sym_info (abfd)) ++ return FALSE; ++ ++ BFD_ASSERT (r_symndx < symtab_hdr->sh_info); ++ if (tls_type != GOT_TLS_LE) ++ elf_local_got_refcounts (abfd)[r_symndx] += 1; ++ old_tls_type = elf32_nds32_local_got_tls_type (abfd)[r_symndx]; ++ } ++ ++ /* We would already issued an error message if there ++ is a TLS/non-TLS mismatch, based on the symbol ++ type. So just combine any TLS types needed. */ ++ if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL ++ && tls_type != GOT_NORMAL) ++ tls_type |= old_tls_type; ++ ++ /* DESC to IE/IEGP if link to executable */ ++ if ((tls_type & GOT_TLS_DESC) && (info->executable)) ++ tls_type |= (info->pie ? GOT_TLS_IEGP : GOT_TLS_IE); ++ ++ if (old_tls_type != tls_type) ++ { ++ if (h != NULL) ++ elf32_nds32_hash_entry (h)->tls_type = tls_type; ++ else ++ elf32_nds32_local_got_tls_type (abfd)[r_symndx] = tls_type; ++ } ++ break; ++ ++ case R_NDS32_9_PLTREL: ++ case R_NDS32_25_PLTREL: ++ case R_NDS32_PLTREL_HI20: ++ case R_NDS32_PLTREL_LO12: ++ case R_NDS32_PLT_GOTREL_HI20: ++ case R_NDS32_PLT_GOTREL_LO12: ++ case R_NDS32_PLT_GOTREL_LO15: ++ case R_NDS32_PLT_GOTREL_LO19: ++ case R_NDS32_PLT_GOTREL_LO20: ++ /* 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 this is a local symbol, we resolve it directly without ++ creating a procedure linkage table entry. */ ++ /* explain: continue v.s. break here following: */ ++ if (h == NULL) ++ continue; ++ ++ if (h->forced_local ++ || (info->pie && h->def_regular)) ++ break; ++ ++ elf32_nds32_hash_entry (h)->tls_type = GOT_NORMAL; ++ h->needs_plt = 1; ++ h->plt.refcount += 1; ++ break; ++ ++ case R_NDS32_16_RELA: ++ case R_NDS32_20_RELA: ++ case R_NDS32_5_RELA: ++ case R_NDS32_32_RELA: ++ case R_NDS32_HI20_RELA: ++ case R_NDS32_LO12S3_RELA: ++ case R_NDS32_LO12S2_RELA: ++ case R_NDS32_LO12S2_DP_RELA: ++ case R_NDS32_LO12S2_SP_RELA: ++ case R_NDS32_LO12S1_RELA: ++ case R_NDS32_LO12S0_RELA: ++ case R_NDS32_LO12S0_ORI_RELA: ++ case R_NDS32_SDA16S3_RELA: ++ case R_NDS32_SDA17S2_RELA: ++ case R_NDS32_SDA18S1_RELA: ++ case R_NDS32_SDA19S0_RELA: ++ case R_NDS32_SDA15S3_RELA: ++ case R_NDS32_SDA15S2_RELA: ++ case R_NDS32_SDA12S2_DP_RELA: ++ case R_NDS32_SDA12S2_SP_RELA: ++ case R_NDS32_SDA15S1_RELA: ++ case R_NDS32_SDA15S0_RELA: ++ case R_NDS32_SDA_FP7U2_RELA: ++ case R_NDS32_15_PCREL_RELA: ++ case R_NDS32_17_PCREL_RELA: ++ case R_NDS32_25_PCREL_RELA: ++ ++ if (h != NULL && !info->shared) ++ { ++ h->non_got_ref = 1; ++ h->plt.refcount += 1; ++ } ++ ++ /* If we are creating a shared library, and this is a reloc against ++ a global symbol, or a non PC relative reloc against a local ++ symbol, then we need to copy the reloc into the shared library. ++ However, if we are linking with -Bsymbolic, we do not need to ++ copy a reloc against a global symbol which is defined in an ++ object we are including in the link (i.e., DEF_REGULAR is set). ++ At this point we have not seen all the input files, so it is ++ possible that DEF_REGULAR is not set now but will be set later ++ (it is never cleared). We account for that possibility below by ++ storing information in the dyn_relocs field of the hash table ++ entry. A similar situation occurs when creating shared libraries ++ and symbol visibility changes render the symbol local. ++ ++ If on the other hand, we are creating an executable, we may need ++ to keep relocations for symbols satisfied by a dynamic library ++ if we manage to avoid copy relocs for the symbol. */ ++ if ((info->shared ++ && (sec->flags & SEC_ALLOC) != 0 ++ && ((r_type != R_NDS32_25_PCREL_RELA ++ && r_type != R_NDS32_15_PCREL_RELA ++ && r_type != R_NDS32_17_PCREL_RELA ++ && !(r_type == R_NDS32_32_RELA ++ && strcmp (sec->name, ".eh_frame") == 0)) ++ || (h != NULL ++ && (!info->symbolic ++ || h->root.type == bfd_link_hash_defweak ++ || !h->def_regular)))) ++ || (!info->shared ++ && (sec->flags & SEC_ALLOC) != 0 ++ && h != NULL ++ && (h->root.type == bfd_link_hash_defweak ++ || !h->def_regular))) ++ { ++ struct elf_nds32_dyn_relocs *p; ++ struct elf_nds32_dyn_relocs **head; ++ ++ if (dynobj == NULL) ++ htab->root.dynobj = dynobj = abfd; ++ ++ /* 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)->rela.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) ++ { ++ flagword flags; ++ ++ sreloc = bfd_make_section (dynobj, name); ++ flags = (SEC_HAS_CONTENTS | SEC_READONLY ++ | SEC_IN_MEMORY | SEC_LINKER_CREATED); ++ if ((sec->flags & SEC_ALLOC) != 0) ++ flags |= SEC_ALLOC | SEC_LOAD; ++ if (sreloc == NULL ++ || !bfd_set_section_flags (dynobj, sreloc, flags) ++ || !bfd_set_section_alignment (dynobj, sreloc, 2)) ++ return FALSE; ++ ++ elf_section_type (sreloc) = SHT_RELA; ++ } ++ elf_section_data (sec)->sreloc = sreloc; ++ } ++ ++ /* If this is a global symbol, we count the number of ++ relocations we need for this symbol. */ ++ if (h != NULL) ++ head = &((struct elf_nds32_link_hash_entry *) h)->dyn_relocs; ++ else ++ { ++ asection *s; ++ ++ Elf_Internal_Sym *isym; ++ isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx); ++ if (isym == NULL) ++ return FALSE; ++ ++ /* Track dynamic relocs needed for local syms too. */ ++ s = bfd_section_from_elf_index (abfd, isym->st_shndx); ++ if (s == NULL) ++ return FALSE; ++ ++ head = ((struct elf_nds32_dyn_relocs **) ++ &elf_section_data (s)->local_dynrel); ++ } ++ ++ p = *head; ++ if (p == NULL || p->sec != sec) ++ { ++ bfd_size_type amt = sizeof (*p); ++ p = (struct elf_nds32_dyn_relocs *) bfd_alloc (dynobj, amt); ++ if (p == NULL) ++ return FALSE; ++ p->next = *head; ++ *head = p; ++ p->sec = sec; ++ p->count = 0; ++ p->pc_count = 0; ++ } ++ ++ p->count += 1; ++ if (ELF32_R_TYPE (rel->r_info) == R_NDS32_25_PCREL_RELA ++ || ELF32_R_TYPE (rel->r_info) == R_NDS32_15_PCREL_RELA ++ || ELF32_R_TYPE (rel->r_info) == R_NDS32_17_PCREL_RELA) ++ p->pc_count += 1; ++ } ++ break; ++ ++ /* Merge jump-patch table symbol here. */ ++ case R_NDS32_ICT_HI20: ++ case R_NDS32_ICT_LO12: ++ case R_NDS32_ICT_25PC: ++ if (rel->r_addend != 0) ++ { ++ (*_bfd_error_handler) ++ (_("%B %s: Error: Rom-patch relocation offset: 0x%lx " ++ "with addend 0x%lx\n"), ++ abfd, sec->name, rel->r_offset, rel->r_addend); ++ bfd_set_error (bfd_error_bad_value); ++ return FALSE; ++ } ++ ++ if (h) ++ { ++ elf32_nds32_hash_entry (h)->indirect_call = TRUE; ++ entry = (struct elf_nds32_ict_hash_entry *) ++ bfd_hash_lookup (&indirect_call_table, h->root.root.string, ++ TRUE, TRUE); ++ entry->h = h; ++ if (entry == NULL) ++ { ++ (*_bfd_error_handler) ++ (_("%B: failed creating indirect call %s hash table\n"), ++ abfd, h->root.root.string); ++ bfd_set_error (bfd_error_bad_value); ++ return FALSE; ++ } ++ } ++ else ++ { ++ /* Rom-patch functions cannot be local. */ ++ (*_bfd_error_handler) ++ (_("%B: indirect call relocation with local symbol.\n"), abfd); ++ bfd_set_error (bfd_error_bad_value); ++ return FALSE; ++ } ++ break; ++ ++ /* This relocation describes the C++ object vtable hierarchy. ++ Reconstruct it for later use during GC. */ ++ case R_NDS32_RELA_GNU_VTINHERIT: ++ case R_NDS32_GNU_VTINHERIT: ++ if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) ++ return FALSE; ++ break; ++ ++ /* This relocation describes which C++ vtable entries are actually ++ used. Record for later use during GC. */ ++ case R_NDS32_GNU_VTENTRY: ++ if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset)) ++ return FALSE; ++ break; ++ case R_NDS32_RELA_GNU_VTENTRY: ++ if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) ++ return FALSE; ++ break; ++ } ++ } ++ ++ return TRUE; ++} ++ ++/* Write VAL in uleb128 format to P, returning a pointer to the ++ following byte. ++ This code is copied from elf-attr.c. */ ++ ++static bfd_byte * ++write_uleb128 (bfd_byte *p, unsigned int val) ++{ ++ bfd_byte c; ++ do ++ { ++ c = val & 0x7f; ++ val >>= 7; ++ if (val) ++ c |= 0x80; ++ *(p++) = c; ++ } ++ while (val); ++ return p; ++} ++ ++static bfd_signed_vma ++calculate_offset (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr) ++{ ++ bfd_signed_vma foff; ++ bfd_vma symval, addend; ++ asection *sym_sec; ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info) ++ { ++ Elf_Internal_Sym *isym; ++ ++ /* A local symbol. */ ++ isym = isymbuf + ELF32_R_SYM (irel->r_info); ++ ++ if (isym->st_shndx == SHN_UNDEF) ++ sym_sec = bfd_und_section_ptr; ++ else if (isym->st_shndx == SHN_ABS) ++ sym_sec = bfd_abs_section_ptr; ++ else if (isym->st_shndx == SHN_COMMON) ++ sym_sec = bfd_com_section_ptr; ++ else ++ sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx); ++ symval = isym->st_value + sym_sec->output_section->vma ++ + sym_sec->output_offset; ++ } ++ else ++ { ++ unsigned long indx; ++ struct elf_link_hash_entry *h; ++ ++ /* An external symbol. */ ++ indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info; ++ h = elf_sym_hashes (abfd)[indx]; ++ 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. */ ++ return 0; ++ ++ if (h->root.u.def.section->flags & SEC_MERGE) ++ { ++ sym_sec = h->root.u.def.section; ++ symval = _bfd_merged_section_offset (abfd, &sym_sec, ++ elf_section_data (sym_sec)->sec_info, ++ h->root.u.def.value); ++ symval = symval + sym_sec->output_section->vma ++ + sym_sec->output_offset; ++ } ++ else ++ symval = (h->root.u.def.value ++ + h->root.u.def.section->output_section->vma ++ + h->root.u.def.section->output_offset); ++ } ++ ++ addend = irel->r_addend; ++ ++ foff = (symval + addend ++ - (irel->r_offset + sec->output_section->vma + sec->output_offset)); ++ return foff; ++} ++ ++static bfd_vma ++calculate_plt_memory_address (bfd *abfd, struct bfd_link_info *link_info, ++ Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Rela *irel, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ bfd_vma symval; ++ ++ if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info) ++ { ++ Elf_Internal_Sym *isym; ++ asection *sym_sec; ++ /* A local symbol. */ ++ isym = isymbuf + ELF32_R_SYM (irel->r_info); ++ ++ if (isym->st_shndx == SHN_UNDEF) ++ sym_sec = bfd_und_section_ptr; ++ else if (isym->st_shndx == SHN_ABS) ++ sym_sec = bfd_abs_section_ptr; ++ else if (isym->st_shndx == SHN_COMMON) ++ sym_sec = bfd_com_section_ptr; ++ else ++ sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx); ++ symval = isym->st_value + sym_sec->output_section->vma ++ + sym_sec->output_offset; ++ } ++ else ++ { ++ unsigned long indx; ++ struct elf_link_hash_entry *h; ++ struct elf_link_hash_table *ehtab; ++ asection *splt; ++ ++ /* An external symbol. */ ++ indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info; ++ h = elf_sym_hashes (abfd)[indx]; ++ BFD_ASSERT (h != NULL); ++ ehtab = elf_hash_table (link_info); ++ splt = ehtab->splt; ++ ++ 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->plt.offset == (bfd_vma) - 1) ++ { ++ 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. */ ++ return 0; ++ symval = (h->root.u.def.value ++ + h->root.u.def.section->output_section->vma ++ + h->root.u.def.section->output_offset); ++ } ++ else ++ symval = splt->output_section->vma + h->plt.offset; ++ } ++ ++ return symval; ++} ++ ++static bfd_signed_vma ++calculate_plt_offset (bfd *abfd, asection *sec, struct bfd_link_info *link_info, ++ Elf_Internal_Sym *isymbuf, Elf_Internal_Rela *irel, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ bfd_vma foff; ++ if ((foff = calculate_plt_memory_address (abfd, link_info, isymbuf, irel, ++ symtab_hdr)) == 0) ++ return 0; ++ else ++ return foff - (irel->r_offset ++ + sec->output_section->vma + sec->output_offset); ++} ++ ++/* Convert a 32-bit instruction to 16-bit one. ++ INSN is the input 32-bit instruction, INSN16 is the output 16-bit ++ instruction. If INSN_TYPE is not NULL, it the CGEN instruction ++ type of INSN16. Return 1 if successful. */ ++ ++static int ++nds32_convert_32_to_16_alu1 (bfd *abfd, uint32_t insn, uint16_t *pinsn16, ++ int *pinsn_type) ++{ ++ uint16_t insn16 = 0; ++ int insn_type; ++ unsigned long mach = bfd_get_mach (abfd); ++ ++ if (N32_SH5 (insn) != 0) ++ return 0; ++ ++ switch (N32_SUB5 (insn)) ++ { ++ case N32_ALU1_ADD_SLLI: ++ case N32_ALU1_ADD_SRLI: ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn)) ++ { ++ insn16 = N16_TYPE333 (ADD333, N32_RT5 (insn), N32_RA5 (insn), ++ N32_RB5 (insn)); ++ insn_type = NDS32_INSN_ADD333; ++ } ++ else if (N32_IS_RT4 (insn)) ++ { ++ if (N32_RT5 (insn) == N32_RA5 (insn)) ++ insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RB5 (insn)); ++ else if (N32_RT5 (insn) == N32_RB5 (insn)) ++ insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RA5 (insn)); ++ insn_type = NDS32_INSN_ADD45; ++ } ++ break; ++ ++ case N32_ALU1_SUB_SLLI: ++ case N32_ALU1_SUB_SRLI: ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn)) ++ { ++ insn16 = N16_TYPE333 (SUB333, N32_RT5 (insn), N32_RA5 (insn), ++ N32_RB5 (insn)); ++ insn_type = NDS32_INSN_SUB333; ++ } ++ else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)) ++ { ++ insn16 = N16_TYPE45 (SUB45, N32_RT54 (insn), N32_RB5 (insn)); ++ insn_type = NDS32_INSN_SUB45; ++ } ++ break; ++ ++ case N32_ALU1_AND_SLLI: ++ case N32_ALU1_AND_SRLI: ++ /* and $rt, $rt, $rb -> and33 for v3, v3m. */ ++ if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn) ++ && N32_IS_RB3 (insn)) ++ { ++ if (N32_RT5 (insn) == N32_RA5 (insn)) ++ insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RB5 (insn)); ++ else if (N32_RT5 (insn) == N32_RB5 (insn)) ++ insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RA5 (insn)); ++ if (insn16) ++ insn_type = NDS32_INSN_AND33; ++ } ++ break; ++ ++ case N32_ALU1_XOR_SLLI: ++ case N32_ALU1_XOR_SRLI: ++ /* xor $rt, $rt, $rb -> xor33 for v3, v3m. */ ++ if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn) ++ && N32_IS_RB3 (insn)) ++ { ++ if (N32_RT5 (insn) == N32_RA5 (insn)) ++ insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RB5 (insn)); ++ else if (N32_RT5 (insn) == N32_RB5 (insn)) ++ insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RA5 (insn)); ++ if (insn16) ++ insn_type = NDS32_INSN_XOR33; ++ } ++ break; ++ ++ case N32_ALU1_OR_SLLI: ++ case N32_ALU1_OR_SRLI: ++ /* or $rt, $rt, $rb -> or33 for v3, v3m. */ ++ if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn) ++ && N32_IS_RB3 (insn)) ++ { ++ if (N32_RT5 (insn) == N32_RA5 (insn)) ++ insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RB5 (insn)); ++ else if (N32_RT5 (insn) == N32_RB5 (insn)) ++ insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RA5 (insn)); ++ if (insn16) ++ insn_type = NDS32_INSN_OR33; ++ } ++ break; ++ case N32_ALU1_NOR: ++ /* nor $rt, $ra, $ra -> not33 for v3, v3m. */ ++ if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RB3 (insn) ++ && N32_RA5 (insn) == N32_RB5 (insn)) ++ { ++ insn16 = N16_MISC33 (NOT33, N32_RT5 (insn), N32_RA5 (insn)); ++ insn_type = NDS32_INSN_NOT33; ++ } ++ break; ++ case N32_ALU1_SRAI: ++ if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)) ++ { ++ insn16 = N16_TYPE45 (SRAI45, N32_RT54 (insn), N32_UB5 (insn)); ++ insn_type = NDS32_INSN_SRAI45; ++ } ++ break; ++ ++ case N32_ALU1_SRLI: ++ if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)) ++ { ++ insn16 = N16_TYPE45 (SRLI45, N32_RT54 (insn), N32_UB5 (insn)); ++ insn_type = NDS32_INSN_SRLI45; ++ } ++ break; ++ ++ case N32_ALU1_SLLI: ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_UB5 (insn) < 8) ++ { ++ insn16 = N16_TYPE333 (SLLI333, N32_RT5 (insn), N32_RA5 (insn), ++ N32_UB5 (insn)); ++ insn_type = NDS32_INSN_SLLI333; ++ } ++ break; ++ ++ case N32_ALU1_ZEH: ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)) ++ { ++ insn16 = N16_BFMI333 (ZEH33, N32_RT5 (insn), N32_RA5 (insn)); ++ insn_type = NDS32_INSN_ZEH33; ++ } ++ break; ++ ++ case N32_ALU1_SEB: ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)) ++ { ++ insn16 = N16_BFMI333 (SEB33, N32_RT5 (insn), N32_RA5 (insn)); ++ insn_type = NDS32_INSN_SEB33; ++ } ++ break; ++ ++ case N32_ALU1_SEH: ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)) ++ { ++ insn16 = N16_BFMI333 (SEH33, N32_RT5 (insn), N32_RA5 (insn)); ++ insn_type = NDS32_INSN_SEH33; ++ } ++ break; ++ ++ case N32_ALU1_SLT: ++ if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)) ++ { ++ /* Implicit r15. */ ++ insn16 = N16_TYPE45 (SLT45, N32_RA54 (insn), N32_RB5 (insn)); ++ insn_type = NDS32_INSN_SLT45; ++ } ++ break; ++ ++ case N32_ALU1_SLTS: ++ if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)) ++ { ++ /* Implicit r15. */ ++ insn16 = N16_TYPE45 (SLTS45, N32_RA54 (insn), N32_RB5 (insn)); ++ insn_type = NDS32_INSN_SLTS45; ++ } ++ break; ++ } ++ ++ if ((insn16 & 0x8000) == 0) ++ return 0; ++ ++ if (pinsn16) ++ *pinsn16 = insn16; ++ if (pinsn_type) ++ *pinsn_type = insn_type; ++ return 1; ++} ++ ++static int ++nds32_convert_32_to_16_alu2 (bfd *abfd, uint32_t insn, uint16_t *pinsn16, ++ int *pinsn_type) ++{ ++ uint16_t insn16 = 0; ++ int insn_type; ++ unsigned long mach = bfd_get_mach (abfd); ++ ++ /* TODO: bset, bclr, btgl, btst. */ ++ if (__GF (insn, 6, 4) != 0) ++ return 0; ++ ++ switch (N32_IMMU (insn, 6)) ++ { ++ case N32_ALU2_MUL: ++ if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn) ++ && N32_IS_RB3 (insn)) ++ { ++ if (N32_RT5 (insn) == N32_RA5 (insn)) ++ insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RB5 (insn)); ++ else if (N32_RT5 (insn) == N32_RB5 (insn)) ++ insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RA5 (insn)); ++ if (insn16) ++ insn_type = NDS32_INSN_MUL33; ++ } ++ } ++ ++ if ((insn16 & 0x8000) == 0) ++ return 0; ++ ++ if (pinsn16) ++ *pinsn16 = insn16; ++ if (pinsn_type) ++ *pinsn_type = insn_type; ++ return 1; ++} ++ ++int ++nds32_convert_32_to_16 (bfd *abfd, uint32_t insn, uint16_t *pinsn16, ++ int *pinsn_type) ++{ ++ int op6; ++ uint16_t insn16 = 0; ++ int insn_type; ++ unsigned long mach = bfd_get_mach (abfd); ++ ++ /* Decode 32-bit instruction. */ ++ if (insn & 0x80000000) ++ { ++ /* Not 32-bit insn. */ ++ return 0; ++ } ++ ++ op6 = N32_OP6 (insn); ++ ++ /* Convert it to 16-bit instruction. */ ++ switch (op6) ++ { ++ case N32_OP6_MOVI: ++ if (IS_WITHIN_S (N32_IMM20S (insn), 5)) ++ { ++ insn16 = N16_TYPE55 (MOVI55, N32_RT5 (insn), N32_IMM20S (insn)); ++ insn_type = NDS32_INSN_MOVI55; ++ } ++ else if (mach >= MACH_V3 && N32_IMM20S (insn) >= 16 ++ && N32_IMM20S (insn) < 48 && N32_IS_RT4 (insn)) ++ { ++ insn16 = N16_TYPE45 (MOVPI45, N32_RT54 (insn), ++ N32_IMM20S (insn) - 16); ++ insn_type = NDS32_INSN_MOVPI45; ++ } ++ break; ++ ++ case N32_OP6_ADDI: ++ if (N32_IMM15S (insn) == 0) ++ { ++ /* Do not convert `addi $sp, $sp, 0' to `mov55 $sp, $sp', ++ because `mov55 $sp, $sp' is ifret16 in V3 ISA. */ ++ if (mach <= MACH_V2 ++ || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP) ++ { ++ insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn)); ++ insn_type = NDS32_INSN_MOV55; ++ } ++ } ++ else if (N32_IMM15S (insn) > 0) ++ { ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) < 8) ++ { ++ insn16 = N16_TYPE333 (ADDI333, N32_RT5 (insn), N32_RA5 (insn), ++ N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_ADDI333; ++ } ++ else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn) ++ && N32_IMM15S (insn) < 32) ++ { ++ insn16 = N16_TYPE45 (ADDI45, N32_RT54 (insn), N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_ADDI45; ++ } ++ else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP ++ && N32_RT5 (insn) == N32_RA5 (insn) ++ && N32_IMM15S (insn) < 512) ++ { ++ insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_ADDI10_SP; ++ } ++ else if (mach >= MACH_V3 && N32_IS_RT3 (insn) ++ && N32_RA5 (insn) == REG_SP && N32_IMM15S (insn) < 256 ++ && (N32_IMM15S (insn) % 4 == 0)) ++ { ++ insn16 = N16_TYPE36 (ADDRI36_SP, N32_RT5 (insn), ++ N32_IMM15S (insn) >> 2); ++ insn_type = NDS32_INSN_ADDRI36_SP; ++ } ++ } ++ else ++ { ++ /* Less than 0. */ ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) > -8) ++ { ++ insn16 = N16_TYPE333 (SUBI333, N32_RT5 (insn), N32_RA5 (insn), ++ 0 - N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_SUBI333; ++ } ++ else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn) ++ && N32_IMM15S (insn) > -32) ++ { ++ insn16 = N16_TYPE45 (SUBI45, N32_RT54 (insn), 0 - N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_SUBI45; ++ } ++ else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP ++ && N32_RT5 (insn) == N32_RA5 (insn) ++ && N32_IMM15S (insn) >= -512) ++ { ++ insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_ADDI10_SP; ++ } ++ } ++ break; ++ ++ case N32_OP6_ORI: ++ if (N32_IMM15S (insn) == 0) ++ { ++ /* Do not convert `ori $sp, $sp, 0' to `mov55 $sp, $sp', ++ because `mov55 $sp, $sp' is ifret16 in V3 ISA. */ ++ if (mach <= MACH_V2 ++ || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP) ++ { ++ insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn)); ++ insn_type = NDS32_INSN_MOV55; ++ } ++ } ++ break; ++ ++ case N32_OP6_SUBRI: ++ if (mach >= MACH_V3 && N32_IS_RT3 (insn) ++ && N32_IS_RA3 (insn) && N32_IMM15S (insn) == 0) ++ { ++ insn16 = N16_MISC33 (NEG33, N32_RT5 (insn), N32_RA5 (insn)); ++ insn_type = NDS32_INSN_NEG33; ++ } ++ break; ++ ++ case N32_OP6_ANDI: ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)) ++ { ++ if (N32_IMM15U (insn) == 1) ++ { ++ insn16 = N16_BFMI333 (XLSB33, N32_RT5 (insn), N32_RA5 (insn)); ++ insn_type = NDS32_INSN_XLSB33; ++ } ++ else if (N32_IMM15U (insn) == 0x7ff) ++ { ++ insn16 = N16_BFMI333 (X11B33, N32_RT5 (insn), N32_RA5 (insn)); ++ insn_type = NDS32_INSN_X11B33; ++ } ++ else if (N32_IMM15U (insn) == 0xff) ++ { ++ insn16 = N16_BFMI333 (ZEB33, N32_RT5 (insn), N32_RA5 (insn)); ++ insn_type = NDS32_INSN_ZEB33; ++ } ++ else if (mach >= MACH_V3 && N32_RT5 (insn) == N32_RA5 (insn) ++ && N32_IMM15U (insn) < 256) ++ { ++ int imm15u = N32_IMM15U (insn); ++ ++ if (__builtin_popcount (imm15u) == 1) ++ { ++ /* BMSKI33 */ ++ int imm3u = __builtin_ctz (imm15u); ++ ++ insn16 = N16_BFMI333 (BMSKI33, N32_RT5 (insn), imm3u); ++ insn_type = NDS32_INSN_BMSKI33; ++ } ++ else if (imm15u != 0 && __builtin_popcount (imm15u + 1) == 1) ++ { ++ /* FEXTI33 */ ++ int imm3u = __builtin_ctz (imm15u + 1) - 1; ++ ++ insn16 = N16_BFMI333 (FEXTI33, N32_RT5 (insn), imm3u); ++ insn_type = NDS32_INSN_FEXTI33; ++ } ++ } ++ } ++ break; ++ ++ case N32_OP6_SLTI: ++ if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn) ++ && IS_WITHIN_U (N32_IMM15S (insn), 5)) ++ { ++ insn16 = N16_TYPE45 (SLTI45, N32_RA54 (insn), N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_SLTI45; ++ } ++ break; ++ ++ case N32_OP6_SLTSI: ++ if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn) ++ && IS_WITHIN_U (N32_IMM15S (insn), 5)) ++ { ++ insn16 = N16_TYPE45 (SLTSI45, N32_RA54 (insn), N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_SLTSI45; ++ } ++ break; ++ ++ case N32_OP6_LWI: ++ if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0) ++ { ++ insn16 = N16_TYPE45 (LWI450, N32_RT54 (insn), N32_RA5 (insn)); ++ insn_type = NDS32_INSN_LWI450; ++ } ++ else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) ++ && IS_WITHIN_U (N32_IMM15S (insn), 3)) ++ { ++ insn16 = N16_TYPE333 (LWI333, N32_RT5 (insn), N32_RA5 (insn), ++ N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_LWI333; ++ } ++ else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP ++ && IS_WITHIN_U (N32_IMM15S (insn), 7)) ++ { ++ insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_LWI37; ++ } ++ else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP ++ && IS_WITHIN_U (N32_IMM15S (insn), 7)) ++ { ++ insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 0, N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_LWI37_SP; ++ } ++ else if (mach >= MACH_V2 && N32_IS_RT4 (insn) && N32_RA5 (insn) == REG_R8 ++ && -32 <= N32_IMM15S (insn) && N32_IMM15S (insn) < 0) ++ { ++ insn16 = N16_TYPE45 (LWI45_FE, N32_RT54 (insn), ++ N32_IMM15S (insn) + 32); ++ insn_type = NDS32_INSN_LWI45_FE; ++ } ++ break; ++ ++ case N32_OP6_SWI: ++ if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0) ++ { ++ insn16 = N16_TYPE45 (SWI450, N32_RT54 (insn), N32_RA5 (insn)); ++ insn_type = NDS32_INSN_SWI450; ++ } ++ else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) ++ && IS_WITHIN_U (N32_IMM15S (insn), 3)) ++ { ++ insn16 = N16_TYPE333 (SWI333, N32_RT5 (insn), N32_RA5 (insn), ++ N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_SWI333; ++ } ++ else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP ++ && IS_WITHIN_U (N32_IMM15S (insn), 7)) ++ { ++ insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_SWI37; ++ } ++ else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP ++ && IS_WITHIN_U (N32_IMM15S (insn), 7)) ++ { ++ insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 1, N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_SWI37_SP; ++ } ++ break; ++ ++ case N32_OP6_LWI_BI: ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) ++ && IS_WITHIN_U (N32_IMM15S (insn), 3)) ++ { ++ insn16 = N16_TYPE333 (LWI333_BI, N32_RT5 (insn), N32_RA5 (insn), ++ N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_LWI333_BI; ++ } ++ break; ++ ++ case N32_OP6_SWI_BI: ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) ++ && IS_WITHIN_U (N32_IMM15S (insn), 3)) ++ { ++ insn16 = N16_TYPE333 (SWI333_BI, N32_RT5 (insn), N32_RA5 (insn), ++ N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_SWI333_BI; ++ } ++ break; ++ ++ case N32_OP6_LHI: ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) ++ && IS_WITHIN_U (N32_IMM15S (insn), 3)) ++ { ++ insn16 = N16_TYPE333 (LHI333, N32_RT5 (insn), N32_RA5 (insn), ++ N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_LHI333; ++ } ++ break; ++ ++ case N32_OP6_SHI: ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) ++ && IS_WITHIN_U (N32_IMM15S (insn), 3)) ++ { ++ insn16 = N16_TYPE333 (SHI333, N32_RT5 (insn), N32_RA5 (insn), ++ N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_SHI333; ++ } ++ break; ++ ++ case N32_OP6_LBI: ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) ++ && IS_WITHIN_U (N32_IMM15S (insn), 3)) ++ { ++ insn16 = N16_TYPE333 (LBI333, N32_RT5 (insn), N32_RA5 (insn), ++ N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_LBI333; ++ } ++ break; ++ ++ case N32_OP6_SBI: ++ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) ++ && IS_WITHIN_U (N32_IMM15S (insn), 3)) ++ { ++ insn16 = N16_TYPE333 (SBI333, N32_RT5 (insn), N32_RA5 (insn), ++ N32_IMM15S (insn)); ++ insn_type = NDS32_INSN_SBI333; ++ } ++ break; ++ ++ case N32_OP6_ALU1: ++ return nds32_convert_32_to_16_alu1 (abfd, insn, pinsn16, pinsn_type); ++ ++ case N32_OP6_ALU2: ++ return nds32_convert_32_to_16_alu2 (abfd, insn, pinsn16, pinsn_type); ++ ++ case N32_OP6_BR1: ++ if (!IS_WITHIN_S (N32_IMM14S (insn), 8)) ++ goto done; ++ ++ if ((insn & __BIT (14)) == 0) ++ { ++ /* N32_BR1_BEQ */ ++ if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5 ++ && N32_RT5 (insn) != REG_R5) ++ insn16 = N16_TYPE38 (BEQS38, N32_RT5 (insn), N32_IMM14S (insn)); ++ else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5 ++ && N32_RA5 (insn) != REG_R5) ++ insn16 = N16_TYPE38 (BEQS38, N32_RA5 (insn), N32_IMM14S (insn)); ++ insn_type = NDS32_INSN_BEQS38; ++ break; ++ } ++ else ++ { ++ /* N32_BR1_BNE */ ++ if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5 ++ && N32_RT5 (insn) != REG_R5) ++ insn16 = N16_TYPE38 (BNES38, N32_RT5 (insn), N32_IMM14S (insn)); ++ else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5 ++ && N32_RA5 (insn) != REG_R5) ++ insn16 = N16_TYPE38 (BNES38, N32_RA5 (insn), N32_IMM14S (insn)); ++ insn_type = NDS32_INSN_BNES38; ++ break; ++ } ++ break; ++ ++ case N32_OP6_BR2: ++ switch (N32_BR2_SUB (insn)) ++ { ++ case N32_BR2_BEQZ: ++ if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8)) ++ { ++ insn16 = N16_TYPE38 (BEQZ38, N32_RT5 (insn), N32_IMM16S (insn)); ++ insn_type = NDS32_INSN_BEQZ38; ++ } ++ else if (N32_RT5 (insn) == REG_R15 && IS_WITHIN_S (N32_IMM16S (insn), 8)) ++ { ++ insn16 = N16_TYPE8 (BEQZS8, N32_IMM16S (insn)); ++ insn_type = NDS32_INSN_BEQZS8; ++ } ++ break; ++ ++ case N32_BR2_BNEZ: ++ if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8)) ++ { ++ insn16 = N16_TYPE38 (BNEZ38, N32_RT5 (insn), N32_IMM16S (insn)); ++ insn_type = NDS32_INSN_BNEZ38; ++ } ++ else if (N32_RT5 (insn) == REG_R15 && IS_WITHIN_S (N32_IMM16S (insn), 8)) ++ { ++ insn16 = N16_TYPE8 (BNEZS8, N32_IMM16S (insn)); ++ insn_type = NDS32_INSN_BNEZS8; ++ } ++ break; ++ ++ case N32_BR2_SOP0: ++ if (__GF (insn, 20, 5) == 0 && IS_WITHIN_U (N32_IMM16S (insn), 9)) ++ { ++ insn16 = N16_TYPE9 (IFCALL9, N32_IMM16S (insn)); ++ insn_type = NDS32_INSN_IFCALL9; ++ } ++ break; ++ } ++ break; ++ ++ case N32_OP6_JI: ++ if ((insn & __BIT (24)) == 0) ++ { ++ /* N32_JI_J */ ++ if (IS_WITHIN_S (N32_IMM24S (insn), 8)) ++ { ++ insn16 = N16_TYPE8 (J8, N32_IMM24S (insn)); ++ insn_type = NDS32_INSN_J8; ++ } ++ } ++ break; ++ ++ case N32_OP6_JREG: ++ if (__GF (insn, 8, 2) != 0) ++ goto done; ++ ++ switch (N32_IMMU (insn, 5)) ++ { ++ case N32_JREG_JR: ++ if (N32_JREG_HINT (insn) == 0) ++ { ++ /* jr */ ++ insn16 = N16_TYPE5 (JR5, N32_RB5 (insn)); ++ insn_type = NDS32_INSN_JR5; ++ } ++ else if (N32_JREG_HINT (insn) == 1) ++ { ++ /* ret */ ++ insn16 = N16_TYPE5 (RET5, N32_RB5 (insn)); ++ insn_type = NDS32_INSN_RET5; ++ } ++ else if (N32_JREG_HINT (insn) == 3) ++ { ++ /* ifret = mov55 $sp, $sp */ ++ insn16 = N16_TYPE55 (MOV55, REG_SP, REG_SP); ++ insn_type = NDS32_INSN_IFRET; ++ } ++ break; ++ ++ case N32_JREG_JRAL: ++ /* It's convertible when return rt5 is $lp and address ++ translation is kept. */ ++ if (N32_RT5 (insn) == REG_LP && N32_JREG_HINT (insn) == 0) ++ { ++ insn16 = N16_TYPE5 (JRAL5, N32_RB5 (insn)); ++ insn_type = NDS32_INSN_JRAL5; ++ } ++ break; ++ } ++ break; ++ ++ case N32_OP6_MISC: ++ if (N32_SUB5 (insn) == N32_MISC_BREAK && N32_SWID (insn) < 32) ++ { ++ /* For v3, swid above 31 are used for ex9.it. */ ++ insn16 = N16_TYPE5 (BREAK16, N32_SWID (insn)); ++ insn_type = NDS32_INSN_BREAK16; ++ } ++ break; ++ ++ default: ++ /* This instruction has no 16-bit variant. */ ++ goto done; ++ } ++ ++done: ++ /* Bit-15 of insn16 should be set for a valid instruction. */ ++ if ((insn16 & 0x8000) == 0) ++ return 0; ++ ++ if (pinsn16) ++ *pinsn16 = insn16; ++ if (pinsn_type) ++ *pinsn_type = insn_type; ++ return 1; ++} ++ ++static int ++special_convert_32_to_16 (unsigned long insn, uint16_t *pinsn16, ++ Elf_Internal_Rela *reloc) ++{ ++ uint16_t insn16 = 0; ++ ++ if ((reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG) == 0 ++ || (ELF32_R_TYPE (reloc->r_info) != R_NDS32_INSN16)) ++ return 0; ++ ++ if (!N32_IS_RT3 (insn)) ++ return 0; ++ ++ switch (N32_OP6 (insn)) ++ { ++ case N32_OP6_LWI: ++ if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7)) ++ insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn)); ++ break; ++ case N32_OP6_SWI: ++ if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7)) ++ insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn)); ++ break; ++ case N32_OP6_HWGP: ++ if (!IS_WITHIN_U (N32_IMM17S (insn), 7)) ++ break; ++ ++ if (__GF (insn, 17, 3) == 6) ++ insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM17S (insn)); ++ else if (__GF (insn, 17, 3) == 7) ++ insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM17S (insn)); ++ break; ++ } ++ ++ if ((insn16 & 0x8000) == 0) ++ return 0; ++ ++ *pinsn16 = insn16; ++ return 1; ++} ++ ++/* Convert a 16-bit instruction to 32-bit one. ++ INSN16 it the input and PINSN it the point to output. ++ Return non-zero on successful. Otherwise 0 is returned. */ ++ ++int ++nds32_convert_16_to_32 (bfd *abfd, uint16_t insn16, uint32_t *pinsn) ++{ ++ uint32_t insn = 0xffffffff; ++ unsigned long mach = bfd_get_mach (abfd); ++ ++ /* NOTE: push25, pop25 and movd44 do not have 32-bit variants. */ ++ ++ switch (__GF (insn16, 9, 6)) ++ { ++ case 0x4: /* add45 */ ++ insn = N32_ALU1 (ADD, N16_RT4 (insn16), N16_RT4 (insn16), N16_RA5 (insn16)); ++ goto done; ++ case 0x5: /* sub45 */ ++ insn = N32_ALU1 (SUB, N16_RT4 (insn16), N16_RT4 (insn16), N16_RA5 (insn16)); ++ goto done; ++ case 0x6: /* addi45 */ ++ insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16), N16_IMM5U (insn16)); ++ goto done; ++ case 0x7: /* subi45 */ ++ insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16), -N16_IMM5U (insn16)); ++ goto done; ++ case 0x8: /* srai45 */ ++ insn = N32_ALU1 (SRAI, N16_RT4 (insn16), N16_RT4 (insn16), N16_IMM5U (insn16)); ++ goto done; ++ case 0x9: /* srli45 */ ++ insn = N32_ALU1 (SRLI, N16_RT4 (insn16), N16_RT4 (insn16), N16_IMM5U (insn16)); ++ goto done; ++ ++ case 0xa: /* slli333 */ ++ insn = N32_ALU1 (SLLI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16)); ++ goto done; ++ case 0xc: /* add333 */ ++ insn = N32_ALU1 (ADD, N16_RT3 (insn16), N16_RA3 (insn16), N16_RB3 (insn16)); ++ goto done; ++ case 0xd: /* sub333 */ ++ insn = N32_ALU1 (SUB, N16_RT3 (insn16), N16_RA3 (insn16), N16_RB3 (insn16)); ++ goto done; ++ case 0xe: /* addi333 */ ++ insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16)); ++ goto done; ++ case 0xf: /* subi333 */ ++ insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16), -N16_IMM3U (insn16)); ++ goto done; ++ ++ case 0x10: /* lwi333 */ ++ insn = N32_TYPE2 (LWI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16)); ++ goto done; ++ case 0x12: /* lhi333 */ ++ insn = N32_TYPE2 (LHI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16)); ++ goto done; ++ case 0x13: /* lbi333 */ ++ insn = N32_TYPE2 (LBI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16)); ++ goto done; ++ case 0x11: /* lwi333.bi */ ++ insn = N32_TYPE2 (LWI_BI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16)); ++ goto done; ++ case 0x14: /* swi333 */ ++ insn = N32_TYPE2 (SWI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16)); ++ goto done; ++ case 0x16: /* shi333 */ ++ insn = N32_TYPE2 (SHI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16)); ++ goto done; ++ case 0x17: /* sbi333 */ ++ insn = N32_TYPE2 (SBI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16)); ++ goto done; ++ case 0x15: /* swi333.bi */ ++ insn = N32_TYPE2 (SWI_BI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16)); ++ goto done; ++ ++ case 0x18: /* addri36.sp */ ++ insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), REG_SP, N16_IMM6U (insn16) << 2); ++ goto done; ++ ++ case 0x19: /* lwi45.fe */ ++ insn = N32_TYPE2 (LWI, N16_RT4 (insn16), REG_R8, (N16_IMM5U (insn16) - 32)); ++ goto done; ++ case 0x1a: /* lwi450 */ ++ insn = N32_TYPE2 (LWI, N16_RT4 (insn16), N16_RA5 (insn16), 0); ++ goto done; ++ case 0x1b: /* swi450 */ ++ insn = N32_TYPE2 (SWI, N16_RT4 (insn16), N16_RA5 (insn16), 0); ++ goto done; ++ ++ /* These are r15 implied instructions. */ ++ case 0x30: /* slts45 */ ++ insn = N32_ALU1 (SLTS, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16)); ++ goto done; ++ case 0x31: /* slt45 */ ++ insn = N32_ALU1 (SLT, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16)); ++ goto done; ++ case 0x32: /* sltsi45 */ ++ insn = N32_TYPE2 (SLTSI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16)); ++ goto done; ++ case 0x33: /* slti45 */ ++ insn = N32_TYPE2 (SLTI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16)); ++ goto done; ++ case 0x34: /* beqzs8, bnezs8 */ ++ if (insn16 & __BIT (8)) ++ insn = N32_BR2 (BNEZ, REG_TA, N16_IMM8S (insn16)); ++ else ++ insn = N32_BR2 (BEQZ, REG_TA, N16_IMM8S (insn16)); ++ goto done; ++ ++ case 0x35: /* break16, ex9.it */ ++ /* Only consider range of v3 break16. */ ++ insn = N32_TYPE0 (MISC, (N16_IMM5U (insn16) << 5) | N32_MISC_BREAK); ++ goto done; ++ ++ case 0x3c: /* ifcall9 */ ++ insn = N32_BR2 (SOP0, 0, N16_IMM9U (insn16)); ++ goto done; ++ case 0x3d: /* movpi45 */ ++ insn = N32_TYPE1 (MOVI, N16_RT4 (insn16), N16_IMM5U (insn16) + 16); ++ goto done; ++ ++ case 0x3f: /* MISC33 */ ++ switch (insn16 & 0x7) ++ { ++ case 2: /* neg33 */ ++ insn = N32_TYPE2 (SUBRI, N16_RT3 (insn16), N16_RA3 (insn16), 0); ++ break; ++ case 3: /* not33 */ ++ insn = N32_ALU1 (NOR, N16_RT3 (insn16), N16_RA3 (insn16), N16_RA3 (insn16)); ++ break; ++ case 4: /* mul33 */ ++ insn = N32_ALU2 (MUL, N16_RT3 (insn16), N16_RT3 (insn16), N16_RA3 (insn16)); ++ break; ++ case 5: /* xor33 */ ++ insn = N32_ALU1 (XOR, N16_RT3 (insn16), N16_RT3 (insn16), N16_RA3 (insn16)); ++ break; ++ case 6: /* and33 */ ++ insn = N32_ALU1 (AND, N16_RT3 (insn16), N16_RT3 (insn16), N16_RA3 (insn16)); ++ break; ++ case 7: /* or33 */ ++ insn = N32_ALU1 (OR, N16_RT3 (insn16), N16_RT3 (insn16), N16_RA3 (insn16)); ++ break; ++ } ++ goto done; ++ ++ case 0xb: /* ... */ ++ switch (insn16 & 0x7) ++ { ++ case 0: /* zeb33 */ ++ insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0xff); ++ break; ++ case 1: /* zeh33 */ ++ insn = N32_ALU1 (ZEH, N16_RT3 (insn16), N16_RA3 (insn16), 0); ++ break; ++ case 2: /* seb33 */ ++ insn = N32_ALU1 (SEB, N16_RT3 (insn16), N16_RA3 (insn16), 0); ++ break; ++ case 3: /* seh33 */ ++ insn = N32_ALU1 (SEH, N16_RT3 (insn16), N16_RA3 (insn16), 0); ++ break; ++ case 4: /* xlsb33 */ ++ insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 1); ++ break; ++ case 5: /* x11b33 */ ++ insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0x7ff); ++ break; ++ case 6: /* bmski33 */ ++ insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16), ++ 1 << __GF (insn16, 3, 3)); ++ break; ++ case 7: /* fexti33 */ ++ insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16), ++ (1 << (__GF (insn16, 3, 3) + 1)) - 1); ++ break; ++ } ++ goto done; ++ } ++ ++ switch (__GF (insn16, 10, 5)) ++ { ++ case 0x0: /* mov55 or ifret16 */ ++ if (mach >= MACH_V3 && N16_RT5 (insn16) == REG_SP ++ && N16_RT5 (insn16) == N16_RA5 (insn16)) ++ insn = N32_JREG (JR, 0, 0, 0, 3); ++ else ++ insn = N32_TYPE2 (ADDI, N16_RT5 (insn16), N16_RA5 (insn16), 0); ++ goto done; ++ case 0x1: /* movi55 */ ++ insn = N32_TYPE1 (MOVI, N16_RT5 (insn16), N16_IMM5S (insn16)); ++ goto done; ++ case 0x1b: /* addi10s (V2) */ ++ insn = N32_TYPE2 (ADDI, REG_SP, REG_SP, N16_IMM10S (insn16)); ++ goto done; ++ } ++ ++ switch (__GF (insn16, 11, 4)) ++ { ++ case 0x7: /* lwi37.fp/swi37.fp */ ++ if (insn16 & __BIT (7)) /* swi37.fp */ ++ insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16)); ++ else /* lwi37.fp */ ++ insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16)); ++ goto done; ++ case 0x8: /* beqz38 */ ++ insn = N32_BR2 (BEQZ, N16_RT38 (insn16), N16_IMM8S (insn16)); ++ goto done; ++ case 0x9: /* bnez38 */ ++ insn = N32_BR2 (BNEZ, N16_RT38 (insn16), N16_IMM8S (insn16)); ++ goto done; ++ case 0xa: /* beqs38/j8, implied r5 */ ++ if (N16_RT38 (insn16) == 5) ++ insn = N32_JI (J, N16_IMM8S (insn16)); ++ else ++ insn = N32_BR1 (BEQ, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16)); ++ goto done; ++ case 0xb: /* bnes38 and others */ ++ if (N16_RT38 (insn16) == 5) ++ { ++ switch (__GF (insn16, 5, 3)) ++ { ++ case 0: /* jr5 */ ++ insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 0); ++ break; ++ case 4: /* ret5 */ ++ insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 1); ++ break; ++ case 1: /* jral5 */ ++ insn = N32_JREG (JRAL, REG_LP, N16_RA5 (insn16), 0, 0); ++ break; ++ case 2: /* ex9.it imm5 */ ++ /* ex9.it had no 32-bit variantl. */ ++ break; ++ case 5: /* add5.pc */ ++ /* add5.pc had no 32-bit variantl. */ ++ break; ++ } ++ } ++ else /* bnes38 */ ++ insn = N32_BR1 (BNE, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16)); ++ goto done; ++ case 0xe: /* lwi37/swi37 */ ++ if (insn16 & (1 << 7)) /* swi37.sp */ ++ insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16)); ++ else /* lwi37.sp */ ++ insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16)); ++ goto done; ++ } ++ ++done: ++ if (insn & 0x80000000) ++ return 0; ++ ++ if (pinsn) ++ *pinsn = insn; ++ return 1; ++} ++ ++static bfd_boolean ++is_sda_access_insn (unsigned long insn) ++{ ++ switch (N32_OP6 (insn)) ++ { ++ case N32_OP6_LWI: ++ case N32_OP6_LHI: ++ case N32_OP6_LHSI: ++ case N32_OP6_LBI: ++ case N32_OP6_LBSI: ++ case N32_OP6_SWI: ++ case N32_OP6_SHI: ++ case N32_OP6_SBI: ++ case N32_OP6_LWC: ++ case N32_OP6_LDC: ++ case N32_OP6_SWC: ++ case N32_OP6_SDC: ++ return TRUE; ++ default: ++ ; ++ } ++ return FALSE; ++} ++ ++static unsigned long ++turn_insn_to_sda_access (uint32_t insn, bfd_signed_vma type, uint32_t *pinsn) ++{ ++ uint32_t oinsn = 0; ++ ++ switch (type) ++ { ++ case R_NDS32_GOT_LO12: ++ case R_NDS32_GOTOFF_LO12: ++ case R_NDS32_PLTREL_LO12: ++ case R_NDS32_PLT_GOTREL_LO12: ++ case R_NDS32_LO12S0_RELA: ++ switch (N32_OP6 (insn)) ++ { ++ case N32_OP6_LBI: ++ /* lbi.gp */ ++ oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0); ++ break; ++ case N32_OP6_LBSI: ++ /* lbsi.gp */ ++ oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), __BIT (19)); ++ break; ++ case N32_OP6_SBI: ++ /* sbi.gp */ ++ oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0); ++ break; ++ case N32_OP6_ORI: ++ /* addi.gp */ ++ oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19)); ++ break; ++ } ++ break; ++ ++ case R_NDS32_LO12S1_RELA: ++ switch (N32_OP6 (insn)) ++ { ++ case N32_OP6_LHI: ++ /* lhi.gp */ ++ oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0); ++ break; ++ case N32_OP6_LHSI: ++ /* lhsi.gp */ ++ oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (18)); ++ break; ++ case N32_OP6_SHI: ++ /* shi.gp */ ++ oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (19)); ++ break; ++ } ++ break; ++ ++ case R_NDS32_LO12S2_RELA: ++ switch (N32_OP6 (insn)) ++ { ++ case N32_OP6_LWI: ++ /* lwi.gp */ ++ oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3)); ++ break; ++ case N32_OP6_SWI: ++ /* swi.gp */ ++ oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3)); ++ break; ++ } ++ break; ++ ++ case R_NDS32_LO12S2_DP_RELA: ++ case R_NDS32_LO12S2_SP_RELA: ++ oinsn = (insn & 0x7ff07000) | (REG_GP << 15); ++ break; ++ } ++ ++ if (oinsn) ++ *pinsn = oinsn; ++ ++ return oinsn != 0; ++} ++ ++/* Linker hasn't found the correct merge section for non-section symbol ++ in relax time, this work is left to the function elf_link_input_bfd(). ++ So for non-section symbol, _bfd_merged_section_offset is also needed ++ to find the correct symbol address. */ ++ ++static bfd_vma ++nds32_elf_rela_local_sym (bfd *abfd, Elf_Internal_Sym *sym, ++ asection **psec, Elf_Internal_Rela *rel) ++{ ++ asection *sec = *psec; ++ bfd_vma relocation; ++ ++ relocation = (sec->output_section->vma ++ + sec->output_offset + sym->st_value); ++ if ((sec->flags & SEC_MERGE) && sec->sec_info_type == SEC_INFO_TYPE_MERGE) ++ { ++ if (ELF_ST_TYPE (sym->st_info) == STT_SECTION) ++ rel->r_addend = ++ _bfd_merged_section_offset (abfd, psec, ++ elf_section_data (sec)->sec_info, ++ sym->st_value + rel->r_addend); ++ else ++ rel->r_addend = ++ _bfd_merged_section_offset (abfd, psec, ++ elf_section_data (sec)->sec_info, ++ sym->st_value) + rel->r_addend; ++ ++ if (sec != *psec) ++ { ++ /* If we have changed the section, and our original section is ++ marked with SEC_EXCLUDE, it means that the original ++ SEC_MERGE section has been completely subsumed in some ++ other SEC_MERGE section. In this case, we need to leave ++ some info around for --emit-relocs. */ ++ if ((sec->flags & SEC_EXCLUDE) != 0) ++ sec->kept_section = *psec; ++ sec = *psec; ++ } ++ rel->r_addend -= relocation; ++ rel->r_addend += sec->output_section->vma + sec->output_offset; ++ } ++ return relocation; ++} ++ ++static bfd_vma ++calculate_memory_address (bfd *abfd, Elf_Internal_Rela *irel, ++ Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ bfd_signed_vma foff; ++ bfd_vma symval, addend; ++ Elf_Internal_Rela irel_fn; ++ Elf_Internal_Sym *isym; ++ asection *sym_sec; ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info) ++ { ++ /* A local symbol. */ ++ isym = isymbuf + ELF32_R_SYM (irel->r_info); ++ ++ if (isym->st_shndx == SHN_UNDEF) ++ sym_sec = bfd_und_section_ptr; ++ else if (isym->st_shndx == SHN_ABS) ++ sym_sec = bfd_abs_section_ptr; ++ else if (isym->st_shndx == SHN_COMMON) ++ sym_sec = bfd_com_section_ptr; ++ else ++ sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx); ++ memcpy (&irel_fn, irel, sizeof (Elf_Internal_Rela)); ++ symval = nds32_elf_rela_local_sym (abfd, isym, &sym_sec, &irel_fn); ++ addend = irel_fn.r_addend; ++ } ++ else ++ { ++ unsigned long indx; ++ struct elf_link_hash_entry *h; ++ ++ /* An external symbol. */ ++ indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info; ++ h = elf_sym_hashes (abfd)[indx]; ++ BFD_ASSERT (h != NULL); ++ ++ 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) ++ /* This appears to be a reference to an undefined ++ symbol. Just ignore it--it will be caught by the ++ regular reloc processing. */ ++ return 0; ++ ++ if (h->root.u.def.section->flags & SEC_MERGE) ++ { ++ sym_sec = h->root.u.def.section; ++ symval = _bfd_merged_section_offset (abfd, &sym_sec, elf_section_data ++ (sym_sec)->sec_info, h->root.u.def.value); ++ symval = symval + sym_sec->output_section->vma ++ + sym_sec->output_offset; ++ } ++ else ++ symval = (h->root.u.def.value ++ + h->root.u.def.section->output_section->vma ++ + h->root.u.def.section->output_offset); ++ addend = irel->r_addend; ++ } ++ ++ foff = symval + addend; ++ ++ return foff; ++} ++ ++static bfd_vma ++calculate_got_memory_address (bfd *abfd, struct bfd_link_info *link_info, ++ Elf_Internal_Rela *irel, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ int symndx; ++ bfd_vma *local_got_offsets; ++ /* Get the value of the symbol referred to by the reloc. */ ++ struct elf_link_hash_entry *h; ++ struct elf_link_hash_table *ehtab = elf_hash_table (link_info); ++ ++ /* An external symbol. */ ++ symndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info; ++ h = elf_sym_hashes (abfd)[symndx]; ++ 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 (symndx >= 0) ++ { ++ BFD_ASSERT (h != NULL); ++ return ehtab->sgot->output_section->vma + ehtab->sgot->output_offset ++ + h->got.offset; ++ } ++ local_got_offsets = elf_local_got_offsets (abfd); ++ BFD_ASSERT (local_got_offsets != NULL); ++ return ehtab->sgot->output_section->vma + ehtab->sgot->output_offset ++ + local_got_offsets[ELF32_R_SYM (irel->r_info)]; ++ ++ /* The _GLOBAL_OFFSET_TABLE_ may be undefweak(or should be?). */ ++ /* The check of h->root.type is passed. */ ++} ++ ++static int ++is_16bit_NOP (bfd *abfd ATTRIBUTE_UNUSED, ++ asection *sec, Elf_Internal_Rela *rel) ++{ ++ bfd_byte *contents; ++ unsigned short insn16; ++ ++ if (!(rel->r_addend & R_NDS32_INSN16_CONVERT_FLAG)) ++ return FALSE; ++ contents = elf_section_data (sec)->this_hdr.contents; ++ insn16 = bfd_getb16 (contents + rel->r_offset); ++ if (insn16 == NDS32_NOP16) ++ return TRUE; ++ return FALSE; ++} ++ ++/* It checks whether the instruction could be converted to ++ 16-bit form and returns the converted one. ++ ++ `internal_relocs' is supposed to be sorted. */ ++ ++static int ++is_convert_32_to_16 (bfd *abfd, asection *sec, ++ Elf_Internal_Rela *reloc, ++ Elf_Internal_Rela *internal_relocs, ++ Elf_Internal_Rela *irelend, ++ uint16_t *insn16) ++{ ++#define NORMAL_32_TO_16 (1 << 0) ++#define SPECIAL_32_TO_16 (1 << 1) ++ bfd_byte *contents = NULL; ++ bfd_signed_vma off; ++ bfd_vma mem_addr; ++ uint32_t insn = 0; ++ Elf_Internal_Rela *pc_rel; ++ Elf_Internal_Shdr *symtab_hdr; ++ Elf_Internal_Sym *isymbuf = NULL; ++ int convert_type; ++ bfd_vma offset; ++ ++ if (reloc->r_offset + 4 > sec->size) ++ return FALSE; ++ ++ offset = reloc->r_offset; ++ ++ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)) ++ return FALSE; ++ insn = bfd_getb32 (contents + offset); ++ ++ if (nds32_convert_32_to_16 (abfd, insn, insn16, NULL)) ++ convert_type = NORMAL_32_TO_16; ++ else if (special_convert_32_to_16 (insn, insn16, reloc)) ++ convert_type = SPECIAL_32_TO_16; ++ else ++ return FALSE; ++ ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ if (!nds32_get_local_syms (abfd, sec, &isymbuf)) ++ return FALSE; ++ ++ /* Find the first relocation of the same relocation-type, ++ so we iteratie them forward. */ ++ pc_rel = reloc; ++ while ((pc_rel - 1) >= internal_relocs && pc_rel[-1].r_offset == offset) ++ pc_rel--; ++ ++ for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++) ++ { ++ if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA ++ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA ++ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA ++ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL) ++ { ++ off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr); ++ if (off >= ACCURATE_8BIT_S1 || off < -ACCURATE_8BIT_S1 ++ || off == 0) ++ return FALSE; ++ break; ++ } ++ else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA) ++ { ++ /* movi => movi55 */ ++ mem_addr = calculate_memory_address (abfd, pc_rel, isymbuf, symtab_hdr); ++ /* mem_addr is unsigned, but the value should be between [-16, 15]. */ ++ if ((mem_addr + 0x10) >> 5) ++ return FALSE; ++ break; ++ } ++ else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_20) ++ || (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_LO12)) ++ { ++ /* It never happen movi to movi55 for R_NDS32_TLS_LE_20, ++ because it can be relaxed to addi for TLS_LE_ADD. */ ++ return FALSE; ++ } ++ else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA ++ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA) ++ && (reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG) ++ && convert_type == SPECIAL_32_TO_16) ++ { ++ /* fp-as-gp ++ We've selected a best fp-base for this access, so we can ++ always resolve it anyway. Do nothing. */ ++ break; ++ } ++ else if ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_NONE ++ && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_RELA_GNU_VTINHERIT)) ++ || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_RELA_GNU_VTENTRY) ++ && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_INSN16)) ++ || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_LOADSTORE) ++ && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_DWARF2_OP1_RELA))) ++ { ++ /* Prevent unresolved addi instruction translate to addi45 or addi333. */ ++ return FALSE; ++ } ++ else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA)) ++ { ++ off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr); ++ if (off >= ACCURATE_U9BIT_S1 || off <= 0) ++ return FALSE; ++ break; ++ } ++ } ++ ++ return TRUE; ++} ++ ++static void ++nds32_elf_write_16 (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *contents, ++ Elf_Internal_Rela *reloc, ++ Elf_Internal_Rela *internal_relocs, ++ Elf_Internal_Rela *irelend, ++ unsigned short insn16) ++{ ++ Elf_Internal_Rela *pc_rel; ++ bfd_vma offset; ++ ++ offset = reloc->r_offset; ++ bfd_putb16 (insn16, contents + offset); ++ /* Find the first relocation of the same relocation-type, ++ so we iteratie them forward. */ ++ pc_rel = reloc; ++ while ((pc_rel - 1) > internal_relocs && pc_rel[-1].r_offset == offset) ++ pc_rel--; ++ ++ for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++) ++ { ++ if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA ++ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA ++ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA) ++ { ++ pc_rel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PCREL_RELA); ++ } ++ else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL) ++ pc_rel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PLTREL); ++ else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA) ++ pc_rel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_5_RELA); ++ else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA ++ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA) ++ pc_rel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_SDA_FP7U2_RELA); ++ else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA)) ++ pc_rel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_10IFCU_PCREL_RELA); ++ } ++} ++ ++/* Find a relocation of type specified by `reloc_type' ++ of the same r_offset with reloc. ++ If not found, return irelend. ++ ++ Assuming relocations are sorted by r_offset, ++ we find the relocation from `reloc' backward untill relocs, ++ or find it from `reloc' forward untill irelend. */ ++ ++static Elf_Internal_Rela * ++find_relocs_at_address (Elf_Internal_Rela *reloc, ++ Elf_Internal_Rela *relocs, ++ Elf_Internal_Rela *irelend, ++ enum elf_nds32_reloc_type reloc_type) ++{ ++ Elf_Internal_Rela *rel_t; ++ ++ /* Find backward. */ ++ for (rel_t = reloc; ++ rel_t >= relocs && rel_t->r_offset == reloc->r_offset; ++ rel_t--) ++ if (ELF32_R_TYPE (rel_t->r_info) == reloc_type) ++ return rel_t; ++ ++ /* We didn't find it backward. Try find it forward. */ ++ for (rel_t = reloc; ++ rel_t < irelend && rel_t->r_offset == reloc->r_offset; ++ rel_t++) ++ if (ELF32_R_TYPE (rel_t->r_info) == reloc_type) ++ return rel_t; ++ ++ return irelend; ++} ++ ++/* Find a relocation of specified type and offset. ++ `reloc' is just a refence point to find a relocation at specified offset. ++ If not found, return irelend. ++ ++ Assuming relocations are sorted by r_offset, ++ we find the relocation from `reloc' backward untill relocs, ++ or find it from `reloc' forward untill irelend. */ ++ ++static Elf_Internal_Rela * ++find_relocs_at_address_addr (Elf_Internal_Rela *reloc, ++ Elf_Internal_Rela *relocs, ++ Elf_Internal_Rela *irelend, ++ unsigned char reloc_type, ++ bfd_vma offset_p) ++{ ++ Elf_Internal_Rela *rel_t = NULL; ++ ++ /* First, we try to find a relocation of offset `offset_p', ++ and then we use find_relocs_at_address to find specific type. */ ++ ++ if (reloc->r_offset > offset_p) ++ { ++ /* Find backward. */ ++ for (rel_t = reloc; ++ rel_t >= relocs && rel_t->r_offset > offset_p; rel_t--) ++ /* Do nothing. */; ++ } ++ else if (reloc->r_offset < offset_p) ++ { ++ /* Find forward. */ ++ for (rel_t = reloc; ++ rel_t < irelend && rel_t->r_offset < offset_p; rel_t++) ++ /* Do nothing. */; ++ } ++ else ++ rel_t = reloc; ++ ++ /* Not found? */ ++ if (rel_t < relocs || rel_t == irelend || rel_t->r_offset != offset_p) ++ return irelend; ++ ++ return find_relocs_at_address (rel_t, relocs, irelend, reloc_type); ++} ++ ++static bfd_boolean ++nds32_elf_check_dup_relocs (Elf_Internal_Rela *reloc, ++ Elf_Internal_Rela *internal_relocs, ++ Elf_Internal_Rela *irelend, ++ unsigned char reloc_type) ++{ ++ Elf_Internal_Rela *rel_t; ++ ++ for (rel_t = reloc; ++ rel_t >= internal_relocs && rel_t->r_offset == reloc->r_offset; ++ rel_t--) ++ if (ELF32_R_TYPE (rel_t->r_info) == reloc_type) ++ { ++ if (ELF32_R_SYM (rel_t->r_info) == ELF32_R_SYM (reloc->r_info) ++ && rel_t->r_addend == reloc->r_addend) ++ continue; ++ return TRUE; ++ } ++ ++ for (rel_t = reloc; rel_t < irelend && rel_t->r_offset == reloc->r_offset; ++ rel_t++) ++ if (ELF32_R_TYPE (rel_t->r_info) == reloc_type) ++ { ++ if (ELF32_R_SYM (rel_t->r_info) == ELF32_R_SYM (reloc->r_info) ++ && rel_t->r_addend == reloc->r_addend) ++ continue; ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ ++typedef struct nds32_elf_blank nds32_elf_blank_t; ++struct nds32_elf_blank ++{ ++ /* Where the blank begins. */ ++ bfd_vma offset; ++ /* The size of the blank. */ ++ bfd_vma size; ++ /* The accumulative size before this blank. */ ++ bfd_vma total_size; ++ nds32_elf_blank_t *next; ++ nds32_elf_blank_t *prev; ++}; ++ ++static nds32_elf_blank_t *blank_free_list = NULL; ++ ++static nds32_elf_blank_t * ++create_nds32_elf_blank (bfd_vma offset_p, bfd_vma size_p) ++{ ++ nds32_elf_blank_t *blank_t; ++ ++ if (blank_free_list) ++ { ++ blank_t = blank_free_list; ++ blank_free_list = blank_free_list->next; ++ } ++ else ++ blank_t = bfd_malloc (sizeof (nds32_elf_blank_t)); ++ ++ if (blank_t == NULL) ++ return NULL; ++ ++ blank_t->offset = offset_p; ++ blank_t->size = size_p; ++ blank_t->total_size = 0; ++ blank_t->next = NULL; ++ blank_t->prev = NULL; ++ ++ return blank_t; ++} ++ ++static void ++remove_nds32_elf_blank (nds32_elf_blank_t *blank_p) ++{ ++ if (blank_free_list) ++ { ++ blank_free_list->prev = blank_p; ++ blank_p->next = blank_free_list; ++ } ++ else ++ blank_p->next = NULL; ++ ++ blank_p->prev = NULL; ++ blank_free_list = blank_p; ++} ++ ++static void ++clean_nds32_elf_blank (void) ++{ ++ nds32_elf_blank_t *blank_t; ++ ++ while (blank_free_list) ++ { ++ blank_t = blank_free_list; ++ blank_free_list = blank_free_list->next; ++ free (blank_t); ++ } ++} ++ ++static nds32_elf_blank_t * ++search_nds32_elf_blank (nds32_elf_blank_t *blank_p, bfd_vma addr) ++{ ++ nds32_elf_blank_t *blank_t; ++ ++ if (!blank_p) ++ return NULL; ++ blank_t = blank_p; ++ ++ while (blank_t && addr < blank_t->offset) ++ blank_t = blank_t->prev; ++ while (blank_t && blank_t->next && addr >= blank_t->next->offset) ++ blank_t = blank_t->next; ++ ++ return blank_t; ++} ++ ++static bfd_vma ++get_nds32_elf_blank_total (nds32_elf_blank_t **blank_p, bfd_vma addr, ++ int overwrite) ++{ ++ nds32_elf_blank_t *blank_t; ++ ++ blank_t = search_nds32_elf_blank (*blank_p, addr); ++ if (!blank_t) ++ return 0; ++ ++ if (overwrite) ++ *blank_p = blank_t; ++ ++ if (addr < blank_t->offset + blank_t->size) ++ return blank_t->total_size + (addr - blank_t->offset); ++ else ++ return blank_t->total_size + blank_t->size; ++} ++ ++static bfd_boolean ++insert_nds32_elf_blank (nds32_elf_blank_t **blank_p, bfd_vma addr, bfd_vma len) ++{ ++ nds32_elf_blank_t *blank_t, *blank_t2; ++ ++ if (!*blank_p) ++ { ++ *blank_p = create_nds32_elf_blank (addr, len); ++ return *blank_p ? TRUE : FALSE; ++ } ++ ++ blank_t = search_nds32_elf_blank (*blank_p, addr); ++ ++ if (blank_t == NULL) ++ { ++ blank_t = create_nds32_elf_blank (addr, len); ++ if (!blank_t) ++ return FALSE; ++ while ((*blank_p)->prev != NULL) ++ *blank_p = (*blank_p)->prev; ++ blank_t->next = *blank_p; ++ (*blank_p)->prev = blank_t; ++ (*blank_p) = blank_t; ++ return TRUE; ++ } ++ ++ if (addr < blank_t->offset + blank_t->size ++ && ((addr + len) > (blank_t->offset + blank_t->size))) ++ blank_t->size = addr + len - blank_t->offset - blank_t->size; ++ else ++ { ++ blank_t2 = create_nds32_elf_blank (addr, len); ++ if (!blank_t2) ++ return FALSE; ++ if (blank_t->next) ++ { ++ blank_t->next->prev = blank_t2; ++ blank_t2->next = blank_t->next; ++ } ++ blank_t2->prev = blank_t; ++ blank_t->next = blank_t2; ++ *blank_p = blank_t2; ++ } ++ ++ return TRUE; ++} ++ ++static bfd_boolean ++insert_nds32_elf_blank_recalc_total (nds32_elf_blank_t **blank_p, bfd_vma addr, ++ bfd_vma len) ++{ ++ nds32_elf_blank_t *blank_t; ++ ++ if (!insert_nds32_elf_blank (blank_p, addr, len)) ++ return FALSE; ++ ++ blank_t = *blank_p; ++ ++ if (!blank_t->prev) ++ { ++ blank_t->total_size = 0; ++ blank_t = blank_t->next; ++ } ++ ++ while (blank_t) ++ { ++ blank_t->total_size = blank_t->prev->total_size + blank_t->prev->size; ++ blank_t = blank_t->next; ++ } ++ ++ return TRUE; ++} ++ ++static void ++calc_nds32_blank_total (nds32_elf_blank_t *blank_p) ++{ ++ nds32_elf_blank_t *blank_t; ++ bfd_vma total_size = 0; ++ ++ if (!blank_p) ++ return; ++ ++ blank_t = blank_p; ++ while (blank_t->prev) ++ blank_t = blank_t->prev; ++ while (blank_t) ++ { ++ blank_t->total_size = total_size; ++ total_size += blank_t->size; ++ blank_t = blank_t->next; ++ } ++} ++ ++static bfd_boolean ++nds32_elf_relax_delete_blanks (bfd *abfd, asection *sec, ++ nds32_elf_blank_t *blank_p) ++{ ++ Elf_Internal_Shdr *symtab_hdr; /* Symbol table header of this bfd. */ ++ Elf_Internal_Sym *isym = NULL; /* Symbol table of this bfd. */ ++ Elf_Internal_Sym *isymend; /* Symbol entry iterator. */ ++ unsigned int sec_shndx; /* The section the be relaxed. */ ++ bfd_byte *contents; /* Contents data of iterating section. */ ++ Elf_Internal_Rela *internal_relocs; ++ Elf_Internal_Rela *irel; ++ Elf_Internal_Rela *irelend; ++ struct elf_link_hash_entry **sym_hashes; ++ struct elf_link_hash_entry **end_hashes; ++ unsigned int symcount; ++ asection *sect; ++ nds32_elf_blank_t *blank_t; ++ nds32_elf_blank_t *blank_t2; ++ nds32_elf_blank_t *blank_head; ++ ++ blank_head = blank_t = blank_p; ++ while (blank_head->prev != NULL) ++ blank_head = blank_head->prev; ++ while (blank_t->next != NULL) ++ blank_t = blank_t->next; ++ ++ if (blank_t->offset + blank_t->size <= sec->size) ++ { ++ blank_t->next = create_nds32_elf_blank (sec->size + 4, 0); ++ blank_t->next->prev = blank_t; ++ } ++ if (blank_head->offset > 0) ++ { ++ blank_head->prev = create_nds32_elf_blank (0, 0); ++ blank_head->prev->next = blank_head; ++ blank_head = blank_head->prev; ++ } ++ ++ sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); ++ ++ /* The deletion must stop at the next ALIGN reloc for an alignment ++ power larger than the number of bytes we are deleting. */ ++ ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ if (!nds32_get_local_syms (abfd, sec, &isym)) ++ return FALSE; ++ ++ if (isym == NULL) ++ { ++ isym = bfd_elf_get_elf_syms (abfd, symtab_hdr, ++ symtab_hdr->sh_info, 0, NULL, NULL, NULL); ++ symtab_hdr->contents = (bfd_byte *) isym; ++ } ++ ++ if (isym == NULL || symtab_hdr->sh_info == 0) ++ return FALSE; ++ ++ blank_t = blank_head; ++ calc_nds32_blank_total (blank_head); ++ ++ for (sect = abfd->sections; sect != NULL; sect = sect->next) ++ { ++ /* Adjust all the relocs. */ ++ ++ /* Relocations MUST be kept in memory, because relaxation adjust them. */ ++ internal_relocs = _bfd_elf_link_read_relocs (abfd, sect, NULL, NULL, ++ TRUE /* keep_memory */); ++ irelend = internal_relocs + sect->reloc_count; ++ ++ blank_t = blank_head; ++ blank_t2 = blank_head; ++ ++ if (!(sect->flags & SEC_RELOC)) ++ continue; ++ ++ nds32_get_section_contents (abfd, sect, &contents, TRUE); ++ ++ for (irel = internal_relocs; irel < irelend; irel++) ++ { ++ bfd_vma raddr; ++ ++ if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_DIFF8 ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_DIFF32 ++ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx) ++ { ++ unsigned long val = 0; ++ unsigned long mask; ++ long before, between; ++ long offset; ++ ++ switch (ELF32_R_TYPE (irel->r_info)) ++ { ++ case R_NDS32_DIFF8: ++ offset = bfd_get_8 (abfd, contents + irel->r_offset); ++ break; ++ case R_NDS32_DIFF16: ++ offset = bfd_get_16 (abfd, contents + irel->r_offset); ++ break; ++ case R_NDS32_DIFF32: ++ val = bfd_get_32 (abfd, contents + irel->r_offset); ++ /* Get the signed bit and mask for the high part. The ++ gcc will alarm when right shift 32-bit since the ++ type size of long may be 32-bit. */ ++ mask = 0 - (val >> 31); ++ if (mask) ++ offset = (val | (mask - 0xffffffff)); ++ else ++ offset = val; ++ break; ++ default: ++ BFD_ASSERT (0); ++ } ++ ++ /* DIFF value ++ 0 |encoded in location| ++ |------------|-------------------|--------- ++ sym+off(addend) ++ -- before ---| ***************** ++ --------------------- between ---| ++ ++ We only care how much data are relax between DIFF, marked as ***. */ ++ ++ before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0); ++ between = get_nds32_elf_blank_total (&blank_t, irel->r_addend + offset, 0); ++ if (between == before) ++ goto done_adjust_diff; ++ ++ switch (ELF32_R_TYPE (irel->r_info)) ++ { ++ case R_NDS32_DIFF8: ++ bfd_put_8 (abfd, offset - (between - before), contents + irel->r_offset); ++ break; ++ case R_NDS32_DIFF16: ++ bfd_put_16 (abfd, offset - (between - before), contents + irel->r_offset); ++ break; ++ case R_NDS32_DIFF32: ++ bfd_put_32 (abfd, offset - (between - before), contents + irel->r_offset); ++ break; ++ } ++ } ++ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_DIFF_ULEB128 ++ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx) ++ { ++ bfd_vma val = 0; ++ unsigned int len = 0; ++ unsigned long before, between; ++ bfd_byte *endp, *p; ++ ++ val = read_unsigned_leb128 (abfd, contents + irel->r_offset, &len); ++ ++ before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0); ++ between = get_nds32_elf_blank_total (&blank_t, irel->r_addend + val, 0); ++ if (between == before) ++ goto done_adjust_diff; ++ ++ p = contents + irel->r_offset; ++ endp = p + len -1; ++ memset (p, 0x80, len); ++ *(endp) = 0; ++ p = write_uleb128 (p, val - (between - before)) - 1; ++ if (p < endp) ++ *p |= 0x80; ++ } ++done_adjust_diff: ++ ++ if (sec == sect) ++ { ++ raddr = irel->r_offset; ++ irel->r_offset -= get_nds32_elf_blank_total (&blank_t2, irel->r_offset, 1); ++ ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE) ++ continue; ++ if (blank_t2 && blank_t2->next ++ && (blank_t2->offset > raddr || blank_t2->next->offset <= raddr)) ++ (*_bfd_error_handler) (_("%B: %s\n"), abfd, ++ "Error: search_nds32_elf_blank reports wrong node"); ++ ++ /* Mark reloc in deleted portion as NONE. ++ For some relocs like R_NDS32_LABEL that doesn't modify the ++ content in the section. R_NDS32_LABEL doesn't belong to the ++ instruction in the section, so we should preserve it. */ ++ if (raddr >= blank_t2->offset ++ && raddr < blank_t2->offset + blank_t2->size ++ && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL ++ && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_BEGIN ++ && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_END ++ && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY ++ && ELF32_R_TYPE (irel->r_info) != R_NDS32_SUBTRAHEND ++ && ELF32_R_TYPE (irel->r_info) != R_NDS32_MINUEND) ++ { ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), ++ R_NDS32_NONE); ++ continue; ++ } ++ } ++ ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY) ++ continue; ++ ++ if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info ++ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx ++ && ELF_ST_TYPE (isym[ELF32_R_SYM (irel->r_info)].st_info) == STT_SECTION) ++ { ++ if (irel->r_addend <= sec->size) ++ irel->r_addend -= ++ get_nds32_elf_blank_total (&blank_t, irel->r_addend, 1); ++ } ++ } ++ } ++ ++ /* Adjust the local symbols defined in this section. */ ++ blank_t = blank_head; ++ for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++) ++ { ++ if (isym->st_shndx == sec_shndx) ++ { ++ if (isym->st_value <= sec->size) ++ { ++ bfd_vma ahead; ++ bfd_vma orig_addr = isym->st_value; ++ ++ ahead = get_nds32_elf_blank_total (&blank_t, isym->st_value, 1); ++ isym->st_value -= ahead; ++ ++ /* Adjust function size. */ ++ if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC && isym->st_size > 0) ++ isym->st_size -= get_nds32_elf_blank_total ++ (&blank_t, orig_addr + isym->st_size, 0) - ahead; ++ } ++ } ++ } ++ ++ /* Now adjust the global symbols defined in this section. */ ++ symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym) ++ - symtab_hdr->sh_info); ++ sym_hashes = elf_sym_hashes (abfd); ++ end_hashes = sym_hashes + symcount; ++ blank_t = blank_head; ++ for (; sym_hashes < end_hashes; sym_hashes++) ++ { ++ struct elf_link_hash_entry *sym_hash = *sym_hashes; ++ ++ if ((sym_hash->root.type == bfd_link_hash_defined ++ || sym_hash->root.type == bfd_link_hash_defweak) ++ && sym_hash->root.u.def.section == sec) ++ { ++ if (sym_hash->root.u.def.value <= sec->size) ++ { ++ bfd_vma ahead; ++ bfd_vma orig_addr = sym_hash->root.u.def.value; ++ ++ ahead = get_nds32_elf_blank_total (&blank_t, sym_hash->root.u.def.value, 1); ++ sym_hash->root.u.def.value -= ahead; ++ ++ /* Adjust function size. */ ++ if (sym_hash->type == STT_FUNC) ++ sym_hash->size -= get_nds32_elf_blank_total ++ (&blank_t, orig_addr + sym_hash->size, 0) - ahead; ++ ++ } ++ } ++ } ++ ++ contents = elf_section_data (sec)->this_hdr.contents; ++ blank_t = blank_head; ++ while (blank_t->next) ++ { ++ /* Actually delete the bytes. */ ++ ++ /* If current blank is the last blank overlap with current section, ++ go to finish process. */ ++ if (sec->size <= (blank_t->next->offset)) ++ break; ++ ++ memmove (contents + blank_t->offset - blank_t->total_size, ++ contents + blank_t->offset + blank_t->size, ++ blank_t->next->offset - (blank_t->offset + blank_t->size)); ++ ++ blank_t = blank_t->next; ++ } ++ ++ if (sec->size > (blank_t->offset + blank_t->size)) ++ { ++ /* There are remaining code between blank and section boundary. ++ Move the remaining code to appropriate location. */ ++ memmove (contents + blank_t->offset - blank_t->total_size, ++ contents + blank_t->offset + blank_t->size, ++ sec->size - (blank_t->offset + blank_t->size)); ++ sec->size -= blank_t->total_size + blank_t->size; ++ } ++ else ++ /* This blank is not entirely included in the section, ++ reduce the section size by only part of the blank size. */ ++ sec->size -= blank_t->total_size + (sec->size - blank_t->offset); ++ ++ while (blank_head) ++ { ++ blank_t = blank_head; ++ blank_head = blank_head->next; ++ remove_nds32_elf_blank (blank_t); ++ } ++ ++ return TRUE; ++} ++ ++/* Get the contents of a section. */ ++ ++static int ++nds32_get_section_contents (bfd *abfd, asection *sec, ++ bfd_byte **contents_p, bfd_boolean cache) ++{ ++ /* Get the section contents. */ ++ if (elf_section_data (sec)->this_hdr.contents != NULL) ++ *contents_p = elf_section_data (sec)->this_hdr.contents; ++ else ++ { ++ if (!bfd_malloc_and_get_section (abfd, sec, contents_p)) ++ return FALSE; ++ if (cache) ++ elf_section_data (sec)->this_hdr.contents = *contents_p; ++ } ++ ++ return TRUE; ++} ++ ++/* Get the contents of the internal symbol of abfd. */ ++ ++static int ++nds32_get_local_syms (bfd *abfd, asection *sec ATTRIBUTE_UNUSED, ++ Elf_Internal_Sym **isymbuf_p) ++{ ++ Elf_Internal_Shdr *symtab_hdr; ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ ++ /* Read this BFD's local symbols if we haven't done so already. */ ++ if (*isymbuf_p == NULL && symtab_hdr->sh_info != 0) ++ { ++ *isymbuf_p = (Elf_Internal_Sym *) symtab_hdr->contents; ++ if (*isymbuf_p == NULL) ++ { ++ *isymbuf_p = bfd_elf_get_elf_syms (abfd, symtab_hdr, ++ symtab_hdr->sh_info, 0, ++ NULL, NULL, NULL); ++ if (*isymbuf_p == NULL) ++ return FALSE; ++ } ++ } ++ symtab_hdr->contents = (bfd_byte *) (*isymbuf_p); ++ ++ return TRUE; ++} ++ ++/* Range of small data. */ ++static bfd_vma sdata_range[2][2]; ++static bfd_vma const sdata_init_range[2] = ++{ ACCURATE_12BIT_S1, ACCURATE_19BIT }; ++ ++static int ++nds32_elf_insn_size (bfd *abfd ATTRIBUTE_UNUSED, ++ bfd_byte *contents, bfd_vma addr) ++{ ++ unsigned long insn = bfd_getb32 (contents + addr); ++ ++ if (insn & 0x80000000) ++ return 2; ++ ++ return 4; ++} ++ ++/* Set the gp relax range. We have to measure the safe range ++ to do gp relaxation. */ ++ ++static void ++relax_range_measurement (bfd *abfd) ++{ ++ asection *sec_f, *sec_b; ++ /* For upper bound. */ ++ bfd_vma maxpgsz = get_elf_backend_data (abfd)->maxpagesize; ++ bfd_vma align; ++ static int decide_relax_range = 0; ++ int i; ++ int range_number = ARRAY_SIZE (sdata_init_range); ++ ++ if (decide_relax_range) ++ return; ++ decide_relax_range = 1; ++ ++ if (sda_rela_sec == NULL) ++ { ++ /* Since there is no data sections, we assume the range is page size. */ ++ for (i = 0; i < range_number; i++) ++ { ++ sdata_range[i][0] = sdata_init_range[i] - 0x1000; ++ sdata_range[i][1] = sdata_init_range[i] - 0x1000; ++ } ++ return; ++ } ++ ++ /* Get the biggest alignment power after the gp located section. */ ++ sec_f = sda_rela_sec->output_section; ++ sec_b = sec_f->next; ++ align = 0; ++ while (sec_b != NULL) ++ { ++ if ((unsigned)(1 << sec_b->alignment_power) > align) ++ align = (1 << sec_b->alignment_power); ++ sec_b = sec_b->next; ++ } ++ ++ /* I guess we can not determine the section before ++ gp located section, so we assume the align is max page size. */ ++ for (i = 0; i < range_number; i++) ++ { ++ sdata_range[i][1] = sdata_init_range[i] - align; ++ BFD_ASSERT (sdata_range[i][1] <= sdata_init_range[i]); ++ sdata_range[i][0] = sdata_init_range[i] - maxpgsz; ++ BFD_ASSERT (sdata_range[i][0] <= sdata_init_range[i]); ++ } ++} ++ ++/* These are macros used to check flags encoded in r_addend. ++ They are only used by nds32_elf_relax_section (). */ ++#define GET_SEQ_LEN(addend) ((addend) & 0x000000ff) ++#define IS_1ST_CONVERT(addend) ((addend) & 0x80000000) ++#define IS_OPTIMIZE(addend) ((addend) & 0x40000000) ++#define IS_16BIT_ON(addend) ((addend) & 0x20000000) ++ ++/* Relax LONGCALL1 relocation for nds32_elf_relax_section.*/ ++ ++static bfd_boolean ++nds32_elf_relax_longcall1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ /* There are 3 variations for LONGCALL1 ++ case 4-4-2; 16-bit on, optimize off or optimize for space ++ sethi ta, hi20(symbol) ; LONGCALL1/HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jral5 ta ; ++ ++ case 4-4-4; 16-bit off, optimize don't care ++ sethi ta, hi20(symbol) ; LONGCALL1/HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jral ta ; ++ ++ case 4-4-4; 16-bit on, optimize for speed ++ sethi ta, hi20(symbol) ; LONGCALL1/HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jral ta ; ++ Check code for -mlong-calls output. */ ++ ++ /* Get the reloc for the address from which the register is ++ being loaded. This reloc will tell us which function is ++ actually being called. */ ++ ++ bfd_vma laddr; ++ int seq_len; /* Original length of instruction sequence. */ ++ uint32_t insn; ++ Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend; ++ bfd_signed_vma foff; ++ uint16_t insn16; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ seq_len = GET_SEQ_LEN (irel->r_addend); ++ laddr = irel->r_offset; ++ *insn_len = seq_len; ++ ++ hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_HI20_RELA, laddr); ++ lo_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_LO12S0_ORI_RELA, ++ laddr + 4); ++ ++ if (hi_irelfn == irelend || lo_irelfn == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGCALL1 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr); ++ ++ /* This condition only happened when symbol is undefined. */ ++ if (foff == 0 || foff < -CONSERVATIVE_24BIT_S1 ++ || foff >= CONSERVATIVE_24BIT_S1) ++ return FALSE; ++ ++ /* Relax to: jal symbol; 25_PCREL */ ++ /* 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. */ ++ ++ /* Replace the long call with a jal. */ ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), ++ R_NDS32_25_PCREL_RELA); ++ irel->r_addend = hi_irelfn->r_addend; ++ ++ /* We don't resolve this here but resolve it in relocate_section. */ ++ insn = INSN_JAL; ++ bfd_putb32 (insn, contents + irel->r_offset); ++ ++ hi_irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE); ++ lo_irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE); ++ *insn_len = 4; ++ ++ if (seq_len & 0x2) ++ { ++ insn16 = NDS32_NOP16; ++ bfd_putb16 (insn16, contents + irel->r_offset + *insn_len); ++ lo_irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16); ++ lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG; ++ *insn_len += 2; ++ } ++ return TRUE; ++} ++ ++#define CONVERT_CONDITION_CALL(insn) (((insn) & 0xffff0000) ^ 0x90000) ++/* Relax LONGCALL2 relocation for nds32_elf_relax_section.*/ ++ ++static bfd_boolean ++nds32_elf_relax_longcall2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ /* bltz rt, .L1 ; LONGCALL2 ++ jal symbol ; 25_PCREL ++ .L1: */ ++ ++ /* Get the reloc for the address from which the register is ++ being loaded. This reloc will tell us which function is ++ actually being called. */ ++ ++ bfd_vma laddr; ++ uint32_t insn; ++ Elf_Internal_Rela *i1_irelfn, *cond_irelfn, *irelend; ++ bfd_signed_vma foff; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ laddr = irel->r_offset; ++ i1_irelfn = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_25_PCREL_RELA, laddr + 4); ++ ++ if (i1_irelfn == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGCALL2 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ insn = bfd_getb32 (contents + laddr); ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = calculate_offset (abfd, sec, i1_irelfn, isymbuf, symtab_hdr); ++ ++ if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1 ++ || foff >= CONSERVATIVE_16BIT_S1) ++ return FALSE; ++ ++ /* Relax to bgezal rt, label ; 17_PCREL ++ or bltzal rt, label ; 17_PCREL */ ++ ++ /* Convert to complimentary conditional call. */ ++ insn = CONVERT_CONDITION_CALL (insn); ++ ++ /* 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. */ ++ ++ /* Clean unnessary relocations. */ ++ i1_irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info), R_NDS32_NONE); ++ cond_irelfn = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_17_PCREL_RELA, laddr); ++ if (cond_irelfn != irelend) ++ cond_irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info), R_NDS32_NONE); ++ ++ /* Replace the long call with a bgezal. */ ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info), ++ R_NDS32_17_PCREL_RELA); ++ irel->r_addend = i1_irelfn->r_addend; ++ ++ bfd_putb32 (insn, contents + irel->r_offset); ++ ++ *insn_len = 4; ++ return TRUE; ++} ++ ++/* Relax LONGCALL3 relocation for nds32_elf_relax_section.*/ ++ ++static bfd_boolean ++nds32_elf_relax_longcall3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ /* There are 3 variations for LONGCALL3 ++ case 4-4-4-2; 16-bit on, optimize off or optimize for space ++ bltz rt, $1 ; LONGCALL3 ++ sethi ta, hi20(symbol) ; HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jral5 ta ; ++ $1 ++ ++ case 4-4-4-4; 16-bit off, optimize don't care ++ bltz rt, $1 ; LONGCALL3 ++ sethi ta, hi20(symbol) ; HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jral ta ; ++ $1 ++ ++ case 4-4-4-4; 16-bit on, optimize for speed ++ bltz rt, $1 ; LONGCALL3 ++ sethi ta, hi20(symbol) ; HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jral ta ; ++ $1 */ ++ ++ /* Get the reloc for the address from which the register is ++ being loaded. This reloc will tell us which function is ++ actually being called. */ ++ ++ bfd_vma laddr; ++ int seq_len; /* Original length of instruction sequence. */ ++ uint32_t insn; ++ Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend; ++ bfd_signed_vma foff; ++ uint16_t insn16; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ seq_len = GET_SEQ_LEN (irel->r_addend); ++ laddr = irel->r_offset; ++ *insn_len = seq_len; ++ ++ hi_irelfn = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_HI20_RELA, laddr + 4); ++ lo_irelfn = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_LO12S0_ORI_RELA, laddr + 8); ++ ++ if (hi_irelfn == irelend || lo_irelfn == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGCALL3 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr); ++ ++ if (foff == 0 || foff < -CONSERVATIVE_24BIT_S1 ++ || foff >= CONSERVATIVE_24BIT_S1) ++ return FALSE; ++ ++ insn = bfd_getb32 (contents + laddr); ++ if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1) ++ { ++ /* Relax to bgezal rt, label ; 17_PCREL ++ or bltzal rt, label ; 17_PCREL */ ++ ++ /* Convert to complimentary conditional call. */ ++ insn = CONVERT_CONDITION_CALL (insn); ++ bfd_putb32 (insn, contents + irel->r_offset); ++ ++ *insn_len = 4; ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE); ++ hi_irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE); ++ lo_irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE); ++ ++ cond_irelfn = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_17_PCREL_RELA, laddr); ++ if (cond_irelfn != irelend) ++ { ++ cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), ++ R_NDS32_17_PCREL_RELA); ++ cond_irelfn->r_addend = hi_irelfn->r_addend; ++ } ++ ++ if (seq_len & 0x2) ++ { ++ insn16 = NDS32_NOP16; ++ bfd_putb16 (insn16, contents + irel->r_offset + *insn_len); ++ hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), ++ R_NDS32_INSN16); ++ hi_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG; ++ insn_len += 2; ++ } ++ } ++ else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1) ++ { ++ /* Relax to the following instruction sequence ++ bltz rt, $1 ; LONGCALL2 ++ jal symbol ; 25_PCREL ++ $1 */ ++ *insn_len = 8; ++ insn = INSN_JAL; ++ bfd_putb32 (insn, contents + hi_irelfn->r_offset); ++ ++ hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), ++ R_NDS32_25_PCREL_RELA); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL2); ++ ++ lo_irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE); ++ ++ if (seq_len & 0x2) ++ { ++ insn16 = NDS32_NOP16; ++ bfd_putb16 (insn16, contents + irel->r_offset + *insn_len); ++ lo_irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16); ++ lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG; ++ insn_len += 2; ++ } ++ } ++ return TRUE; ++} ++ ++/* Relax LONGJUMP1 relocation for nds32_elf_relax_section.*/ ++ ++static bfd_boolean ++nds32_elf_relax_longjump1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ /* There are 3 variations for LONGJUMP1 ++ case 4-4-2; 16-bit bit on, optimize off or optimize for space ++ sethi ta, hi20(symbol) ; LONGJUMP1/HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jr5 ta ; ++ ++ case 4-4-4; 16-bit off, optimize don't care ++ sethi ta, hi20(symbol) ; LONGJUMP1/HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jr ta ; ++ ++ case 4-4-4; 16-bit on, optimize for speed ++ sethi ta, hi20(symbol) ; LONGJUMP1/HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jr ta ; */ ++ ++ /* Get the reloc for the address from which the register is ++ being loaded. This reloc will tell us which function is ++ actually being called. */ ++ ++ bfd_vma laddr; ++ int seq_len; /* Original length of instruction sequence. */ ++ int insn16_on; /* 16-bit on/off. */ ++ uint32_t insn; ++ Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend; ++ bfd_signed_vma foff; ++ uint16_t insn16; ++ unsigned long reloc; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ seq_len = GET_SEQ_LEN (irel->r_addend); ++ laddr = irel->r_offset; ++ *insn_len = seq_len; ++ insn16_on = IS_16BIT_ON (irel->r_addend); ++ ++ hi_irelfn = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_HI20_RELA, laddr); ++ lo_irelfn = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_LO12S0_ORI_RELA, laddr + 4); ++ if (hi_irelfn == irelend || lo_irelfn == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGJUMP1 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr); ++ ++ if (foff == 0 || foff >= CONSERVATIVE_24BIT_S1 ++ || foff < -CONSERVATIVE_24BIT_S1) ++ return FALSE; ++ ++ if (insn16_on && foff >= -ACCURATE_8BIT_S1 ++ && foff < ACCURATE_8BIT_S1 && (seq_len & 0x2)) ++ { ++ /* j8 label */ ++ /* 16-bit on, but not optimized for speed. */ ++ reloc = R_NDS32_9_PCREL_RELA; ++ insn16 = INSN_J8; ++ bfd_putb16 (insn16, contents + irel->r_offset); ++ *insn_len = 2; ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE); ++ } ++ else ++ { ++ /* j label */ ++ reloc = R_NDS32_25_PCREL_RELA; ++ insn = INSN_J; ++ bfd_putb32 (insn, contents + irel->r_offset); ++ *insn_len = 4; ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_INSN16); ++ irel->r_addend = 0; ++ } ++ ++ hi_irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc); ++ lo_irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE); ++ ++ if ((seq_len & 0x2) && ((*insn_len & 2) == 0)) ++ { ++ insn16 = NDS32_NOP16; ++ bfd_putb16 (insn16, contents + irel->r_offset + *insn_len); ++ lo_irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), ++ R_NDS32_INSN16); ++ lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG; ++ *insn_len += 2; ++ } ++ return TRUE; ++} ++ ++/* Revert condition branch. This function does not check if the input ++ instruction is condition branch or not. */ ++ ++static void ++nds32_elf_convert_branch (uint16_t insn16, uint32_t insn, ++ uint16_t *re_insn16, uint32_t *re_insn) ++{ ++ uint32_t comp_insn = 0; ++ uint16_t comp_insn16 = 0; ++ ++ if (insn) ++ { ++ if (N32_OP6 (insn) == N32_OP6_BR1) ++ { ++ /* beqs label. */ ++ comp_insn = (insn ^ 0x4000) & 0xffffc000; ++ if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5) ++ { ++ /* Insn can be contracted to 16-bit implied r5. */ ++ comp_insn16 = ++ (comp_insn & 0x4000) ? INSN_BNES38 : INSN_BEQS38; ++ comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8; ++ } ++ } ++ else if (N32_OP6 (insn) == N32_OP6_BR3) ++ { ++ /* bnec $ta, imm11, label. */ ++ comp_insn = (insn ^ 0x80000) & 0xffffff00; ++ } ++ else ++ { ++ comp_insn = (insn ^ 0x10000) & 0xffffc000; ++ if (N32_BR2_SUB (insn) == N32_BR2_BEQZ ++ || N32_BR2_SUB (insn) == N32_BR2_BNEZ) ++ { ++ if (N32_IS_RT3 (insn)) ++ { ++ /* Insn can be contracted to 16-bit. */ ++ comp_insn16 = ++ (comp_insn & 0x10000) ? INSN_BNEZ38 : INSN_BEQZ38; ++ comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8; ++ } ++ else if (N32_RT5 (insn) == REG_R15) ++ { ++ /* Insn can be contracted to 16-bit. */ ++ comp_insn16 = ++ (comp_insn & 0x10000) ? INSN_BNES38 : INSN_BEQS38; ++ } ++ } ++ } ++ } ++ else ++ { ++ switch ((insn16 & 0xf000) >> 12) ++ { ++ case 0xc: ++ /* beqz38 or bnez38 */ ++ comp_insn16 = (insn16 ^ 0x0800) & 0xff00; ++ comp_insn = (comp_insn16 & 0x0800) ? INSN_BNEZ : INSN_BEQZ; ++ comp_insn |= ((comp_insn16 & 0x0700) >> 8) << 20; ++ break; ++ ++ case 0xd: ++ /* beqs38 or bnes38 */ ++ comp_insn16 = (insn16 ^ 0x0800) & 0xff00; ++ comp_insn = (comp_insn16 & 0x0800) ? INSN_BNE : INSN_BEQ; ++ comp_insn |= (((comp_insn16 & 0x0700) >> 8) << 20) ++ | (REG_R5 << 15); ++ break; ++ ++ case 0xe: ++ /* beqzS8 or bnezS8 */ ++ comp_insn16 = (insn16 ^ 0x0100) & 0xff00; ++ comp_insn = (comp_insn16 & 0x0100) ? INSN_BNEZ : INSN_BEQZ; ++ comp_insn |= REG_R15 << 20; ++ break; ++ ++ default: ++ break; ++ } ++ } ++ if (comp_insn && re_insn) ++ *re_insn = comp_insn; ++ if (comp_insn16 && re_insn16) ++ *re_insn16 = comp_insn16; ++} ++ ++/* Relax LONGJUMP2 relocation for nds32_elf_relax_section.*/ ++ ++static bfd_boolean ++nds32_elf_relax_longjump2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ /* There are 3 variations for LONGJUMP2 ++ case 2-4; 1st insn convertible, 16-bit on, ++ optimize off or optimize for space ++ bnes38 rt, ra, $1 ; LONGJUMP2 ++ j label ; 25_PCREL ++ $1: ++ ++ case 4-4; 1st insn not convertible ++ bne rt, ra, $1 ; LONGJUMP2 ++ j label ; 25_PCREL ++ $1: ++ ++ case 4-4; 1st insn convertible, 16-bit on, optimize for speed ++ bne rt, ra, $1 ; LONGJUMP2 ++ j label ; 25_PCREL ++ $1: */ ++ ++ /* Get the reloc for the address from which the register is ++ being loaded. This reloc will tell us which function is ++ actually being called. */ ++ ++ bfd_vma laddr; ++ int seq_len; /* Original length of instruction sequence. */ ++ Elf_Internal_Rela *i2_irelfn, *cond_irelfn, *irelend; ++ int first_size; ++ unsigned int i; ++ bfd_signed_vma foff; ++ uint32_t insn, re_insn = 0; ++ uint16_t insn16, re_insn16 = 0; ++ unsigned long reloc, cond_reloc; ++ ++ enum elf_nds32_reloc_type checked_types[] = ++ { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA }; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ seq_len = GET_SEQ_LEN (irel->r_addend); ++ laddr = irel->r_offset; ++ *insn_len = seq_len; ++ first_size = (seq_len == 6) ? 2 : 4; ++ ++ i2_irelfn = ++ find_relocs_at_address_addr (irel, internal_relocs, ++ irelend, R_NDS32_25_PCREL_RELA, ++ laddr + first_size); ++ ++ for (i = 0; i < ARRAY_SIZE (checked_types); i++) ++ { ++ cond_irelfn = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ checked_types[i], laddr); ++ if (cond_irelfn != irelend) ++ break; ++ } ++ ++ if (i2_irelfn == irelend || cond_irelfn == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGJUMP2 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = ++ calculate_offset (abfd, sec, i2_irelfn, isymbuf, symtab_hdr); ++ if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1 ++ || foff >= CONSERVATIVE_16BIT_S1) ++ return FALSE; ++ ++ /* Get the all corresponding instructions. */ ++ if (first_size == 4) ++ { ++ insn = bfd_getb32 (contents + laddr); ++ nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn); ++ } ++ else ++ { ++ insn16 = bfd_getb16 (contents + laddr); ++ nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn); ++ } ++ ++ if (re_insn16 && foff >= -(ACCURATE_8BIT_S1 - first_size) ++ && foff < ACCURATE_8BIT_S1 - first_size) ++ { ++ if (first_size == 4) ++ { ++ /* Don't convert it to 16-bit now, keep this as relaxable for ++ ``label reloc; INSN16''. */ ++ ++ /* Save comp_insn32 to buffer. */ ++ bfd_putb32 (re_insn, contents + irel->r_offset); ++ *insn_len = 4; ++ reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ? ++ R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA; ++ cond_reloc = R_NDS32_INSN16; ++ } ++ else ++ { ++ bfd_putb16 (re_insn16, contents + irel->r_offset); ++ *insn_len = 2; ++ reloc = R_NDS32_9_PCREL_RELA; ++ cond_reloc = R_NDS32_NONE; ++ } ++ } ++ else if (N32_OP6 (re_insn) == N32_OP6_BR1 ++ && (foff >= -(ACCURATE_14BIT_S1 - first_size) ++ && foff < ACCURATE_14BIT_S1 - first_size)) ++ { ++ /* beqs label ; 15_PCREL */ ++ bfd_putb32 (re_insn, contents + irel->r_offset); ++ *insn_len = 4; ++ reloc = R_NDS32_15_PCREL_RELA; ++ cond_reloc = R_NDS32_NONE; ++ } ++ else if (N32_OP6 (re_insn) == N32_OP6_BR2 ++ && foff >= -CONSERVATIVE_16BIT_S1 ++ && foff < CONSERVATIVE_16BIT_S1) ++ { ++ /* beqz label ; 17_PCREL */ ++ bfd_putb32 (re_insn, contents + irel->r_offset); ++ *insn_len = 4; ++ reloc = R_NDS32_17_PCREL_RELA; ++ cond_reloc = R_NDS32_NONE; ++ } ++ else ++ return FALSE; ++ ++ /* Set all relocations. */ ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info), reloc); ++ irel->r_addend = i2_irelfn->r_addend; ++ ++ cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info), ++ cond_reloc); ++ cond_irelfn->r_addend = 0; ++ ++ if ((seq_len ^ *insn_len ) & 0x2) ++ { ++ insn16 = NDS32_NOP16; ++ bfd_putb16 (insn16, contents + irel->r_offset + 4); ++ i2_irelfn->r_offset = 4; ++ i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info), ++ R_NDS32_INSN16); ++ i2_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG; ++ *insn_len += 2; ++ } ++ else ++ i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info), ++ R_NDS32_NONE); ++ return TRUE; ++} ++ ++/* Relax LONGJUMP3 relocation for nds32_elf_relax_section.*/ ++ ++static bfd_boolean ++nds32_elf_relax_longjump3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ /* There are 5 variations for LONGJUMP3 ++ case 1: 2-4-4-2; 1st insn convertible, 16-bit on, ++ optimize off or optimize for space ++ bnes38 rt, ra, $1 ; LONGJUMP3 ++ sethi ta, hi20(symbol) ; HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jr5 ta ; ++ $1: ; ++ ++ case 2: 2-4-4-2; 1st insn convertible, 16-bit on, optimize for speed ++ bnes38 rt, ra, $1 ; LONGJUMP3 ++ sethi ta, hi20(symbol) ; HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jr5 ta ; ++ $1: ; LABEL ++ ++ case 3: 4-4-4-2; 1st insn not convertible, 16-bit on, ++ optimize off or optimize for space ++ bne rt, ra, $1 ; LONGJUMP3 ++ sethi ta, hi20(symbol) ; HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jr5 ta ; ++ $1: ; ++ ++ case 4: 4-4-4-4; 1st insn don't care, 16-bit off, optimize don't care ++ 16-bit off if no INSN16 ++ bne rt, ra, $1 ; LONGJUMP3 ++ sethi ta, hi20(symbol) ; HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jr ta ; ++ $1: ; ++ ++ case 5: 4-4-4-4; 1st insn not convertible, 16-bit on, optimize for speed ++ 16-bit off if no INSN16 ++ bne rt, ra, $1 ; LONGJUMP3 ++ sethi ta, hi20(symbol) ; HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0 ++ jr ta ; ++ $1: ; LABEL */ ++ ++ /* Get the reloc for the address from which the register is ++ being loaded. This reloc will tell us which function is ++ actually being called. */ ++ enum elf_nds32_reloc_type checked_types[] = ++ { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA }; ++ ++ int reloc_off = 0, cond_removed = 0, convertible; ++ bfd_vma laddr; ++ int seq_len; /* Original length of instruction sequence. */ ++ Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend; ++ int first_size; ++ unsigned int i; ++ bfd_signed_vma foff; ++ uint32_t insn, re_insn = 0; ++ uint16_t insn16, re_insn16 = 0; ++ unsigned long reloc, cond_reloc; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ seq_len = GET_SEQ_LEN (irel->r_addend); ++ laddr = irel->r_offset; ++ *insn_len = seq_len; ++ ++ convertible = IS_1ST_CONVERT (irel->r_addend); ++ ++ if (convertible) ++ first_size = 2; ++ else ++ first_size = 4; ++ ++ /* Get all needed relocations. */ ++ hi_irelfn = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_HI20_RELA, laddr + first_size); ++ lo_irelfn = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_LO12S0_ORI_RELA, ++ laddr + first_size + 4); ++ ++ for (i = 0; i < ARRAY_SIZE (checked_types); i++) ++ { ++ cond_irelfn = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ checked_types[i], laddr); ++ if (cond_irelfn != irelend) ++ break; ++ } ++ ++ if (hi_irelfn == irelend || lo_irelfn == irelend || cond_irelfn == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGJUMP3 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr); ++ ++ if (foff == 0 || foff < -CONSERVATIVE_24BIT_S1 ++ || foff >= CONSERVATIVE_24BIT_S1) ++ return FALSE; ++ ++ /* Get the all corresponding instructions. */ ++ if (first_size == 4) ++ { ++ insn = bfd_getb32 (contents + laddr); ++ nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn); ++ } ++ else ++ { ++ insn16 = bfd_getb16 (contents + laddr); ++ nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn); ++ } ++ ++ /* 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 (re_insn16 && foff >= -ACCURATE_8BIT_S1 - first_size ++ && foff < ACCURATE_8BIT_S1 - first_size) ++ { ++ if (!(seq_len & 0x2)) ++ { ++ /* Don't convert it to 16-bit now, keep this as relaxable ++ for ``label reloc; INSN1a''6. */ ++ /* Save comp_insn32 to buffer. */ ++ bfd_putb32 (re_insn, contents + irel->r_offset); ++ *insn_len = 4; ++ reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ? ++ R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA; ++ cond_reloc = R_NDS32_INSN16; ++ } ++ else ++ { ++ /* Not optimize for speed; convert sequence to 16-bit. */ ++ /* Save comp_insn16 to buffer. */ ++ bfd_putb16 (re_insn16, contents + irel->r_offset); ++ *insn_len = 2; ++ reloc = R_NDS32_9_PCREL_RELA; ++ cond_reloc = R_NDS32_NONE; ++ } ++ cond_removed = 1; ++ } ++ else if (N32_OP6 (re_insn) == N32_OP6_BR1 ++ && (foff >= -(ACCURATE_14BIT_S1 - first_size) ++ && foff < ACCURATE_14BIT_S1 - first_size)) ++ { ++ /* beqs label ; 15_PCREL */ ++ bfd_putb32 (re_insn, contents + irel->r_offset); ++ *insn_len = 4; ++ reloc = R_NDS32_15_PCREL_RELA; ++ cond_reloc = R_NDS32_NONE; ++ cond_removed = 1; ++ } ++ else if (N32_OP6 (re_insn) == N32_OP6_BR2 ++ && foff >= -CONSERVATIVE_16BIT_S1 ++ && foff < CONSERVATIVE_16BIT_S1) ++ { ++ /* beqz label ; 17_PCREL */ ++ bfd_putb32 (re_insn, contents + irel->r_offset); ++ *insn_len = 4; ++ reloc = R_NDS32_17_PCREL_RELA; ++ cond_reloc = R_NDS32_NONE; ++ cond_removed = 1; ++ } ++ else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off ++ && foff < CONSERVATIVE_24BIT_S1 - reloc_off) ++ { ++ /* Relax to one of the following 3 variations ++ ++ case 2-4; 1st insn convertible, 16-bit on, optimize off or optimize ++ for space ++ bnes38 rt, $1 ; LONGJUMP2 ++ j label ; 25_PCREL ++ $1 ++ ++ case 4-4; 1st insn not convertible, others don't care ++ bne rt, ra, $1 ; LONGJUMP2 ++ j label ; 25_PCREL ++ $1 ++ ++ case 4-4; 1st insn convertible, 16-bit on, optimize for speed ++ bne rt, ra, $1 ; LONGJUMP2 ++ j label ; 25_PCREL ++ $1 */ ++ ++ /* Offset for first instruction. */ ++ ++ /* Use j label as second instruction. */ ++ *insn_len = 4 + first_size; ++ insn = INSN_J; ++ bfd_putb32 (insn, contents + hi_irelfn->r_offset); ++ reloc = R_NDS32_LONGJUMP2; ++ cond_reloc = R_NDS32_25_PLTREL; ++ } ++ else ++ return FALSE; ++ ++ if (cond_removed == 1) ++ { ++ /* Set all relocations. */ ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc); ++ irel->r_addend = hi_irelfn->r_addend; ++ ++ cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info), ++ cond_reloc); ++ cond_irelfn->r_addend = 0; ++ hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), ++ R_NDS32_NONE); ++ } ++ else ++ { ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc); ++ irel->r_addend = irel->r_addend; ++ hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), ++ cond_reloc); ++ } ++ ++ if ((seq_len ^ *insn_len ) & 0x2) ++ { ++ insn16 = NDS32_NOP16; ++ bfd_putb16 (insn16, contents + irel->r_offset + *insn_len); ++ lo_irelfn->r_offset = *insn_len; ++ lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), ++ R_NDS32_INSN16); ++ lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG; ++ *insn_len += 2; ++ } ++ else ++ lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), ++ R_NDS32_NONE); ++ return TRUE; ++} ++ ++/* Relax LONGCALL4 relocation for nds32_elf_relax_section.*/ ++ ++static bfd_boolean ++nds32_elf_relax_longcall4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ /* The pattern for LONGCALL4. Support for function cse. ++ sethi ta, hi20(symbol) ; LONGCALL4/HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR ++ jral ta ; PTR_RES/EMPTY/INSN16 */ ++ ++ bfd_vma laddr; ++ uint32_t insn; ++ Elf_Internal_Rela *hi_irel, *ptr_irel, *insn_irel, *em_irel, *call_irel; ++ Elf_Internal_Rela *irelend; ++ bfd_signed_vma foff; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ laddr = irel->r_offset; ++ ++ /* Get the reloc for the address from which the register is ++ being loaded. This reloc will tell us which function is ++ actually being called. */ ++ hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_HI20_RELA, laddr); ++ ++ if (hi_irel == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGCALL4 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr); ++ ++ /* This condition only happened when symbol is undefined. */ ++ if (foff == 0 || foff < -CONSERVATIVE_24BIT_S1 ++ || foff >= CONSERVATIVE_24BIT_S1) ++ return FALSE; ++ ++ /* Relax to: jal symbol; 25_PCREL */ ++ /* 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. */ ++ ++ ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_PTR_RESOLVED, irel->r_addend); ++ em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_EMPTY, irel->r_addend); ++ ++ if (ptr_irel == irelend || em_irel == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGCALL4 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ /* Check these is enough space to insert jal in R_NDS32_EMPTY. */ ++ insn = bfd_getb32 (contents + irel->r_addend); ++ if (insn & 0x80000000) ++ return FALSE; ++ ++ /* Replace the long call with a jal. */ ++ em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), ++ R_NDS32_25_PCREL_RELA); ++ ptr_irel->r_addend = 1; ++ ++ /* We don't resolve this here but resolve it in relocate_section. */ ++ insn = INSN_JAL; ++ bfd_putb32 (insn, contents + em_irel->r_offset); ++ ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE); ++ ++ /* If there is function cse, HI20 can not remove now. */ ++ call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_LONGCALL4, laddr); ++ if (call_irel == irelend) ++ { ++ *insn_len = 0; ++ hi_irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE); ++ } ++ ++ insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_INSN16, irel->r_addend); ++ if (insn_irel != irelend) ++ insn_irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE); ++ ++ return TRUE; ++} ++ ++/* Relax LONGCALL5 relocation for nds32_elf_relax_section.*/ ++ ++static bfd_boolean ++nds32_elf_relax_longcall5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ /* The pattern for LONGCALL5. ++ bltz rt, .L1 ; LONGCALL5/17_PCREL ++ jal symbol ; 25_PCREL ++ .L1: */ ++ ++ bfd_vma laddr; ++ uint32_t insn; ++ Elf_Internal_Rela *cond_irel, *irelend; ++ bfd_signed_vma foff; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ laddr = irel->r_offset; ++ insn = bfd_getb32 (contents + laddr); ++ ++ /* Get the reloc for the address from which the register is ++ being loaded. This reloc will tell us which function is ++ actually being called. */ ++ cond_irel = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_25_PCREL_RELA, irel->r_addend); ++ if (cond_irel == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGCALL5 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr); ++ ++ if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1 ++ || foff >= CONSERVATIVE_16BIT_S1) ++ return FALSE; ++ ++ /* Relax to bgezal rt, label ; 17_PCREL ++ or bltzal rt, label ; 17_PCREL */ ++ ++ /* Convert to complimentary conditional call. */ ++ insn = CONVERT_CONDITION_CALL (insn); ++ ++ /* 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. */ ++ ++ /* Modify relocation and contents. */ ++ cond_irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_17_PCREL_RELA); ++ ++ /* Replace the long call with a bgezal. */ ++ bfd_putb32 (insn, contents + cond_irel->r_offset); ++ *insn_len = 0; ++ ++ /* Clean unnessary relocations. */ ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE); ++ ++ cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_17_PCREL_RELA, laddr); ++ cond_irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE); ++ ++ return TRUE; ++} ++ ++/* Relax LONGCALL6 relocation for nds32_elf_relax_section.*/ ++ ++static bfd_boolean ++nds32_elf_relax_longcall6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ /* The pattern for LONGCALL6. ++ bltz rt, .L1 ; LONGCALL6/17_PCREL ++ sethi ta, hi20(symbol) ; HI20/PTR ++ ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR ++ jral ta ; PTR_RES/EMPTY/INSN16 ++ .L1 */ ++ ++ bfd_vma laddr; ++ uint32_t insn; ++ Elf_Internal_Rela *em_irel, *cond_irel, *irelend; ++ bfd_signed_vma foff; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ laddr = irel->r_offset; ++ ++ /* Get the reloc for the address from which the register is ++ being loaded. This reloc will tell us which function is ++ actually being called. */ ++ em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_EMPTY, irel->r_addend); ++ ++ if (em_irel == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGCALL6 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr); ++ ++ if (foff == 0 || foff < -CONSERVATIVE_24BIT_S1 ++ || foff >= CONSERVATIVE_24BIT_S1) ++ return FALSE; ++ ++ /* Check these is enough space to insert jal in R_NDS32_EMPTY. */ ++ insn = bfd_getb32 (contents + irel->r_addend); ++ if (insn & 0x80000000) ++ return FALSE; ++ ++ insn = bfd_getb32 (contents + laddr); ++ if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1) ++ { ++ /* Relax to bgezal rt, label ; 17_PCREL ++ or bltzal rt, label ; 17_PCREL */ ++ ++ /* Convert to complimentary conditional call. */ ++ *insn_len = 0; ++ insn = CONVERT_CONDITION_CALL (insn); ++ bfd_putb32 (insn, contents + em_irel->r_offset); ++ ++ em_irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_17_PCREL_RELA); ++ ++ /* Set resolved relocation. */ ++ cond_irel = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_PTR_RESOLVED, irel->r_addend); ++ if (cond_irel == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGCALL6 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ cond_irel->r_addend = 1; ++ ++ /* Clear relocations. */ ++ ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE); ++ ++ cond_irel = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_17_PCREL_RELA, laddr); ++ if (cond_irel != irelend) ++ cond_irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE); ++ ++ cond_irel = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_INSN16, irel->r_addend); ++ if (cond_irel != irelend) ++ cond_irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE); ++ ++ } ++ else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1) ++ { ++ /* Relax to the following instruction sequence ++ bltz rt, .L1 ; LONGCALL2/17_PCREL ++ jal symbol ; 25_PCREL/PTR_RES ++ .L1 */ ++ *insn_len = 4; ++ /* Convert instruction. */ ++ insn = INSN_JAL; ++ bfd_putb32 (insn, contents + em_irel->r_offset); ++ ++ /* Convert relocations. */ ++ em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), ++ R_NDS32_25_PCREL_RELA); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL5); ++ ++ /* Set resolved relocation. */ ++ cond_irel = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_PTR_RESOLVED, irel->r_addend); ++ if (cond_irel == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGCALL6 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ cond_irel->r_addend = 1; ++ ++ cond_irel = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_INSN16, irel->r_addend); ++ if (cond_irel != irelend) ++ cond_irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE); ++ } ++ return TRUE; ++} ++ ++/* Relax LONGJUMP4 relocation for nds32_elf_relax_section.*/ ++ ++static bfd_boolean ++nds32_elf_relax_longjump4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ /* The pattern for LONGJUMP4. ++ sethi ta, hi20(symbol) ; LONGJUMP4/HI20 ++ ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR ++ jr ta ; PTR_RES/INSN16/EMPTY */ ++ ++ bfd_vma laddr; ++ int seq_len; /* Original length of instruction sequence. */ ++ uint32_t insn; ++ Elf_Internal_Rela *hi_irel, *ptr_irel, *em_irel, *call_irel, *irelend; ++ bfd_signed_vma foff; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ seq_len = GET_SEQ_LEN (irel->r_addend); ++ laddr = irel->r_offset; ++ *insn_len = seq_len; ++ ++ /* Get the reloc for the address from which the register is ++ being loaded. This reloc will tell us which function is ++ actually being called. */ ++ ++ hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_HI20_RELA, laddr); ++ ++ if (hi_irel == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGJUMP4 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr); ++ ++ if (foff == 0 || foff >= CONSERVATIVE_24BIT_S1 ++ || foff < -CONSERVATIVE_24BIT_S1) ++ return FALSE; ++ ++ /* Convert it to "j label", it may be converted to j8 in the final ++ pass of relaxation. Therefore, we do not consider this currently.*/ ++ ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_PTR_RESOLVED, irel->r_addend); ++ em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_EMPTY, irel->r_addend); ++ ++ if (ptr_irel == irelend || em_irel == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGJUMP4 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ em_irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_25_PCREL_RELA); ++ ptr_irel->r_addend = 1; ++ ++ /* Write instruction. */ ++ insn = INSN_J; ++ bfd_putb32 (insn, contents + em_irel->r_offset); ++ ++ /* Clear relocations. */ ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE); ++ ++ /* If there is function cse, HI20 can not remove now. */ ++ call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_LONGJUMP4, laddr); ++ if (call_irel == irelend) ++ { ++ *insn_len = 0; ++ hi_irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE); ++ } ++ ++ return TRUE; ++} ++ ++/* Relax LONGJUMP5 relocation for nds32_elf_relax_section.*/ ++ ++static bfd_boolean ++nds32_elf_relax_longjump5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ int *seq_len, bfd_byte *contents, ++ Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ /* There are 2 variations for LONGJUMP5 ++ case 2-4; 1st insn convertible, 16-bit on. ++ bnes38 rt, ra, .L1 ; LONGJUMP5/9_PCREL/INSN16 ++ j label ; 25_PCREL/INSN16 ++ $1: ++ ++ case 4-4; 1st insn not convertible ++ bne rt, ra, .L1 ; LONGJUMP5/15_PCREL/INSN16 ++ j label ; 25_PCREL/INSN16 ++ .L1: */ ++ ++ bfd_vma laddr; ++ Elf_Internal_Rela *cond_irel, *irelend; ++ unsigned int i; ++ bfd_signed_vma foff; ++ uint32_t insn, re_insn = 0; ++ uint16_t insn16, re_insn16 = 0; ++ unsigned long reloc; ++ ++ enum elf_nds32_reloc_type checked_types[] = ++ { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA, ++ R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 }; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ laddr = irel->r_offset; ++ ++ /* Get the reloc for the address from which the register is ++ being loaded. This reloc will tell us which function is ++ actually being called. */ ++ ++ cond_irel = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_25_PCREL_RELA, irel->r_addend); ++ if (cond_irel == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGJUMP5 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr); ++ ++ if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1 ++ || foff >= CONSERVATIVE_16BIT_S1) ++ return FALSE; ++ ++ /* Get the all corresponding instructions. */ ++ insn = bfd_getb32 (contents + laddr); ++ /* Check instruction size. */ ++ if (insn & 0x80000000) ++ { ++ *seq_len = 0; ++ insn16 = insn >> 16; ++ nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn); ++ } ++ else ++ nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn); ++ ++ if (N32_OP6 (re_insn) == N32_OP6_BR1 ++ && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1)) ++ { ++ /* beqs label ; 15_PCREL. */ ++ bfd_putb32 (re_insn, contents + cond_irel->r_offset); ++ reloc = R_NDS32_15_PCREL_RELA; ++ } ++ else if (N32_OP6 (re_insn) == N32_OP6_BR2 ++ && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1) ++ { ++ /* beqz label ; 17_PCREL. */ ++ bfd_putb32 (re_insn, contents + cond_irel->r_offset); ++ reloc = R_NDS32_17_PCREL_RELA; ++ } ++ else if ( N32_OP6 (re_insn) == N32_OP6_BR3 ++ && foff >= -CONSERVATIVE_8BIT_S1 && foff < CONSERVATIVE_8BIT_S1) ++ { ++ /* beqc label ; 9_PCREL. */ ++ bfd_putb32 (re_insn, contents + cond_irel->r_offset); ++ reloc = R_NDS32_WORD_9_PCREL_RELA; ++ } ++ else ++ return FALSE; ++ ++ /* Set all relocations. */ ++ cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), reloc); ++ ++ /* Clean relocations. */ ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE); ++ for (i = 0; i < ARRAY_SIZE (checked_types); i++) ++ { ++ cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ checked_types[i], laddr); ++ if (cond_irel != irelend) ++ { ++ if (*seq_len == 0 ++ && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16)) ++ { ++ /* If the branch instruction is 2 byte, it cannot remove ++ directly. Only convert it to nop16 and remove it after ++ checking alignment issue. */ ++ insn16 = NDS32_NOP16; ++ bfd_putb16 (insn16, contents + laddr); ++ cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG; ++ } ++ else ++ cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), ++ R_NDS32_NONE); ++ } ++ } ++ *insn_len = 0; ++ ++ return TRUE; ++} ++ ++/* Relax LONGJUMP6 relocation for nds32_elf_relax_section.*/ ++ ++static bfd_boolean ++nds32_elf_relax_longjump6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ int *seq_len, bfd_byte *contents, ++ Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ /* There are 5 variations for LONGJUMP6 ++ case : 2-4-4-4; 1st insn convertible, 16-bit on. ++ bnes38 rt, ra, .L1 ; LONGJUMP6/15_PCREL/INSN16 ++ sethi ta, hi20(symbol) ; HI20/PTR ++ ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR ++ jr ta ; PTR_RES/INSN16/EMPTY ++ .L1: ++ ++ case : 4-4-4-4; 1st insn not convertible, 16-bit on. ++ bne rt, ra, .L1 ; LONGJUMP6/15_PCREL/INSN16 ++ sethi ta, hi20(symbol) ; HI20/PTR ++ ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR ++ jr ta ; PTR_RES/INSN16/EMPTY ++ .L1: */ ++ ++ enum elf_nds32_reloc_type checked_types[] = ++ { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA, ++ R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 }; ++ ++ int reloc_off = 0, cond_removed = 0; ++ bfd_vma laddr; ++ Elf_Internal_Rela *cond_irel, *em_irel, *irelend, *insn_irel; ++ unsigned int i; ++ bfd_signed_vma foff; ++ uint32_t insn, re_insn = 0; ++ uint16_t insn16, re_insn16 = 0; ++ unsigned long reloc; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ laddr = irel->r_offset; ++ ++ /* Get the reloc for the address from which the register is ++ being loaded. This reloc will tell us which function is ++ actually being called. */ ++ em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_EMPTY, irel->r_addend); ++ ++ if (em_irel == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGJUMP6 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr); ++ ++ if (foff == 0 || foff < -CONSERVATIVE_24BIT_S1 ++ || foff >= CONSERVATIVE_24BIT_S1) ++ return FALSE; ++ ++ insn = bfd_getb32 (contents + laddr); ++ /* Check instruction size. */ ++ if (insn & 0x80000000) ++ { ++ *seq_len = 0; ++ insn16 = insn >> 16; ++ nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn); ++ } ++ else ++ nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn); ++ ++ /* 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 (N32_OP6 (re_insn) == N32_OP6_BR1 ++ && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1)) ++ { ++ /* beqs label ; 15_PCREL */ ++ bfd_putb32 (re_insn, contents + em_irel->r_offset); ++ reloc = R_NDS32_15_PCREL_RELA; ++ cond_removed = 1; ++ } ++ else if (N32_OP6 (re_insn) == N32_OP6_BR2 ++ && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1) ++ { ++ /* beqz label ; 17_PCREL */ ++ bfd_putb32 (re_insn, contents + em_irel->r_offset); ++ reloc = R_NDS32_17_PCREL_RELA; ++ cond_removed = 1; ++ } ++ else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off ++ && foff < CONSERVATIVE_24BIT_S1 - reloc_off) ++ { ++ /* Relax to one of the following 2 variations ++ ++ case 2-4; 1st insn convertible, 16-bit on. ++ bnes38 rt, ra, .L1 ; LONGJUMP5/9_PCREL/INSN16 ++ j label ; 25_PCREL/INSN16 ++ $1: ++ ++ case 4-4; 1st insn not convertible ++ bne rt, ra, .L1 ; LONGJUMP5/15_PCREL/INSN16 ++ j label ; 25_PCREL/INSN16 ++ .L1: */ ++ ++ /* Use j label as second instruction. */ ++ insn = INSN_J; ++ reloc = R_NDS32_25_PCREL_RELA; ++ bfd_putb32 (insn, contents + em_irel->r_offset); ++ } ++ else ++ return FALSE; ++ ++ /* Set all relocations. */ ++ em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), reloc); ++ ++ cond_irel = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_PTR_RESOLVED, em_irel->r_offset); ++ cond_irel->r_addend = 1; ++ ++ /* Use INSN16 of first branch instruction to distinguish if keeping ++ INSN16 of final instruction or not. */ ++ insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_INSN16, irel->r_offset); ++ if (insn_irel == irelend) ++ { ++ /* Clean the final INSN16. */ ++ insn_irel = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_INSN16, em_irel->r_offset); ++ insn_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), ++ R_NDS32_NONE); ++ } ++ ++ if (cond_removed == 1) ++ { ++ *insn_len = 0; ++ ++ /* Clear relocations. */ ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE); ++ ++ for (i = 0; i < ARRAY_SIZE (checked_types); i++) ++ { ++ cond_irel = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ checked_types[i], laddr); ++ if (cond_irel != irelend) ++ { ++ if (*seq_len == 0 ++ && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16)) ++ { ++ /* If the branch instruction is 2 byte, it cannot remove ++ directly. Only convert it to nop16 and remove it after ++ checking alignment issue. */ ++ insn16 = NDS32_NOP16; ++ bfd_putb16 (insn16, contents + laddr); ++ cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG; ++ } ++ else ++ cond_irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE); ++ } ++ } ++ } ++ else ++ { ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), ++ R_NDS32_LONGJUMP5); ++ } ++ ++ return TRUE; ++} ++ ++/* Relax LONGJUMP7 relocation for nds32_elf_relax_section.*/ ++ ++static bfd_boolean ++nds32_elf_relax_longjump7 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ int *seq_len, bfd_byte *contents, ++ Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ /* There are 2 variations for LONGJUMP5 ++ case 2-4; 1st insn convertible, 16-bit on. ++ movi55 ta, imm11 ; LONGJUMP7/INSN16 ++ beq rt, ta, label ; 15_PCREL ++ ++ case 4-4; 1st insn not convertible ++ movi55 ta, imm11 ; LONGJUMP7/INSN16 ++ beq rt, ta, label ; 15_PCREL */ ++ ++ bfd_vma laddr; ++ Elf_Internal_Rela *cond_irel, *irelend, *insn_irel; ++ bfd_signed_vma foff; ++ uint32_t insn, re_insn = 0; ++ uint16_t insn16; ++ uint32_t imm11; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ laddr = irel->r_offset; ++ ++ /* Get the reloc for the address from which the register is ++ being loaded. This reloc will tell us which function is ++ actually being called. */ ++ ++ cond_irel = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_15_PCREL_RELA, irel->r_addend); ++ if (cond_irel == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LONGJUMP7 points to unrecognized" ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr); ++ ++ if (foff == 0 || foff < -CONSERVATIVE_8BIT_S1 ++ || foff >= CONSERVATIVE_8BIT_S1) ++ return FALSE; ++ ++ /* Get the first instruction for its size. */ ++ insn = bfd_getb32 (contents + laddr); ++ if (insn & 0x80000000) ++ { ++ *seq_len = 0; ++ /* Get the immediate from movi55. */ ++ imm11 = N16_IMM5S (insn >> 16); ++ } ++ else ++ { ++ /* Get the immediate from movi. */ ++ imm11 = N32_IMM20S (insn); ++ } ++ ++ /* Get the branch instruction. */ ++ insn = bfd_getb32 (contents + irel->r_addend); ++ /* Convert instruction to BR3. */ ++ if ((insn >> 14) & 0x1) ++ re_insn = N32_BR3 (BNEC, N32_RT5 (insn), imm11, 0); ++ else ++ re_insn = N32_BR3 (BEQC, N32_RT5 (insn), imm11, 0); ++ ++ bfd_putb32 (re_insn, contents + cond_irel->r_offset); ++ ++ /* Set all relocations. */ ++ cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), ++ R_NDS32_WORD_9_PCREL_RELA); ++ ++ /* Clean relocations. */ ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE); ++ insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_INSN16, irel->r_offset); ++ if (insn_irel != irelend) ++ { ++ if (*seq_len == 0) ++ { ++ /* If the first insntruction is 16bit, convert it to nop16. */ ++ insn16 = NDS32_NOP16; ++ bfd_putb16 (insn16, contents + laddr); ++ insn_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG; ++ } ++ else ++ cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), ++ R_NDS32_NONE); ++ } ++ *insn_len = 0; ++ ++ return TRUE; ++} ++ ++/* Record the offset to gp, and check if it changed after relaxing. ++ If the offset is fixed or the offset is near enough, try to relax ++ the pattern. This is avoid truncated to fit when relaxing fixed ++ address symbol. Ex: _stack. */ ++static bfd_boolean ++nds32_elf_relax_guard (bfd_vma *access_addr, bfd_vma local_sda, asection *sec, ++ Elf_Internal_Rela *irel, bfd_boolean *again, ++ bfd_boolean init, ++ struct elf_nds32_link_hash_table *table, ++ Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr) ++ ++{ ++ /* The default linker script value. */ ++ int offset_to_gp; ++ static bfd_boolean sec_pass = FALSE; ++ static asection *first_sec = NULL, *sym_sec; ++ /* Record the number of instructions which may be removed. */ ++ static int count = 0, record_count; ++ Elf_Internal_Sym *isym; ++ struct elf_link_hash_entry *h = NULL; ++ int indx; ++ unsigned long r_symndx; ++ bfd *abfd = sec->owner; ++ static bfd_vma record_sda = 0; ++ int sda_offset = 0; ++ ++ /* Force doing relaxation when hyper-relax is high. */ ++ if (table->hyper_relax == 2) ++ return TRUE; ++ ++ /* Record the first section to get the round. */ ++ if (init) ++ { ++ if (!first_sec) ++ first_sec = sec; ++ else if (first_sec == sec) ++ { ++ record_count = count; ++ count = 0; ++ sec_pass = TRUE; ++ } ++ ++ if (!sec_pass) ++ *again = TRUE; ++ ++ return TRUE;; ++ } ++ ++ if (record_sda == 0) ++ record_sda = local_sda; ++ else if (local_sda > record_sda) ++ /* In normal case, SDA is fixed or smaller except there is ++ DATA_SEGMENT_ALIGN in linker script.*/ ++ sda_offset = local_sda - record_sda; ++ ++ /* Although we doesn't delete all instructions here, counting all of ++ them to be conservative. */ ++ count++; ++ ++ r_symndx = ELF32_R_SYM (irel->r_info); ++ /* Global symbols. */ ++ if (r_symndx >= symtab_hdr->sh_info) ++ { ++ indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info; ++ h = elf_sym_hashes (abfd)[indx]; ++ sym_sec = h->root.u.def.section; ++ if (NDS32_GUARD_SEC_P (sym_sec->flags) ++ || bfd_is_abs_section (sym_sec)) ++ { ++ /* Forbid doing relaxation when hyper-relax is low. */ ++ if (table->hyper_relax == 0) ++ return FALSE; ++ ++ offset_to_gp = *access_addr - local_sda; ++ if (elf32_nds32_hash_entry (h)->offset_to_gp == 0) ++ elf32_nds32_hash_entry (h)->offset_to_gp = offset_to_gp; ++ else if (abs (elf32_nds32_hash_entry (h)->offset_to_gp) ++ < abs (offset_to_gp) - sda_offset) ++ { ++ if (*access_addr >= local_sda) ++ *access_addr += (record_count * 4); ++ else ++ *access_addr -= (record_count * 4); ++ } ++ return sec_pass; ++ } ++ } ++ else ++ { ++ if (!elf32_nds32_allocate_local_sym_info (abfd)) ++ return FALSE; ++ isym = isymbuf + r_symndx; ++ ++ sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx); ++ if (NDS32_GUARD_SEC_P (sym_sec->flags)) ++ { ++ /* Forbid doing relaxation when hyper-relax is low. */ ++ if (table->hyper_relax == 0) ++ return FALSE; ++ ++ offset_to_gp = *access_addr - local_sda; ++ if (elf32_nds32_local_gp_offset (abfd)[r_symndx] == 0) ++ elf32_nds32_local_gp_offset (abfd)[r_symndx] = offset_to_gp; ++ else if (abs (elf32_nds32_local_gp_offset (abfd)[r_symndx]) ++ < abs (offset_to_gp) - sda_offset) ++ { ++ if (*access_addr >= local_sda) ++ *access_addr += (record_count * 4); ++ else ++ *access_addr -= (record_count * 4); ++ } ++ return sec_pass; ++ } ++ } ++ ++ return TRUE; ++} ++#define GET_LOADSTORE_RANGE(addend) (((addend) >> 8) & 0x3f) ++ ++/* Relax LOADSTORE relocation for nds32_elf_relax_section. */ ++ ++static bfd_boolean ++nds32_elf_relax_loadstore (struct bfd_link_info *link_info, bfd *abfd, ++ asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr, int load_store_relax, ++ struct elf_nds32_link_hash_table *table) ++{ ++ int eliminate_sethi = 0, range_type, i; ++ bfd_vma local_sda, laddr; ++ int seq_len; /* Original length of instruction sequence. */ ++ uint32_t insn; ++ Elf_Internal_Rela *hi_irelfn = NULL, *irelend; ++ bfd_vma access_addr = 0; ++ bfd_vma range_l = 0, range_h = 0; /* Upper/lower bound. */ ++ enum elf_nds32_reloc_type checked_types[] = ++ { R_NDS32_HI20_RELA, R_NDS32_GOT_HI20, ++ R_NDS32_GOTPC_HI20, R_NDS32_GOTOFF_HI20, ++ R_NDS32_PLTREL_HI20, R_NDS32_PLT_GOTREL_HI20, ++ R_NDS32_TLS_LE_HI20, R_NDS32_TLS_IE_HI20, ++ R_NDS32_TLS_IEGP_HI20, R_NDS32_TLS_DESC_HI20 ++ }; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ seq_len = GET_SEQ_LEN (irel->r_addend); ++ laddr = irel->r_offset; ++ *insn_len = seq_len; ++ ++ /* Get the high part relocation. */ ++ for (i = 0; (unsigned) i < ARRAY_SIZE (checked_types); i++) ++ { ++ hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ checked_types[i], laddr); ++ if (hi_irelfn != irelend) ++ break; ++ } ++ ++ if (hi_irelfn == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_LOADSTORE points to unrecognized " ++ "reloc at 0x%lx.", abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ range_type = GET_LOADSTORE_RANGE (irel->r_addend); ++ nds32_elf_final_sda_base (sec->output_section->owner, ++ link_info, &local_sda, FALSE); ++ ++ switch (ELF32_R_TYPE (hi_irelfn->r_info)) ++ { ++ case R_NDS32_HI20_RELA: ++ insn = bfd_getb32 (contents + laddr); ++ access_addr = ++ calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr); ++ ++ /* Try movi. */ ++ if (range_type == NDS32_LOADSTORE_IMM) ++ { ++ struct elf_link_hash_entry *h = NULL; ++ int indx; ++ ++ if (ELF32_R_SYM (hi_irelfn->r_info) >= symtab_hdr->sh_info) ++ { ++ indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info; ++ h = elf_sym_hashes (abfd)[indx]; ++ } ++ ++ if ((access_addr < CONSERVATIVE_20BIT) ++ && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0))) ++ { ++ eliminate_sethi = 1; ++ break; ++ } ++ } ++ ++ if (!nds32_elf_relax_guard (&access_addr, local_sda, sec, hi_irelfn, ++ NULL, FALSE, table, isymbuf, symtab_hdr)) ++ return FALSE; ++ ++ ++ if (!load_store_relax) ++ return FALSE; ++ ++ /* Case for set gp register. */ ++ if (N32_RT5 (insn) == REG_GP) ++ break; ++ ++ if (range_type == NDS32_LOADSTORE_FLOAT_S ++ || range_type == NDS32_LOADSTORE_FLOAT_S) ++ { ++ range_l = sdata_range[0][0]; ++ range_h = sdata_range[0][1]; ++ } ++ else ++ { ++ range_l = sdata_range[1][0]; ++ range_h = sdata_range[1][1]; ++ } ++ break; ++ ++ case R_NDS32_GOT_HI20: ++ access_addr = ++ calculate_got_memory_address (abfd, link_info, hi_irelfn, symtab_hdr); ++ ++ /* If this symbol is not in .got, the return value will be -1. ++ Since the gp value is set to SDA_BASE but not GLOBAL_OFFSET_TABLE, ++ a negative offset is allowed. */ ++ if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT ++ && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT) ++ eliminate_sethi = 1; ++ break; ++ ++ case R_NDS32_PLT_GOTREL_HI20: ++ access_addr = calculate_plt_memory_address (abfd, link_info, isymbuf, ++ hi_irelfn, symtab_hdr); ++ ++ if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT ++ && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT) ++ eliminate_sethi = 1; ++ break; ++ ++ case R_NDS32_GOTOFF_HI20: ++ access_addr = ++ calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr); ++ ++ if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT ++ && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT) ++ eliminate_sethi = 1; ++ break; ++ ++ case R_NDS32_GOTPC_HI20: ++ /* The access_addr must consider r_addend of hi_irel. */ ++ access_addr = sec->output_section->vma + sec->output_offset ++ + irel->r_offset + hi_irelfn->r_addend; ++ ++ if ((bfd_signed_vma) (local_sda - access_addr) < CONSERVATIVE_20BIT ++ && (bfd_signed_vma) (local_sda - access_addr) >= -CONSERVATIVE_20BIT) ++ eliminate_sethi = 1; ++ break; ++ ++ case R_NDS32_TLS_LE_HI20: ++ access_addr = ++ calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr); ++ BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL); ++ access_addr -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET); ++ if ((range_type == NDS32_LOADSTORE_IMM) ++ && (bfd_signed_vma) (access_addr) < CONSERVATIVE_20BIT ++ && (bfd_signed_vma) (access_addr) >= -CONSERVATIVE_20BIT) ++ eliminate_sethi = 1; ++ break; ++ ++ /* TODO: TLS IE/IEGP */ ++ case R_NDS32_TLS_IE_HI20: ++ case R_NDS32_TLS_IEGP_HI20: ++ break; ++ ++ /* TODO: TLS DESC */ ++ case R_NDS32_TLS_DESC_HI20: ++ break; ++ ++ default: ++ return FALSE; ++ } ++ ++ /* Delete sethi instruction. */ ++ if (eliminate_sethi == 1 ++ || (local_sda <= access_addr && (access_addr - local_sda) < range_h) ++ || (local_sda > access_addr && (local_sda - access_addr) <= range_l)) ++ { ++ hi_irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE); ++ *insn_len = 0; ++ } ++ return TRUE; ++} ++ ++/* Relax LO12 relocation for nds32_elf_relax_section.*/ ++ ++static void ++nds32_elf_relax_lo12 (struct bfd_link_info *link_info, bfd *abfd, ++ asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, bfd_byte *contents, ++ Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr, ++ struct elf_nds32_link_hash_table *table) ++{ ++ uint32_t insn; ++ bfd_vma local_sda, laddr; ++ unsigned long reloc; ++ bfd_vma access_addr; ++ bfd_vma range_l = 0, range_h = 0; /* Upper/lower bound. */ ++ Elf_Internal_Rela *irelfn = NULL, *irelend; ++ struct elf_link_hash_entry *h = NULL; ++ int indx; ++ ++ /* For SDA base relative relaxation. */ ++ nds32_elf_final_sda_base (sec->output_section->owner, link_info, ++ &local_sda, FALSE); ++ ++ irelend = internal_relocs + sec->reloc_count; ++ laddr = irel->r_offset; ++ insn = bfd_getb32 (contents + laddr); ++ ++ if (!is_sda_access_insn (insn) && N32_OP6 (insn) != N32_OP6_ORI) ++ return; ++ ++ access_addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr); ++ ++ if (ELF32_R_SYM (irel->r_info) >= symtab_hdr->sh_info) ++ { ++ indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info; ++ h = elf_sym_hashes (abfd)[indx]; ++ } ++ ++ /* Try movi. */ ++ if (N32_OP6 (insn) == N32_OP6_ORI && access_addr < CONSERVATIVE_20BIT ++ && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0))) ++ { ++ reloc = R_NDS32_20_RELA; ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc); ++ insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0); ++ bfd_putb32 (insn, contents + laddr); ++ } ++ else ++ { ++ if (!nds32_elf_relax_guard (&access_addr, local_sda, sec, irel, NULL, ++ FALSE, table, isymbuf, symtab_hdr)) ++ return; ++ ++ range_l = sdata_range[1][0]; ++ range_h = sdata_range[1][1]; ++ switch (ELF32_R_TYPE (irel->r_info)) ++ { ++ case R_NDS32_LO12S0_RELA: ++ reloc = R_NDS32_SDA19S0_RELA; ++ break; ++ case R_NDS32_LO12S1_RELA: ++ reloc = R_NDS32_SDA18S1_RELA; ++ break; ++ case R_NDS32_LO12S2_RELA: ++ reloc = R_NDS32_SDA17S2_RELA; ++ break; ++ case R_NDS32_LO12S2_DP_RELA: ++ range_l = sdata_range[0][0]; ++ range_h = sdata_range[0][1]; ++ reloc = R_NDS32_SDA12S2_DP_RELA; ++ break; ++ case R_NDS32_LO12S2_SP_RELA: ++ range_l = sdata_range[0][0]; ++ range_h = sdata_range[0][1]; ++ reloc = R_NDS32_SDA12S2_SP_RELA; ++ break; ++ default: ++ return; ++ } ++ ++ /* There are range_h and range_l because linker has to promise ++ all sections move cross one page together. */ ++ if ((local_sda <= access_addr && (access_addr - local_sda) < range_h) ++ || (local_sda > access_addr && (local_sda - access_addr) <= range_l)) ++ { ++ if (N32_OP6 (insn) == N32_OP6_ORI && N32_RT5 (insn) == REG_GP) ++ { ++ /* Maybe we should add R_NDS32_INSN16 reloc type here ++ or manually do some optimization. sethi can't be ++ eliminated when updating $gp so the relative ori ++ needs to be preserved. */ ++ return; ++ } ++ if (!turn_insn_to_sda_access (insn, ELF32_R_TYPE (irel->r_info), ++ &insn)) ++ return; ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc); ++ bfd_putb32 (insn, contents + laddr); ++ ++ irelfn = find_relocs_at_address (irel, internal_relocs, irelend, ++ R_NDS32_INSN16); ++ /* SDA17 must keep INSN16 for converting fp_as_gp. */ ++ if (irelfn != irelend && reloc != R_NDS32_SDA17S2_RELA) ++ irelfn->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_NDS32_NONE); ++ ++ } ++ } ++ return; ++} ++ ++/* Relax low part of PIC instruction pattern. */ ++ ++static void ++nds32_elf_relax_piclo12 (struct bfd_link_info *link_info, bfd *abfd, ++ asection *sec, Elf_Internal_Rela *irel, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ uint32_t insn; ++ bfd_vma local_sda, laddr; ++ bfd_signed_vma foff; ++ unsigned long reloc; ++ ++ nds32_elf_final_sda_base (sec->output_section->owner, link_info, ++ &local_sda, FALSE); ++ laddr = irel->r_offset; ++ insn = bfd_getb32 (contents + laddr); ++ ++ if (N32_OP6 (insn) != N32_OP6_ORI) ++ return; ++ ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12) ++ { ++ foff = calculate_got_memory_address (abfd, link_info, irel, ++ symtab_hdr) - local_sda; ++ reloc = R_NDS32_GOT20; ++ } ++ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12) ++ { ++ foff = calculate_plt_memory_address (abfd, link_info, isymbuf, irel, ++ symtab_hdr) - local_sda; ++ reloc = R_NDS32_PLT_GOTREL_LO20; ++ } ++ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12) ++ { ++ foff = calculate_memory_address (abfd, irel, isymbuf, ++ symtab_hdr) - local_sda; ++ reloc = R_NDS32_GOTOFF; ++ } ++ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12) ++ { ++ foff = local_sda - sec->output_section->vma + sec->output_offset ++ + irel->r_offset + irel->r_addend; ++ reloc = R_NDS32_GOTPC20; ++ } ++ else ++ return; ++ ++ if ((foff < CONSERVATIVE_20BIT) && (foff >= -CONSERVATIVE_20BIT)) ++ { ++ /* Turn into MOVI. */ ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc); ++ insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0); ++ bfd_putb32 (insn, contents + laddr); ++ } ++} ++ ++/* Relax low part of LE TLS instruction pattern. */ ++ ++static void ++nds32_elf_relax_letlslo12 (struct bfd_link_info *link_info, bfd *abfd, ++ Elf_Internal_Rela *irel, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr) ++{ ++ uint32_t insn; ++ bfd_vma laddr; ++ bfd_signed_vma foff; ++ unsigned long reloc; ++ ++ laddr = irel->r_offset; ++ foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr); ++ BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL); ++ foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET); ++ insn = bfd_getb32 (contents + laddr); ++ ++ if ( (bfd_signed_vma) (foff) < CONSERVATIVE_20BIT ++ && (bfd_signed_vma) (foff) >= -CONSERVATIVE_20BIT) ++ { ++ /* Pattern sethi-ori transform to movi. */ ++ reloc = R_NDS32_TLS_LE_20; ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc); ++ insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0); ++ bfd_putb32 (insn, contents + laddr); ++ } ++} ++ ++/* Relax LE TLS calculate address instruction pattern. */ ++ ++static void ++nds32_elf_relax_letlsadd (struct bfd_link_info *link_info, bfd *abfd, ++ asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again) ++{ ++ /* Local TLS non-pic ++ sethi ta, hi20(symbol@tpoff) ; TLS_LE_HI20 ++ ori ta, ta, lo12(symbol@tpoff) ; TLS_LE_LO12 ++ add ra, ta, tp ; TLS_LE_ADD */ ++ ++ uint32_t insn; ++ bfd_vma laddr; ++ bfd_signed_vma foff; ++ Elf_Internal_Rela *i1_irelfn, *irelend; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ laddr = irel->r_offset; ++ insn = bfd_getb32 (contents + laddr); ++ i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend, ++ R_NDS32_PTR_RESOLVED); ++ foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr); ++ BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL); ++ foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET); ++ ++ /* The range is +/-16k. */ ++ if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT ++ && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT) ++ { ++ /* Transform add to addi. */ ++ insn = N32_TYPE2 (ADDI, N32_RT5 (insn), N32_RB5 (insn), 0); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S0); ++ ++ bfd_putb32 (insn, contents + laddr); ++ if (i1_irelfn != irelend) ++ { ++ i1_irelfn->r_addend |= 1; ++ *again = TRUE; ++ } ++ } ++} ++ ++/* Relax LE TLS load store instruction pattern. */ ++ ++static void ++nds32_elf_relax_letlsls (struct bfd_link_info *link_info, bfd *abfd, ++ asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again) ++{ ++ uint32_t insn; ++ bfd_vma laddr; ++ bfd_signed_vma foff; ++ Elf_Internal_Rela *i1_irelfn, *irelend; ++ int success = 0; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ laddr = irel->r_offset; ++ insn = bfd_getb32 (contents + laddr); ++ i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend, ++ R_NDS32_PTR_RESOLVED); ++ foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr); ++ BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL); ++ foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET); ++ ++ switch ((N32_OP6 (insn) << 8) | (insn & 0xff)) ++ { ++ case (N32_OP6_MEM << 8) | N32_MEM_LB: ++ case (N32_OP6_MEM << 8) | N32_MEM_SB: ++ case (N32_OP6_MEM << 8) | N32_MEM_LBS: ++ /* The range is +/-16k. */ ++ if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT ++ && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT) ++ { ++ insn = ++ ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S0); ++ success = 1; ++ break; ++ } ++ case (N32_OP6_MEM << 8) | N32_MEM_LH: ++ case (N32_OP6_MEM << 8) | N32_MEM_SH: ++ case (N32_OP6_MEM << 8) | N32_MEM_LHS: ++ /* The range is +/-32k. */ ++ if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT_S1 ++ && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT_S1) ++ { ++ insn = ++ ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S1); ++ success = 1; ++ break; ++ } ++ case (N32_OP6_MEM << 8) | N32_MEM_LW: ++ case (N32_OP6_MEM << 8) | N32_MEM_SW: ++ /* The range is +/-64k. */ ++ if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT_S2 ++ && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT_S2) ++ { ++ insn = ++ ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S2); ++ success = 1; ++ break; ++ } ++ default: ++ break; ++ } ++ ++ if (success) ++ { ++ bfd_putb32 (insn, contents + laddr); ++ if (i1_irelfn != irelend) ++ { ++ i1_irelfn->r_addend |= 1; ++ *again = TRUE; ++ } ++ } ++} ++ ++/* Relax PTR relocation for nds32_elf_relax_section. */ ++ ++static bfd_boolean ++nds32_elf_relax_ptr (bfd *abfd, asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, int *insn_len, ++ int *seq_len, bfd_byte *contents) ++{ ++ Elf_Internal_Rela *ptr_irel, *irelend, *count_irel, *re_irel; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ ++ re_irel = ++ find_relocs_at_address_addr (irel, internal_relocs, irelend, ++ R_NDS32_PTR_RESOLVED, irel->r_addend); ++ ++ if (re_irel == irelend) ++ { ++ (*_bfd_error_handler) ++ ("%B: warning: R_NDS32_PTR points to unrecognized reloc at 0x%lx.", ++ abfd, (long) irel->r_offset); ++ return FALSE; ++ } ++ ++ if (re_irel->r_addend != 1) ++ return FALSE; ++ ++ /* Pointed target is relaxed and no longer needs this void *, ++ change the type to NONE. */ ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE); ++ ++ /* Find PTR_COUNT to decide remove it or not. If PTR_COUNT does ++ not exist, it means only count 1 and remove it directly. */ ++ /* TODO: I hope we can obsolate R_NDS32_COUNT in the future. */ ++ count_irel = find_relocs_at_address (irel, internal_relocs, irelend, ++ R_NDS32_PTR_COUNT); ++ ptr_irel = find_relocs_at_address (irel, internal_relocs, irelend, ++ R_NDS32_PTR); ++ if (count_irel != irelend) ++ { ++ if (--count_irel->r_addend > 0) ++ return FALSE; ++ } ++ ++ if (ptr_irel != irelend) ++ return FALSE; ++ ++ /* If the PTR_COUNT is already 0, remove current instruction. */ ++ *seq_len = nds32_elf_insn_size (abfd, contents, irel->r_offset); ++ *insn_len = 0; ++ return TRUE; ++} ++ ++/* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section. */ ++ ++static void ++nds32_elf_relax_pltgot_suff (struct bfd_link_info *link_info, bfd *abfd, ++ asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again) ++{ ++ uint32_t insn; ++ bfd_signed_vma foff; ++ Elf_Internal_Rela *i1_irelfn, *irelend; ++ bfd_vma local_sda, laddr; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ laddr = irel->r_offset; ++ insn = bfd_getb32 (contents + laddr); ++ ++ /* FIXME: It's a little trouble to turn JRAL5 to JAL since ++ we need additional space. It might be help if we could ++ borrow some space from instructions to be eliminated ++ such as sethi, ori, add. */ ++ if (insn & 0x80000000) ++ return; ++ ++ if (nds32_elf_check_dup_relocs ++ (irel, internal_relocs, irelend, R_NDS32_PLT_GOT_SUFF)) ++ return; ++ ++ i1_irelfn = ++ find_relocs_at_address (irel, internal_relocs, irelend, ++ R_NDS32_PTR_RESOLVED); ++ ++ /* FIXIT 090606 ++ The boundary should be reduced since the .plt section hasn't ++ been created and the address of specific entry is still unknown ++ Maybe the range between the function call and the begin of the ++ .text section can be used to decide if the .plt is in the range ++ of function call. */ ++ ++ if (N32_OP6 (insn) == N32_OP6_ALU1 ++ && N32_SUB5 (insn) == N32_ALU1_ADD) ++ { ++ /* Get the value of the symbol referred to by the reloc. */ ++ nds32_elf_final_sda_base (sec->output_section->owner, link_info, ++ &local_sda, FALSE); ++ foff = (bfd_signed_vma) (calculate_plt_memory_address ++ (abfd, link_info, isymbuf, irel, ++ symtab_hdr) - local_sda); ++ /* This condition only happened when symbol is undefined. */ ++ if (foff == 0) ++ return; ++ ++ if (foff < -CONSERVATIVE_19BIT || foff >= CONSERVATIVE_19BIT) ++ return; ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), ++ R_NDS32_PLT_GOTREL_LO19); ++ /* addi.gp */ ++ insn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19)); ++ } ++ else if (N32_OP6 (insn) == N32_OP6_JREG ++ && N32_SUB5 (insn) == N32_JREG_JRAL) ++ { ++ /* Get the value of the symbol referred to by the reloc. */ ++ foff = ++ calculate_plt_offset (abfd, sec, link_info, isymbuf, irel, symtab_hdr); ++ /* This condition only happened when symbol is undefined. */ ++ if (foff == 0) ++ return; ++ if (foff < -CONSERVATIVE_24BIT_S1 || foff >= CONSERVATIVE_24BIT_S1) ++ return; ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_25_PLTREL); ++ insn = INSN_JAL; ++ } ++ else ++ return; ++ ++ bfd_putb32 (insn, contents + laddr); ++ if (i1_irelfn != irelend) ++ { ++ i1_irelfn->r_addend |= 1; ++ *again = TRUE; ++ } ++} ++ ++/* Relax GOT_SUFF relocation for nds32_elf_relax_section. */ ++ ++static void ++nds32_elf_relax_got_suff (struct bfd_link_info *link_info, bfd *abfd, ++ asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, ++ bfd_byte *contents, Elf_Internal_Shdr *symtab_hdr, ++ bfd_boolean *again) ++{ ++ uint32_t insn; ++ bfd_signed_vma foff; ++ Elf_Internal_Rela *i1_irelfn, *irelend; ++ bfd_vma local_sda, laddr; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ laddr = irel->r_offset; ++ insn = bfd_getb32 (contents + laddr); ++ if (insn & 0x80000000) ++ return; ++ ++ if (nds32_elf_check_dup_relocs ++ (irel, internal_relocs, irelend, R_NDS32_GOT_SUFF)) ++ return; ++ ++ i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend, ++ R_NDS32_PTR_RESOLVED); ++ ++ nds32_elf_final_sda_base (sec->output_section->owner, link_info, ++ &local_sda, FALSE); ++ foff = calculate_got_memory_address (abfd, link_info, irel, ++ symtab_hdr) - local_sda; ++ ++ if (foff < CONSERVATIVE_19BIT && foff >= -CONSERVATIVE_19BIT) ++ { ++ /* Turn LW to LWI.GP. Change relocation type to R_NDS32_GOT_REL. */ ++ insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3)); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_GOT17S2_RELA); ++ bfd_putb32 (insn, contents + laddr); ++ if (i1_irelfn != irelend) ++ { ++ i1_irelfn->r_addend |= 1; ++ *again = TRUE; ++ } ++ } ++} ++ ++/* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section. */ ++ ++static void ++nds32_elf_relax_gotoff_suff (struct bfd_link_info *link_info, bfd *abfd, ++ asection *sec, Elf_Internal_Rela *irel, ++ Elf_Internal_Rela *internal_relocs, ++ bfd_byte *contents, Elf_Internal_Sym *isymbuf, ++ Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again) ++{ ++ int opc_insn_gotoff; ++ uint32_t insn; ++ bfd_signed_vma foff; ++ Elf_Internal_Rela *i1_irelfn, *i2_irelfn, *irelend; ++ bfd_vma local_sda, laddr; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ laddr = irel->r_offset; ++ insn = bfd_getb32 (contents + laddr); ++ ++ if (insn & 0x80000000) ++ return; ++ ++ if (nds32_elf_check_dup_relocs ++ (irel, internal_relocs, irelend, R_NDS32_GOTOFF_SUFF)) ++ return; ++ ++ i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend, ++ R_NDS32_PTR_RESOLVED); ++ nds32_elf_final_sda_base (sec->output_section->owner, link_info, ++ &local_sda, FALSE); ++ foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr); ++ foff = foff - local_sda; ++ ++ if (foff >= CONSERVATIVE_19BIT || foff < -CONSERVATIVE_19BIT) ++ return; ++ ++ /* Concatenate opcode and sub-opcode for switch case. ++ It may be MEM or ALU1. */ ++ opc_insn_gotoff = (N32_OP6 (insn) << 8) | (insn & 0xff); ++ switch (opc_insn_gotoff) ++ { ++ case (N32_OP6_MEM << 8) | N32_MEM_LW: ++ /* 4-byte aligned. */ ++ insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3)); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA17S2_RELA); ++ break; ++ case (N32_OP6_MEM << 8) | N32_MEM_SW: ++ insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3)); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA17S2_RELA); ++ break; ++ case (N32_OP6_MEM << 8) | N32_MEM_LH: ++ /* 2-byte aligned. */ ++ insn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA); ++ break; ++ case (N32_OP6_MEM << 8) | N32_MEM_LHS: ++ insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (18)); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA); ++ break; ++ case (N32_OP6_MEM << 8) | N32_MEM_SH: ++ insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (19)); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA); ++ break; ++ case (N32_OP6_MEM << 8) | N32_MEM_LB: ++ /* 1-byte aligned. */ ++ insn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA); ++ break; ++ case (N32_OP6_MEM << 8) | N32_MEM_LBS: ++ insn = N32_TYPE1 (LBGP, N32_RT5 (insn), __BIT (19)); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA); ++ break; ++ case (N32_OP6_MEM << 8) | N32_MEM_SB: ++ insn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA); ++ break; ++ case (N32_OP6_ALU1 << 8) | N32_ALU1_ADD: ++ insn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19)); ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA); ++ break; ++ default: ++ return; ++ } ++ ++ bfd_putb32 (insn, contents + laddr); ++ if (i1_irelfn != irelend) ++ { ++ i1_irelfn->r_addend |= 1; ++ *again = TRUE; ++ } ++ if ((i2_irelfn = find_relocs_at_address (irel, internal_relocs, irelend, ++ R_NDS32_INSN16)) != irelend) ++ i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE); ++ ++} ++ ++static bfd_boolean ++nds32_relax_adjust_label (bfd *abfd, asection *sec, ++ Elf_Internal_Rela *internal_relocs, ++ bfd_byte *contents, ++ nds32_elf_blank_t **relax_blank_list, ++ int optimize, int opt_size) ++{ ++ /* This code block is used to adjust 4-byte alignment by relax a pair ++ of instruction a time. ++ ++ It recognizes three types of relocations. ++ 1. R_NDS32_LABEL - a alignment. ++ 2. R_NDS32_INSN16 - relax a 32-bit instruction to 16-bit. ++ 3. is_16bit_NOP () - remove a 16-bit instruction. */ ++ ++ /* TODO: It seems currently implementation only support 4-byte alignment. ++ We should handle any-alignment. */ ++ ++ Elf_Internal_Rela *insn_rel = NULL, *label_rel = NULL, *irel; ++ Elf_Internal_Rela *tmp_rel, *tmp2_rel = NULL; ++ Elf_Internal_Rela rel_temp; ++ Elf_Internal_Rela *irelend; ++ bfd_vma address; ++ uint16_t insn16; ++ ++ /* Checking for branch relaxation relies on the relocations to ++ be sorted on 'r_offset'. This is not guaranteed so we must sort. */ ++ nds32_insertion_sort (internal_relocs, sec->reloc_count, ++ sizeof (Elf_Internal_Rela), compar_reloc); ++ ++ irelend = internal_relocs + sec->reloc_count; ++ ++ /* Force R_NDS32_LABEL before R_NDS32_INSN16. */ ++ /* FIXME: Can we generate the right order in assembler? ++ So we don't have to swapping them here. */ ++ ++ for (label_rel = internal_relocs, insn_rel = internal_relocs; ++ label_rel < irelend; label_rel++) ++ { ++ if (ELF32_R_TYPE (label_rel->r_info) != R_NDS32_LABEL) ++ continue; ++ ++ /* Find the first reloc has the same offset with label_rel. */ ++ while (insn_rel < irelend && insn_rel->r_offset < label_rel->r_offset) ++ insn_rel++; ++ ++ for (;insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset; ++ insn_rel++) ++ /* Check if there were R_NDS32_INSN16 and R_NDS32_LABEL at the same ++ address. */ ++ if (ELF32_R_TYPE (insn_rel->r_info) == R_NDS32_INSN16) ++ break; ++ ++ if (insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset ++ && insn_rel < label_rel) ++ { ++ /* Swap the two reloc if the R_NDS32_INSN16 is ++ before R_NDS32_LABEL. */ ++ memcpy (&rel_temp, insn_rel, sizeof (Elf_Internal_Rela)); ++ memcpy (insn_rel, label_rel, sizeof (Elf_Internal_Rela)); ++ memcpy (label_rel, &rel_temp, sizeof (Elf_Internal_Rela)); ++ } ++ } ++ ++ label_rel = NULL; ++ insn_rel = NULL; ++ /* If there were a sequence of R_NDS32_LABEL end up with .align 2 ++ or higher, remove other R_NDS32_LABEL with lower alignment. ++ If an R_NDS32_INSN16 in between R_NDS32_LABELs must be converted, ++ then the R_NDS32_LABEL sequence is broke. */ ++ for (tmp_rel = internal_relocs; tmp_rel < irelend; tmp_rel++) ++ { ++ if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_LABEL) ++ { ++ if (label_rel == NULL) ++ { ++ if (tmp_rel->r_addend < 2) ++ label_rel = tmp_rel; ++ continue; ++ } ++ else if (tmp_rel->r_addend > 1) ++ { ++ /* Remove all LABEL relocation from label_rel to tmp_rel ++ including relocations with same offset as tmp_rel. */ ++ for (tmp2_rel = label_rel; tmp2_rel < tmp_rel; tmp2_rel++) ++ { ++ if (tmp2_rel->r_offset == tmp_rel->r_offset) ++ break; ++ ++ if (ELF32_R_TYPE (tmp2_rel->r_info) == R_NDS32_LABEL ++ && tmp2_rel->r_addend < 2) ++ tmp2_rel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (tmp2_rel->r_info), ++ R_NDS32_NONE); ++ } ++ label_rel = NULL; ++ } ++ } ++ else if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16 && label_rel) ++ { ++ /* A new INSN16 which can be converted, so clear label_rel. */ ++ if (is_convert_32_to_16 (abfd, sec, tmp_rel, internal_relocs, ++ irelend, &insn16) ++ || is_16bit_NOP (abfd, sec, tmp_rel)) ++ label_rel = NULL; ++ } ++ } ++ ++ label_rel = NULL; ++ insn_rel = NULL; ++ /* Optimized for speed and nothing has not been relaxed. ++ It's time to align labels. ++ We may convert a 16-bit instruction right before a label to ++ 32-bit, in order to align the label if necessary ++ all reloc entries has been sorted by r_offset. */ ++ for (irel = internal_relocs; ++ irel < irelend && irel->r_offset < sec->size; irel++) ++ { ++ if (ELF32_R_TYPE (irel->r_info) != R_NDS32_INSN16 ++ && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL) ++ continue; ++ ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_INSN16) ++ { ++ /* A new INSN16 found, resize the old one. */ ++ if (is_convert_32_to_16 ++ (abfd, sec, irel, internal_relocs, irelend, &insn16) ++ || is_16bit_NOP (abfd, sec, irel)) ++ { ++ if (insn_rel) ++ { ++ /* Previous INSN16 reloc exists, reduce its ++ size to 16-bit. */ ++ if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs, ++ irelend, &insn16)) ++ { ++ nds32_elf_write_16 (abfd, contents, insn_rel, ++ internal_relocs, irelend, insn16); ++ ++ if (!insert_nds32_elf_blank_recalc_total ++ (relax_blank_list, insn_rel->r_offset + 2, 2)) ++ return FALSE; ++ } ++ else if (is_16bit_NOP (abfd, sec, insn_rel)) ++ { ++ if (!insert_nds32_elf_blank_recalc_total ++ (relax_blank_list, insn_rel->r_offset, 2)) ++ return FALSE; ++ } ++ insn_rel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info), R_NDS32_NONE); ++ } ++ /* Save the new one for later use. */ ++ insn_rel = irel; ++ } ++ else ++ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), ++ R_NDS32_NONE); ++ } ++ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL) ++ { ++ /* Search for label. */ ++ int force_relax = 0; ++ ++ /* Label on 16-bit instruction or optimization ++ needless, just reset this reloc. */ ++ insn16 = bfd_getb16 (contents + irel->r_offset); ++ if ((irel->r_addend & 0x1f) < 2 && (!optimize || (insn16 & 0x8000))) ++ { ++ irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE); ++ continue; ++ } ++ ++ address = ++ irel->r_offset - get_nds32_elf_blank_total (relax_blank_list, ++ irel->r_offset, 1); ++ ++ if (!insn_rel) ++ { ++ /* Check if there is case which can not be aligned. */ ++ if (irel->r_addend == 2 && address & 0x2) ++ return FALSE; ++ continue; ++ } ++ ++ /* Try to align this label. */ ++ ++ if ((irel->r_addend & 0x1f) < 2) ++ { ++ /* Check if there is a INSN16 at the same address. ++ Label_rel always seats before insn_rel after ++ our sort. */ ++ ++ /* Search for INSN16 at LABEL location. If INSN16 is at ++ same location and this LABEL alignment is lower than 2, ++ the INSN16 can be converted to 2-byte. */ ++ for (tmp_rel = irel; ++ tmp_rel < irelend && tmp_rel->r_offset == irel->r_offset; ++ tmp_rel++) ++ { ++ if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16 ++ && (is_convert_32_to_16 ++ (abfd, sec, tmp_rel, internal_relocs, ++ irelend, &insn16) ++ || is_16bit_NOP (abfd, sec, tmp_rel))) ++ { ++ force_relax = 1; ++ break; ++ } ++ } ++ } ++ ++ if (force_relax || irel->r_addend == 1 || address & 0x2) ++ { ++ /* Label not aligned. */ ++ /* Previous reloc exists, reduce its size to 16-bit. */ ++ if (is_convert_32_to_16 (abfd, sec, insn_rel, ++ internal_relocs, irelend, &insn16)) ++ { ++ nds32_elf_write_16 (abfd, contents, insn_rel, ++ internal_relocs, irelend, insn16); ++ ++ if (!insert_nds32_elf_blank_recalc_total ++ (relax_blank_list, insn_rel->r_offset + 2, 2)) ++ return FALSE; ++ } ++ else if (is_16bit_NOP (abfd, sec, insn_rel)) ++ { ++ if (!insert_nds32_elf_blank_recalc_total ++ (relax_blank_list, insn_rel->r_offset, 2)) ++ return FALSE; ++ } ++ ++ } ++ /* INSN16 reloc is used. */ ++ insn_rel = NULL; ++ } ++ } ++ ++ address = ++ sec->size - get_nds32_elf_blank_total (relax_blank_list, sec->size, 0); ++ if (insn_rel && (address & 0x2 || opt_size)) ++ { ++ if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs, ++ irelend, &insn16)) ++ { ++ nds32_elf_write_16 (abfd, contents, insn_rel, internal_relocs, ++ irelend, insn16); ++ if (!insert_nds32_elf_blank_recalc_total ++ (relax_blank_list, insn_rel->r_offset + 2, 2)) ++ return FALSE; ++ insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info), ++ R_NDS32_NONE); ++ } ++ else if (is_16bit_NOP (abfd, sec, insn_rel)) ++ { ++ if (!insert_nds32_elf_blank_recalc_total ++ (relax_blank_list, insn_rel->r_offset, 2)) ++ return FALSE; ++ insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info), ++ R_NDS32_NONE); ++ } ++ } ++ insn_rel = NULL; ++ return TRUE; ++} ++ ++/* Pick relaxation round. */ ++ ++static int ++nds32_elf_pick_relax (bfd_boolean init, asection *sec, bfd_boolean *again, ++ struct elf_nds32_link_hash_table *table, ++ struct bfd_link_info *link_info) ++{ ++ static asection *final_sec, *first_sec = NULL; ++ static bfd_boolean normal_again = FALSE; ++ static bfd_boolean set = FALSE; ++ static bfd_boolean first = TRUE; ++ int round_table[] = { ++ NDS32_RELAX_IFC_ROUND, ++ NDS32_RELAX_NORMAL_ROUND, ++ NDS32_RELAX_JUMP_IFC_ROUND, ++ NDS32_RELAX_EX9_BUILD_ROUND, ++ NDS32_RELAX_EX9_REPLACE_ROUND, ++ }; ++ static int pass = 0; ++ static int relax_round; ++ ++ /* The new round. */ ++ if (init && first_sec == sec) ++ { ++ set = TRUE; ++ normal_again = FALSE; ++ } ++ ++ if (first) ++ { ++ /* Run an empty run to get the final section. */ ++ relax_round = NDS32_RELAX_EMPTY_ROUND; ++ ++ /* We have to do ifc optimization before general relax. ++ Decide the first round here. */ ++ if (table->target_optimize & NDS32_RELAX_IFC_ON) ++ pass = 0; ++ else ++ pass = 1; ++ ++ /* It has to enter relax again because we can ++ not make sure what the final turn is. */ ++ *again = TRUE; ++ ++ first = FALSE; ++ first_sec = sec; ++ } ++ ++ if (!set) ++ { ++ /* Not reenter yet. */ ++ final_sec = sec; ++ return relax_round; ++ } ++ ++ relax_round = round_table[pass]; ++ ++ if (!init && relax_round == NDS32_RELAX_NORMAL_ROUND && *again) ++ normal_again = TRUE; ++ ++ if (!init && final_sec == sec) ++ { ++ switch (relax_round) ++ { ++ case NDS32_RELAX_IFC_ROUND: ++ nds32_elf_ifc_cse_algo (link_info); ++ *again = TRUE; ++ pass++; ++ break; ++ case NDS32_RELAX_NORMAL_ROUND: ++ if (!normal_again) ++ { ++ /* Normal relaxation done. */ ++ if (table->target_optimize & NDS32_RELAX_IFC_ON) ++ { ++ pass++; ++ *again = TRUE; ++ } ++ else if (table->target_optimize & NDS32_RELAX_EX9_ON) ++ { ++ pass += 2; /* NDS32_RELAX_EX9_BUILD_ROUND */ ++ *again = TRUE; ++ } ++ else if (table->ex9_import_file) ++ { ++ /* Import ex9 table. */ ++ if (table->update_ex9_table) ++ pass += 2; /* NDS32_RELAX_EX9_BUILD_ROUND */ ++ else ++ pass += 3; /* NDS32_RELAX_EX9_REPLACE_ROUND */ ++ nds32_elf_ex9_import_table (link_info); ++ *again = TRUE; ++ } ++ } ++ break; ++ case NDS32_RELAX_JUMP_IFC_ROUND: ++ if (!nds32_elf_ifc_finish (link_info)) ++ (*_bfd_error_handler) (_("error: Jump IFC Fail.")); ++ if (table->target_optimize & NDS32_RELAX_EX9_ON) ++ { ++ pass++; ++ *again = TRUE; ++ } ++ break; ++ case NDS32_RELAX_EX9_BUILD_ROUND: ++ nds32_elf_ex9_finish (link_info); ++ pass++; ++ *again = TRUE; ++ break; ++ case NDS32_RELAX_EX9_REPLACE_ROUND: ++ if (table->target_optimize & NDS32_RELAX_IFC_ON) ++ { ++ /* Do jump IFC optimization again. */ ++ if (!nds32_elf_ifc_finish (link_info)) ++ (*_bfd_error_handler) (_("error: Jump IFC Fail.")); ++ } ++ break; ++ default: ++ break; ++ } ++ } ++ ++ return relax_round; ++} ++ ++static bfd_boolean ++nds32_elf_relax_section (bfd *abfd, asection *sec, ++ struct bfd_link_info *link_info, bfd_boolean *again) ++{ ++ nds32_elf_blank_t *relax_blank_list = NULL; ++ Elf_Internal_Shdr *symtab_hdr; ++ Elf_Internal_Rela *internal_relocs; ++ Elf_Internal_Rela *irel; ++ Elf_Internal_Rela *irelend; ++ Elf_Internal_Sym *isymbuf = NULL; ++ bfd_byte *contents = NULL; ++ bfd_boolean result = TRUE; ++ int optimize = 0; ++ int opt_size = 0; ++ uint32_t insn; ++ uint16_t insn16; ++ ++ /* Target dependent option. */ ++ struct elf_nds32_link_hash_table *table; ++ int load_store_relax; ++ int relax_round; ++ ++ relax_blank_list = NULL; ++ *again = FALSE; ++ ++ /* Nothing to do for ++ relocatable link or ++ non-relocatable section or ++ non-code section or ++ empty content or ++ no reloc entry. */ ++ if (link_info->relocatable ++ || (sec->flags & SEC_RELOC) == 0 ++ || (sec->flags & SEC_EXCLUDE) == 1 ++ || (sec->flags & SEC_CODE) == 0 ++ || sec->size == 0 ++ || sec->reloc_count == 0) ++ return TRUE; ++ ++ /* 09.12.11 Workaround. */ ++ /* We have to adjust align for R_NDS32_LABEL if needed. ++ The adjust approach only can fix 2-byte align once. */ ++ if (sec->alignment_power > 2) ++ return TRUE; ++ ++#ifdef NDS32_LINUX_TOOLCHAIN ++ /* Do TLS model conversion once at first. */ ++ nds32_elf_unify_tls_model (abfd, sec, contents, link_info); ++#endif ++ ++ /* The optimization type to do. */ ++ ++ table = nds32_elf_hash_table (link_info); ++ relax_round = nds32_elf_pick_relax (TRUE, sec, again, table, link_info); ++ ++ switch (relax_round) ++ { ++ case NDS32_RELAX_JUMP_IFC_ROUND: ++ /* Here is the entrance of ifc jump relaxation. */ ++ if (!nds32_elf_ifc_calc (link_info, abfd, sec)) ++ return FALSE; ++ nds32_elf_pick_relax (FALSE, sec, again, table, link_info); ++ return TRUE; ++ ++ case NDS32_RELAX_EX9_BUILD_ROUND: ++ /* Here is the entrance of ex9 relaxation. There are two pass of ++ ex9 relaxation. The one is to traverse all instructions and build ++ the hash table. The other one is to compare instructions and replace ++ it by ex9.it. */ ++ if (!nds32_elf_ex9_build_hash_table (abfd, sec, link_info)) ++ return FALSE; ++ nds32_elf_pick_relax (FALSE, sec, again, table, link_info); ++ return TRUE; ++ ++ case NDS32_RELAX_EX9_REPLACE_ROUND: ++ if (!nds32_elf_ex9_replace_instruction (link_info, abfd, sec)) ++ return FALSE; ++ return TRUE; ++ ++ case NDS32_RELAX_IFC_ROUND: ++ /* The entrance of link time ifc. We must to do it before all relaxation ++ beginging, because it may magnify size. */ ++ if (!nds32_elf_ifc_trace_code (link_info, abfd, sec)) ++ return FALSE; ++ nds32_elf_pick_relax (FALSE, sec, again, table, link_info); ++ return TRUE; ++ ++ case NDS32_RELAX_EMPTY_ROUND: ++ nds32_elf_pick_relax (FALSE, sec, again, table, link_info); ++ return TRUE; ++ ++ case NDS32_RELAX_NORMAL_ROUND: ++ /* Save the first section for abs symbol relaxation. */ ++ nds32_elf_relax_guard (NULL, 0, sec, NULL, again, TRUE, ++ table, NULL, NULL); ++ default: ++ if (sec->reloc_count == 0) ++ return TRUE; ++ break; ++ } ++ ++ /* The begining of general relaxation. */ ++ ++ if (is_SDA_BASE_set == 0) ++ { ++ bfd_vma gp; ++ is_SDA_BASE_set = 1; ++ nds32_elf_final_sda_base (sec->output_section->owner, link_info, ++ &gp, FALSE); ++ relax_range_measurement (abfd); ++ } ++ ++ if (is_ITB_BASE_set == 0) ++ { ++ /* Set the _ITB_BASE_. */ ++ if (!nds32_elf_ex9_itb_base (link_info)) ++ { ++ (*_bfd_error_handler) (_("%B: error: Cannot set _ITB_BASE_"), abfd); ++ bfd_set_error (bfd_error_bad_value); ++ } ++ } ++ ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ /* Relocations MUST be kept in memory, because relaxation adjust them. */ ++ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, ++ TRUE /* keep_memory */); ++ if (internal_relocs == NULL) ++ goto error_return; ++ ++ irelend = internal_relocs + sec->reloc_count; ++ irel = find_relocs_at_address (internal_relocs, internal_relocs, ++ irelend, R_NDS32_RELAX_ENTRY); ++ ++ if (irel == irelend) ++ return TRUE; ++ ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY) ++ { ++ if (irel->r_addend & R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG) ++ { ++ nds32_elf_pick_relax (FALSE, sec, again, table, link_info); ++ return TRUE; ++ } ++ ++ if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG) ++ optimize = 1; ++ ++ if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG) ++ opt_size = 1; ++ } ++ ++ load_store_relax = table->load_store_relax; ++ ++ /* Get symbol table and section content. */ ++ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE) ++ || !nds32_get_local_syms (abfd, sec, &isymbuf)) ++ goto error_return; ++ ++ /* Do relax loop only when finalize is not done. ++ Take care of relaxable relocs except INSN16. */ ++ for (irel = internal_relocs; irel < irelend; irel++) ++ { ++ int seq_len; /* Original length of instruction sequence. */ ++ int insn_len = 0; /* Final length of instruction sequence. */ ++ bfd_boolean removed; ++ ++ insn = 0; ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL ++ && (irel->r_addend & 0x1f) >= 2) ++ optimize = 1; ++ ++ /* Relocation Types ++ R_NDS32_LONGCALL1 53 ++ R_NDS32_LONGCALL2 54 ++ R_NDS32_LONGCALL3 55 ++ R_NDS32_LONGJUMP1 56 ++ R_NDS32_LONGJUMP2 57 ++ R_NDS32_LONGJUMP3 58 ++ R_NDS32_LOADSTORE 59 */ ++ if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL1 ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LOADSTORE) ++ seq_len = GET_SEQ_LEN (irel->r_addend); ++ ++ /* Relocation Types ++ R_NDS32_LONGCALL4 107 ++ R_NDS32_LONGCALL5 108 ++ R_NDS32_LONGCALL6 109 ++ R_NDS32_LONGJUMP4 110 ++ R_NDS32_LONGJUMP5 111 ++ R_NDS32_LONGJUMP6 112 ++ R_NDS32_LONGJUMP7 113 */ ++ else if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL4 ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LONGJUMP7) ++ seq_len = 4; ++ ++ /* Relocation Types ++ R_NDS32_LO12S0_RELA 30 ++ R_NDS32_LO12S1_RELA 29 ++ R_NDS32_LO12S2_RELA 28 ++ R_NDS32_LO12S2_SP_RELA 71 ++ R_NDS32_LO12S2_DP_RELA 70 ++ R_NDS32_GOT_LO12 46 ++ R_NDS32_GOTOFF_LO12 50 ++ R_NDS32_PLTREL_LO12 65 ++ R_NDS32_PLT_GOTREL_LO12 67 ++ R_NDS32_17IFC_PCREL_RELA 96 ++ R_NDS32_GOT_SUFF 193 ++ R_NDS32_GOTOFF_SUFF 194 ++ R_NDS32_PLT_GOT_SUFF 195 ++ R_NDS32_MULCALL_SUFF 196 ++ R_NDS32_PTR 197 */ ++ else if ((ELF32_R_TYPE (irel->r_info) <= R_NDS32_LO12S0_RELA ++ && ELF32_R_TYPE (irel->r_info) >= R_NDS32_LO12S2_RELA) ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_SP_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_DP_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12 ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12 ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12 ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLTREL_LO12 ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12 ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_GOT_SUFF ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_PTR) ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LO12 ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_ADD ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LS) ++ seq_len = 0; ++ else ++ continue; ++ ++ insn_len = seq_len; ++ removed = FALSE; ++ ++ switch (ELF32_R_TYPE (irel->r_info)) ++ { ++ case R_NDS32_LONGCALL1: ++ removed = nds32_elf_relax_longcall1 (abfd, sec, irel, internal_relocs, ++ &insn_len, contents, isymbuf, ++ symtab_hdr); ++ break; ++ case R_NDS32_LONGCALL2: ++ removed = nds32_elf_relax_longcall2 (abfd, sec, irel, internal_relocs, ++ &insn_len, contents, isymbuf, ++ symtab_hdr); ++ break; ++ case R_NDS32_LONGCALL3: ++ removed = nds32_elf_relax_longcall3 (abfd, sec, irel, internal_relocs, ++ &insn_len, contents, isymbuf, ++ symtab_hdr); ++ break; ++ case R_NDS32_LONGJUMP1: ++ removed = nds32_elf_relax_longjump1 (abfd, sec, irel, internal_relocs, ++ &insn_len, contents, isymbuf, ++ symtab_hdr); ++ break; ++ case R_NDS32_LONGJUMP2: ++ removed = nds32_elf_relax_longjump2 (abfd, sec, irel, internal_relocs, ++ &insn_len, contents, isymbuf, ++ symtab_hdr); ++ break; ++ case R_NDS32_LONGJUMP3: ++ removed = nds32_elf_relax_longjump3 (abfd, sec, irel, internal_relocs, ++ &insn_len, contents, isymbuf, ++ symtab_hdr); ++ break; ++ case R_NDS32_LONGCALL4: ++ removed = nds32_elf_relax_longcall4 (abfd, sec, irel, internal_relocs, ++ &insn_len, contents, isymbuf, ++ symtab_hdr); ++ break; ++ case R_NDS32_LONGCALL5: ++ removed = nds32_elf_relax_longcall5 (abfd, sec, irel, internal_relocs, ++ &insn_len, contents, isymbuf, ++ symtab_hdr); ++ break; ++ case R_NDS32_LONGCALL6: ++ removed = nds32_elf_relax_longcall6 (abfd, sec, irel, internal_relocs, ++ &insn_len, contents, isymbuf, ++ symtab_hdr); ++ break; ++ case R_NDS32_LONGJUMP4: ++ removed = nds32_elf_relax_longjump4 (abfd, sec, irel, internal_relocs, ++ &insn_len, contents, isymbuf, ++ symtab_hdr); ++ break; ++ case R_NDS32_LONGJUMP5: ++ removed = nds32_elf_relax_longjump5 (abfd, sec, irel, internal_relocs, ++ &insn_len, &seq_len, contents, ++ isymbuf, symtab_hdr); ++ break; ++ case R_NDS32_LONGJUMP6: ++ removed = nds32_elf_relax_longjump6 (abfd, sec, irel, internal_relocs, ++ &insn_len, &seq_len, contents, ++ isymbuf, symtab_hdr); ++ break; ++ case R_NDS32_LONGJUMP7: ++ removed = nds32_elf_relax_longjump7 (abfd, sec, irel, internal_relocs, ++ &insn_len, &seq_len, contents, ++ isymbuf, symtab_hdr); ++ break; ++ case R_NDS32_LOADSTORE: ++ removed = nds32_elf_relax_loadstore (link_info, abfd, sec, irel, ++ internal_relocs, &insn_len, ++ contents, isymbuf, symtab_hdr, ++ load_store_relax, table); ++ break; ++ case R_NDS32_LO12S0_RELA: ++ case R_NDS32_LO12S1_RELA: ++ case R_NDS32_LO12S2_RELA: ++ case R_NDS32_LO12S2_DP_RELA: ++ case R_NDS32_LO12S2_SP_RELA: ++ /* Relax for low part. */ ++ nds32_elf_relax_lo12 (link_info, abfd, sec, irel, internal_relocs, ++ contents, isymbuf, symtab_hdr, table); ++ ++ /* It is impossible to delete blank, so just continue. */ ++ continue; ++ case R_NDS32_GOT_LO12: ++ case R_NDS32_GOTOFF_LO12: ++ case R_NDS32_PLTREL_LO12: ++ case R_NDS32_PLT_GOTREL_LO12: ++ case R_NDS32_GOTPC_LO12: ++ /* Relax for PIC gp-relative low part. */ ++ nds32_elf_relax_piclo12 (link_info, abfd, sec, irel, contents, ++ isymbuf, symtab_hdr); ++ ++ /* It is impossible to delete blank, so just continue. */ ++ continue; ++ case R_NDS32_TLS_LE_LO12: ++ /* Relax for LE TLS low part. */ ++ nds32_elf_relax_letlslo12 (link_info, abfd, irel, contents, ++ isymbuf, symtab_hdr); ++ ++ /* It is impossible to delete blank, so just continue. */ ++ continue; ++ case R_NDS32_TLS_LE_ADD: ++ nds32_elf_relax_letlsadd (link_info, abfd, sec, irel, internal_relocs, ++ contents, isymbuf, symtab_hdr, again); ++ /* It is impossible to delete blank, so just continue. */ ++ continue; ++ case R_NDS32_TLS_LE_LS: ++ nds32_elf_relax_letlsls (link_info, abfd, sec, irel, internal_relocs, ++ contents, isymbuf, symtab_hdr, again); ++ continue; ++ case R_NDS32_PTR: ++ removed = nds32_elf_relax_ptr (abfd, sec, irel, internal_relocs, ++ &insn_len, &seq_len, contents); ++ break; ++ case R_NDS32_PLT_GOT_SUFF: ++ nds32_elf_relax_pltgot_suff (link_info, abfd, sec, irel, ++ internal_relocs, contents, ++ isymbuf, symtab_hdr, again); ++ /* It is impossible to delete blank, so just continue. */ ++ continue; ++ case R_NDS32_GOT_SUFF: ++ nds32_elf_relax_got_suff (link_info, abfd, sec, irel, ++ internal_relocs, contents, ++ symtab_hdr, again); ++ /* It is impossible to delete blank, so just continue. */ ++ continue; ++ case R_NDS32_GOTOFF_SUFF: ++ nds32_elf_relax_gotoff_suff (link_info, abfd, sec, irel, ++ internal_relocs, contents, ++ isymbuf, symtab_hdr, again); ++ /* It is impossible to delete blank, so just continue. */ ++ continue; ++ default: ++ continue; ++ ++ } ++ if (removed && seq_len - insn_len > 0) ++ { ++ if (!insert_nds32_elf_blank ++ (&relax_blank_list, irel->r_offset + insn_len, ++ seq_len - insn_len)) ++ goto error_return; ++ *again = TRUE; ++ } ++ } ++ ++ calc_nds32_blank_total (relax_blank_list); ++ ++ if (table->relax_fp_as_gp) ++ { ++ if (!nds32_relax_fp_as_gp (link_info, abfd, sec, internal_relocs, ++ irelend, isymbuf)) ++ goto error_return; ++ ++ if (*again == FALSE) ++ { ++ if (!nds32_fag_remove_unused_fpbase (abfd, sec, internal_relocs, ++ irelend)) ++ goto error_return; ++ } ++ } ++ ++ nds32_elf_pick_relax (FALSE, sec, again, table, link_info); ++ ++ if (*again == FALSE) ++ { ++ if (!nds32_relax_adjust_label (abfd, sec, internal_relocs, contents, ++ &relax_blank_list, optimize, opt_size)) ++ goto error_return; ++ } ++ ++ /* It doesn't matter optimize_for_space_no_align anymore. ++ If object file is assembled with flag '-Os', ++ the we don't adjust jump-destination on 4-byte boundary. */ ++ ++ if (relax_blank_list) ++ { ++ nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list); ++ relax_blank_list = NULL; ++ } ++ ++ if (*again == FALSE) ++ { ++ /* Closing the section, so we don't relax it anymore. */ ++ bfd_vma sec_size_align; ++ Elf_Internal_Rela *tmp_rel; ++ ++ /* Pad to alignment boundary. Only handle current section alignment. */ ++ sec_size_align = (sec->size + (~((bfd_vma)(-1) << sec->alignment_power))) ++ & ((bfd_vma)(-1) << sec->alignment_power); ++ if ((sec_size_align - sec->size) & 0x2) ++ { ++ insn16 = NDS32_NOP16; ++ bfd_putb16 (insn16, contents + sec->size); ++ sec->size += 2; ++ } ++ ++ while (sec_size_align != sec->size) ++ { ++ insn = NDS32_NOP32; ++ bfd_putb32 (insn, contents + sec->size); ++ sec->size += 4; ++ } ++ ++ tmp_rel = find_relocs_at_address (internal_relocs, internal_relocs, ++ irelend, R_NDS32_RELAX_ENTRY); ++ if (tmp_rel != irelend) ++ tmp_rel->r_addend |= R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG; ++ ++ clean_nds32_elf_blank (); ++ } ++ ++finish: ++ if (internal_relocs != NULL ++ && elf_section_data (sec)->relocs != internal_relocs) ++ free (internal_relocs); ++ ++ if (contents != NULL ++ && elf_section_data (sec)->this_hdr.contents != contents) ++ free (contents); ++ ++ if (isymbuf != NULL && symtab_hdr->contents != (bfd_byte *) isymbuf) ++ free (isymbuf); ++ ++ return result; ++ ++error_return: ++ result = FALSE; ++ goto finish; ++} ++ ++static struct bfd_elf_special_section const nds32_elf_special_sections[] = { ++ {".sdata", 6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE}, ++ {".sbss", 5, -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE}, ++ {NULL, 0, 0, 0, 0} ++}; ++ ++static bfd_boolean ++nds32_elf_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED, ++ struct bfd_link_info *info, ++ void *finfo ATTRIBUTE_UNUSED, ++ bfd_boolean (*func) (void *, const char *, ++ Elf_Internal_Sym *, ++ asection *, ++ struct elf_link_hash_entry *) ++ ATTRIBUTE_UNUSED) ++{ ++ FILE *sym_ld_script = NULL; ++ struct elf_nds32_link_hash_table *table; ++ ++ table = nds32_elf_hash_table (info); ++ sym_ld_script = table->sym_ld_script; ++ ++ if (check_start_export_sym) ++ fprintf (sym_ld_script, "}\n"); ++ ++ return TRUE; ++} ++ ++static enum elf_reloc_type_class ++nds32_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, ++ const asection *rel_sec ATTRIBUTE_UNUSED, ++ const Elf_Internal_Rela *rela) ++{ ++ switch ((int) ELF32_R_TYPE (rela->r_info)) ++ { ++ case R_NDS32_RELATIVE: ++ return reloc_class_relative; ++ case R_NDS32_JMP_SLOT: ++ return reloc_class_plt; ++ case R_NDS32_COPY: ++ return reloc_class_copy; ++ default: ++ return reloc_class_normal; ++ } ++} ++ ++/* Put target dependent option into info hash table. */ ++void ++bfd_elf32_nds32_set_target_option (struct bfd_link_info *link_info, ++ int relax_fp_as_gp, ++ int eliminate_gc_relocs, ++ FILE * sym_ld_script, int load_store_relax, ++ int target_optimize, int relax_status, ++ int relax_round, FILE * ex9_export_file, ++ FILE * ex9_import_file, ++ int update_ex9_table, int ex9_limit, ++ bfd_boolean ex9_loop_aware, ++ bfd_boolean ifc_loop_aware, ++ int hyper_relax) ++{ ++ struct elf_nds32_link_hash_table *table; ++ ++ /* Initialize indirect call hash table. */ ++ nds32_elf_ict_hash_init (); ++ ++ table = nds32_elf_hash_table (link_info); ++ if (table == NULL) ++ return; ++ ++ table->relax_fp_as_gp = relax_fp_as_gp; ++ table->eliminate_gc_relocs = eliminate_gc_relocs; ++ table->sym_ld_script = sym_ld_script; ++ table ->load_store_relax = load_store_relax; ++ table->target_optimize = target_optimize; ++ table->relax_status = relax_status; ++ table->relax_round = relax_round; ++ table->ex9_export_file = ex9_export_file; ++ table->ex9_import_file = ex9_import_file; ++ table->update_ex9_table = update_ex9_table; ++ table->ex9_limit = ex9_limit; ++ table->ex9_loop_aware = ex9_loop_aware; ++ table->ifc_loop_aware = ifc_loop_aware; ++ table->hyper_relax = hyper_relax; ++ ++ /* We have to do ifc optimization before general relax. */ ++ if (target_optimize & NDS32_RELAX_IFC_ON) ++ { ++ /* Initialize ifc hash table. */ ++ if (!nds32_elf_ifc_init ()) ++ return; ++ } ++ if (target_optimize & NDS32_RELAX_EX9_ON ++ || (ex9_import_file != NULL && update_ex9_table == 1)) ++ { ++ /* Initialize ex9 hash table. */ ++ if (!nds32_elf_ex9_init ()) ++ return; ++ } ++} ++ ++void ++bfd_elf32_nds32_append_section (struct bfd_link_info *link_info, ++ bfd *abfd, int target_optimize) ++{ ++ asection *itable; ++ struct bfd_link_hash_entry *h; ++ unsigned int i, count = 0; ++ ++ /* Insert section ".ex9.itable". */ ++ if (target_optimize & NDS32_RELAX_EX9_ON) ++ { ++ itable = bfd_make_section_with_flags (abfd, ".ex9.itable", ++ SEC_CODE | SEC_ALLOC | SEC_LOAD ++ | SEC_HAS_CONTENTS | SEC_READONLY ++ | SEC_IN_MEMORY | SEC_KEEP ++ | SEC_RELOC); ++ if (itable) ++ { ++ itable->gc_mark = 1; ++ itable->alignment_power = 2; ++ itable->size = 0x1000; ++ itable->contents = bfd_zalloc (abfd, itable->size); ++ ++ /* Add a symbol in the head of ex9.itable to objdump clearly. */ ++ h = bfd_link_hash_lookup (link_info->hash, "_EX9_BASE_", ++ FALSE, FALSE, FALSE); ++ _bfd_generic_link_add_one_symbol ++ (link_info, link_info->output_bfd, "_EX9_BASE_", ++ BSF_GLOBAL | BSF_WEAK, itable, 0, (const char *) NULL, FALSE, ++ get_elf_backend_data (link_info->output_bfd)->collect, &h); ++ } ++ } ++ ++ /* Count number of indirect call function. */ ++ indirect_call_table.frozen = 1; ++ for (i = 0; i < indirect_call_table.size; i++) ++ { ++ struct bfd_hash_entry *p; ++ struct elf_nds32_ict_hash_entry *entry; ++ ++ for (p = indirect_call_table.table[i]; p != NULL; p = p->next) ++ { ++ entry = (struct elf_nds32_ict_hash_entry *) p; ++ entry->order = count; ++ count++; ++ } ++ } ++ indirect_call_table.frozen = 0; ++ ++ if (count) ++ { ++ h = bfd_link_hash_lookup (link_info->hash, "_INDIRECT_CALL_TABLE_BASE_", ++ FALSE, FALSE, FALSE); ++ if (h && (h->type == bfd_link_hash_defined ++ || h->type == bfd_link_hash_defweak ++ || h->type == bfd_link_hash_common)) ++ { ++ (*_bfd_error_handler) (_("Warning: _INDIRECT_CALL_TABLE_BASE_ has already" ++ "be defined. All ICT suffix is ignored.")); ++ ignore_indirect_call = TRUE; ++ return; ++ } ++ ++ itable = bfd_make_section_with_flags (abfd, NDS32_ICT_SECTION, ++ SEC_CODE | SEC_ALLOC | SEC_LOAD ++ | SEC_HAS_CONTENTS | SEC_READONLY ++ | SEC_IN_MEMORY | SEC_KEEP ++ | SEC_RELOC); ++ if (itable) ++ { ++ itable->gc_mark = 1; ++ itable->alignment_power = 2; ++ itable->size = count * 4; ++ itable->contents = bfd_zalloc (abfd, itable->size); ++ ++ /* Add a symbol in the head of .nds32.ict to objdump clearly. */ ++ h = bfd_link_hash_lookup (link_info->hash, ++ "_INDIRECT_CALL_TABLE_BASE_", ++ FALSE, FALSE, FALSE); ++ _bfd_generic_link_add_one_symbol ++ (link_info, link_info->output_bfd, "_INDIRECT_CALL_TABLE_BASE_", ++ BSF_GLOBAL | BSF_WEAK, itable, 0, (const char *) NULL, FALSE, ++ get_elf_backend_data (link_info->output_bfd)->collect, &h); ++ } ++ ++ ict_file = fopen ("nds32_ict.s", FOPEN_WT); ++ if(ict_file == NULL) ++ (*_bfd_error_handler) (_("Warning: Fail to build nds32_ict.s.")); ++ } ++} ++ ++/* These functions and data-structures are used for fp-as-gp ++ optimization. */ ++ ++#define FAG_THRESHOLD 3 /* At least 3 gp-access. */ ++/* lwi37.fp covers 508 bytes, but there may be 32-byte padding between ++ the read-only section and read-write section. */ ++#define FAG_WINDOW (508 - 32) ++ ++/* An nds32_fag represent a gp-relative access. ++ We find best fp-base by using a sliding window ++ to find a base address which can cover most gp-access. */ ++struct nds32_fag ++{ ++ struct nds32_fag *next; /* NULL-teminated linked list. */ ++ bfd_vma addr; /* The address of this fag. */ ++ Elf_Internal_Rela **relas; /* The relocations associated with this fag. ++ It is used for applying FP7U2_FLAG. */ ++ int count; /* How many times this address is referred. ++ There should be exactly `count' relocations ++ in relas. */ ++ int relas_capcity; /* The buffer size of relas. ++ We use an array instead of linked-list, ++ and realloc is used to adjust buffer size. */ ++}; ++ ++static void ++nds32_fag_init (struct nds32_fag *head) ++{ ++ memset (head, 0, sizeof (struct nds32_fag)); ++} ++ ++static void ++nds32_fag_verify (struct nds32_fag *head) ++{ ++ struct nds32_fag *iter; ++ struct nds32_fag *prev; ++ ++ prev = NULL; ++ iter = head->next; ++ while (iter) ++ { ++ if (prev && prev->addr >= iter->addr) ++ puts ("Bug in fp-as-gp insertion."); ++ prev = iter; ++ iter = iter->next; ++ } ++} ++ ++/* Insert a fag in ascending order. ++ If a fag of the same address already exists, ++ they are chained by relas array. */ ++ ++static void ++nds32_fag_insert (struct nds32_fag *head, bfd_vma addr, ++ Elf_Internal_Rela * rel) ++{ ++ struct nds32_fag *iter; ++ struct nds32_fag *new_fag; ++ const int INIT_RELAS_CAP = 4; ++ ++ for (iter = head; ++ iter->next && iter->next->addr <= addr; ++ iter = iter->next) ++ /* Find somewhere to insert. */ ; ++ ++ /* `iter' will be equal to `head' if the list is empty. */ ++ if (iter != head && iter->addr == addr) ++ { ++ /* The address exists in the list. ++ Insert `rel' into relocation list, relas. */ ++ ++ /* Check whether relas is big enough. */ ++ if (iter->count >= iter->relas_capcity) ++ { ++ iter->relas_capcity *= 2; ++ iter->relas = bfd_realloc ++ (iter->relas, iter->relas_capcity * sizeof (void *)); ++ } ++ iter->relas[iter->count++] = rel; ++ return; ++ } ++ ++ /* This is a new address. Create a fag node for it. */ ++ new_fag = bfd_malloc (sizeof (struct nds32_fag)); ++ memset (new_fag, 0, sizeof (*new_fag)); ++ new_fag->addr = addr; ++ new_fag->count = 1; ++ new_fag->next = iter->next; ++ new_fag->relas_capcity = INIT_RELAS_CAP; ++ new_fag->relas = (Elf_Internal_Rela **) ++ bfd_malloc (new_fag->relas_capcity * sizeof (void *)); ++ new_fag->relas[0] = rel; ++ iter->next = new_fag; ++ ++ nds32_fag_verify (head); ++} ++ ++static void ++nds32_fag_free_list (struct nds32_fag *head) ++{ ++ struct nds32_fag *iter; ++ ++ iter = head->next; ++ while (iter) ++ { ++ struct nds32_fag *tmp = iter; ++ iter = iter->next; ++ free (tmp->relas); ++ tmp->relas = NULL; ++ free (tmp); ++ } ++} ++ ++/* Find the best fp-base address. ++ The relocation associated with that address is returned, ++ so we can track the symbol instead of a fixed address. ++ ++ When relaxation, the address of an datum may change, ++ because a text section is shrinked, so the data section ++ moves forward. If the aligments of text and data section ++ are different, their distance may change too. ++ Therefore, tracking a fixed address is not appriate. */ ++ ++static int ++nds32_fag_find_base (struct nds32_fag *head, struct nds32_fag **bestpp) ++{ ++ struct nds32_fag *base; /* First fag in the window. */ ++ struct nds32_fag *last; /* First fag outside the window. */ ++ int accu = 0; /* Usage accumulation. */ ++ struct nds32_fag *best; /* Best fag. */ ++ int baccu = 0; /* Best accumulation. */ ++ ++ /* Use first fag for initial, and find the last fag in the window. ++ ++ In each iteration, we could simply subtract previous fag ++ and accumulate following fags which are inside the window, ++ untill we each the end. */ ++ ++ if (head->next == NULL) ++ { ++ *bestpp = NULL; ++ return 0; ++ } ++ ++ /* Initialize base. */ ++ base = head->next; ++ best = base; ++ for (last = base; ++ last && last->addr < base->addr + FAG_WINDOW; ++ last = last->next) ++ accu += last->count; ++ ++ baccu = accu; ++ ++ /* Record the best base in each iteration. */ ++ while (base->next) ++ { ++ accu -= base->count; ++ base = base->next; ++ /* Account fags in window. */ ++ for (/* Nothing. */; ++ last && last->addr < base->addr + FAG_WINDOW; ++ last = last->next) ++ accu += last->count; ++ ++ /* A better fp-base? */ ++ if (accu > baccu) ++ { ++ best = base; ++ baccu = accu; ++ } ++ } ++ ++ if (bestpp) ++ *bestpp = best; ++ return baccu; ++} ++ ++/* Apply R_NDS32_INSN16_FP7U2_FLAG on gp-relative accesses, ++ so we can convert it fo fp-relative access later. ++ `best_fag' is the best fp-base. Only those inside the window ++ of best_fag is applied the flag. */ ++ ++static bfd_boolean ++nds32_fag_mark_relax (struct bfd_link_info *link_info, ++ asection *sec, struct nds32_fag *best_fag, ++ Elf_Internal_Rela *internal_relocs, ++ Elf_Internal_Rela *irelend) ++{ ++ struct nds32_fag *ifag; ++ bfd_vma best_fpbase, gp; ++ bfd *output_bfd; ++ ++ output_bfd = sec->output_section->owner; ++ nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE); ++ best_fpbase = best_fag->addr; ++ ++ if (best_fpbase > gp + sdata_range[1][1] ++ || best_fpbase < gp - sdata_range[1][0]) ++ return FALSE; ++ ++ /* Mark these inside the window R_NDS32_INSN16_FP7U2_FLAG flag, ++ so we know they can be converted to lwi37.fp. */ ++ for (ifag = best_fag; ++ ifag && ifag->addr < best_fpbase + FAG_WINDOW; ifag = ifag->next) ++ { ++ int i; ++ ++ for (i = 0; i < ifag->count; i++) ++ { ++ Elf_Internal_Rela *insn16_rel; ++ Elf_Internal_Rela *fag_rel; ++ ++ fag_rel = ifag->relas[i]; ++ ++ /* Only if this is within the WINDOWS, FP7U2_FLAG ++ is applied. */ ++ ++ insn16_rel = find_relocs_at_address ++ (fag_rel, internal_relocs, irelend, R_NDS32_INSN16); ++ ++ if (insn16_rel != irelend) ++ insn16_rel->r_addend = R_NDS32_INSN16_FP7U2_FLAG; ++ } ++ } ++ return TRUE; ++} ++ ++/* Reset INSN16 to clean fp as gp. */ ++ ++static void ++nds32_fag_unmark_relax (struct nds32_fag *fag, ++ Elf_Internal_Rela *internal_relocs, ++ Elf_Internal_Rela *irelend) ++{ ++ struct nds32_fag *ifag; ++ int i; ++ Elf_Internal_Rela *insn16_rel; ++ Elf_Internal_Rela *fag_rel; ++ ++ for (ifag = fag; ifag; ifag = ifag->next) ++ { ++ for (i = 0; i < ifag->count; i++) ++ { ++ fag_rel = ifag->relas[i]; ++ ++ /* Restore the INSN16 relocation. */ ++ insn16_rel = find_relocs_at_address ++ (fag_rel, internal_relocs, irelend, R_NDS32_INSN16); ++ ++ if (insn16_rel != irelend) ++ insn16_rel->r_addend &= ~R_NDS32_INSN16_FP7U2_FLAG; ++ } ++ } ++} ++ ++/* This is the main function of fp-as-gp optimization. ++ It should be called by relax_section. */ ++ ++static bfd_boolean ++nds32_relax_fp_as_gp (struct bfd_link_info *link_info, ++ bfd *abfd, asection *sec, ++ Elf_Internal_Rela *internal_relocs, ++ Elf_Internal_Rela *irelend, ++ Elf_Internal_Sym *isymbuf) ++{ ++ Elf_Internal_Rela *begin_rel = NULL; ++ Elf_Internal_Rela *irel; ++ struct nds32_fag fag_head; ++ Elf_Internal_Shdr *symtab_hdr; ++ bfd_byte *contents; ++ bfd_boolean ifc_inside = FALSE; ++ ++ /* FIXME: Can we bfd_elf_link_read_relocs for the relocs? */ ++ ++ /* Per-function fp-base selection. ++ 1. Create a list for all the gp-relative access. ++ 2. Base on those gp-relative address, ++ find a fp-base which can cover most access. ++ 3. Use the fp-base for fp-as-gp relaxation. ++ ++ NOTE: If fp-as-gp is not worth to do, (e.g., less than 3 times), ++ we should ++ 1. delete the `la $fp, _FP_BASE_' instruction and ++ 2. not convert lwi.gp to lwi37.fp. ++ ++ To delete the _FP_BASE_ instruction, we simply apply ++ R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG flag in the r_addend to disable it. ++ ++ To suppress the conversion, we simply NOT to apply ++ R_NDS32_INSN16_FP7U2_FLAG flag. */ ++ ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ ++ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE) ++ || !nds32_get_local_syms (abfd, sec, &isymbuf)) ++ return FALSE; ++ ++ /* Check whether it is worth for fp-as-gp optimization, ++ i.e., at least 3 gp-load. ++ ++ Set R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG if we should NOT ++ apply this optimization. */ ++ ++ for (irel = internal_relocs; irel < irelend; irel++) ++ { ++ /* We recognize R_NDS32_RELAX_REGION_BEGIN/_END for the region. ++ One we enter the begin of the region, we track all the LW/ST ++ instructions, so when we leave the region, we try to find ++ the best fp-base address for those LW/ST instructions. */ ++ ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN ++ && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG)) ++ { ++ /* Begin of the region. */ ++ if (begin_rel) ++ (*_bfd_error_handler) (_("%B: Nested OMIT_FP in %A."), abfd, sec); ++ ++ begin_rel = irel; ++ nds32_fag_init (&fag_head); ++ ifc_inside = FALSE; ++ } ++ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END ++ && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG)) ++ { ++ int accu; ++ struct nds32_fag *best_fag, *tmp_fag; ++ int dist; ++ ++ /* End of the region. ++ Check whether it is worth to do fp-as-gp. */ ++ ++ if (begin_rel == NULL) ++ { ++ (*_bfd_error_handler) (_("%B: Unmatched OMIT_FP in %A."), abfd, sec); ++ continue; ++ } ++ ++ accu = nds32_fag_find_base (&fag_head, &best_fag); ++ ++ /* Clean FP7U2_FLAG because they may set ever. */ ++ tmp_fag = fag_head.next; ++ nds32_fag_unmark_relax (tmp_fag, internal_relocs, irelend); ++ ++ /* Check if it is worth, and FP_BASE is near enough to SDA_BASE. */ ++ if (accu < FAG_THRESHOLD ++ || !nds32_fag_mark_relax (link_info, sec, best_fag, ++ internal_relocs, irelend)) ++ { ++ /* Not worth to do fp-as-gp. */ ++ begin_rel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG; ++ begin_rel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG; ++ irel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG; ++ irel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG; ++ nds32_fag_free_list (&fag_head); ++ begin_rel = NULL; ++ continue; ++ } ++ ++ /* R_SYM of R_NDS32_RELAX_REGION_BEGIN is not used by assembler, ++ so we use it to record the distance to the reloction of best ++ fp-base. */ ++ dist = best_fag->relas[0] - begin_rel; ++ BFD_ASSERT (dist > 0 && dist < 0xffffff); ++ /* Use high 16 bits of addend to record the _FP_BASE_ matched ++ relocation. And get the base value when relocating. */ ++ begin_rel->r_addend &= (0x1 << 16) - 1; ++ begin_rel->r_addend |= dist << 16; ++ ++ nds32_fag_free_list (&fag_head); ++ begin_rel = NULL; ++ } ++ ++ if (begin_rel == NULL || ifc_inside) ++ /* Skip if we are not in the region of fp-as-gp. */ ++ continue; ++ ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S2_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA17S2_RELA) ++ { ++ bfd_vma addr; ++ uint32_t insn; ++ ++ /* A gp-relative access is found. Insert it to the fag-list. */ ++ ++ /* Rt is necessary an RT3, so it can be converted to lwi37.fp. */ ++ insn = bfd_getb32 (contents + irel->r_offset); ++ if (!N32_IS_RT3 (insn)) ++ continue; ++ ++ addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr); ++ nds32_fag_insert (&fag_head, addr, irel); ++ } ++ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA_FP7U2_RELA) ++ { ++ begin_rel = NULL; ++ } ++ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_10IFCU_PCREL_RELA) ++ { ++ /* Suppress fp as gp when encounter ifc. */ ++ ifc_inside = TRUE; ++ } ++ } ++ ++ return TRUE; ++} ++ ++/* Remove unused `la $fp, _FD_BASE_' instruction. */ ++ ++static bfd_boolean ++nds32_fag_remove_unused_fpbase (bfd *abfd, asection *sec, ++ Elf_Internal_Rela *internal_relocs, ++ Elf_Internal_Rela *irelend) ++{ ++ Elf_Internal_Rela *irel; ++ Elf_Internal_Shdr *symtab_hdr; ++ bfd_byte *contents = NULL; ++ nds32_elf_blank_t *relax_blank_list = NULL; ++ bfd_boolean result = TRUE; ++ bfd_boolean unused_region = FALSE; ++ ++ /* ++ NOTE: Disable fp-as-gp if we encounter ifcall relocations. ++ * R_NDS32_17IFC_PCREL_RELA ++ * R_NDS32_10IFCU_PCREL_RELA ++ ++ CASE?????????????? ++ */ ++ ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ nds32_get_section_contents (abfd, sec, &contents, TRUE); ++ ++ for (irel = internal_relocs; irel < irelend; irel++) ++ { ++ /* To remove unused fp-base, we simply find the REGION_NOT_OMIT_FP ++ we marked to in previous pass. ++ DO NOT scan relocations again, since we've alreadly decided it ++ and set the flag. */ ++ const char *syname; ++ int syndx; ++ uint32_t insn; ++ ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN ++ && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG)) ++ unused_region = TRUE; ++ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END ++ && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG)) ++ unused_region = FALSE; ++ ++ /* We're not in the region. */ ++ if (!unused_region) ++ continue; ++ ++ /* _FP_BASE_ must be a GLOBAL symbol. */ ++ syndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info; ++ if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info) ++ continue; ++ ++ /* The symbol name must be _FP_BASE_. */ ++ syname = elf_sym_hashes (abfd)[syndx]->root.root.string; ++ if (strcmp (syname, FP_BASE_NAME) != 0) ++ continue; ++ ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA19S0_RELA) ++ { ++ /* addi.gp $fp, -256 */ ++ insn = bfd_getb32 (contents + irel->r_offset); ++ if (insn != INSN_ADDIGP_TO_FP) ++ continue; ++ } ++ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S0_RELA) ++ { ++ /* addi $fp, $gp, -256 */ ++ insn = bfd_getb32 (contents + irel->r_offset); ++ if (insn != INSN_ADDI_GP_TO_FP) ++ continue; ++ } ++ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_20_RELA) ++ { ++ /* movi $fp, FP_BASE */ ++ insn = bfd_getb32 (contents + irel->r_offset); ++ if (insn != INSN_MOVI_TO_FP) ++ continue; ++ } ++ else ++ continue; ++ ++ /* We got here because a FP_BASE instruction is found. */ ++ if (!insert_nds32_elf_blank_recalc_total ++ (&relax_blank_list, irel->r_offset, 4)) ++ goto error_return; ++ } ++ ++finish: ++ if (relax_blank_list) ++ { ++ nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list); ++ relax_blank_list = NULL; ++ } ++ return result; ++ ++error_return: ++ result = FALSE; ++ goto finish; ++} ++ ++/* This is a version of bfd_generic_get_relocated_section_contents. ++ We need this variety because relaxation will modify the dwarf ++ infomation. When there is undefined symbol reference error mesage, ++ linker need to dump line number where the symbol be used. However ++ the address is be relaxed, it can not get the original dwarf contents. ++ The variety only modify function call for reading in the section. */ ++ ++static bfd_byte * ++nds32_elf_get_relocated_section_contents (bfd *abfd, ++ struct bfd_link_info *link_info, ++ struct bfd_link_order *link_order, ++ bfd_byte *data, ++ bfd_boolean relocatable, ++ asymbol **symbols) ++{ ++ bfd *input_bfd = link_order->u.indirect.section->owner; ++ asection *input_section = link_order->u.indirect.section; ++ long reloc_size; ++ arelent **reloc_vector; ++ long reloc_count; ++ ++ reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); ++ if (reloc_size < 0) ++ return NULL; ++ ++ /* Read in the section. */ ++ if (!nds32_get_section_contents (input_bfd, input_section, &data, FALSE)) ++ return NULL; ++ ++ if (reloc_size == 0) ++ return data; ++ ++ reloc_vector = (arelent **) bfd_malloc (reloc_size); ++ if (reloc_vector == NULL) ++ return NULL; ++ ++ 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 != NULL; parent++) ++ { ++ char *error_message = NULL; ++ asymbol *symbol; ++ bfd_reloc_status_type r; ++ ++ symbol = *(*parent)->sym_ptr_ptr; ++ if (symbol->section && discarded_section (symbol->section)) ++ { ++ bfd_byte *p; ++ static reloc_howto_type none_howto ++ = HOWTO (0, 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL, ++ "unused", FALSE, 0, 0, FALSE); ++ ++ p = data + (*parent)->address * bfd_octets_per_byte (input_bfd); ++ _bfd_clear_contents ((*parent)->howto, input_bfd, input_section, ++ p); ++ (*parent)->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; ++ (*parent)->addend = 0; ++ (*parent)->howto = &none_howto; ++ r = bfd_reloc_ok; ++ } ++ else ++ r = bfd_perform_relocation (input_bfd, *parent, data, ++ input_section, ++ relocatable ? abfd : NULL, ++ &error_message); ++ ++ if (relocatable) ++ { ++ 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, TRUE))) ++ goto error_return; ++ break; ++ case bfd_reloc_dangerous: ++ BFD_ASSERT (error_message != 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, NULL, ++ 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: ++ /* PR ld/13730: ++ This error can result when processing some partially ++ complete binaries. Do not abort, but issue an error ++ message instead. */ ++ link_info->callbacks->einfo ++ (_("%X%P: %B(%A): relocation \"%R\" goes out of range\n"), ++ abfd, input_section, * parent); ++ goto error_return; ++ ++ default: ++ abort (); ++ break; ++ } ++ } ++ } ++ } ++ ++ free (reloc_vector); ++ return data; ++ ++error_return: ++ free (reloc_vector); ++ return NULL; ++} ++ ++/* Check target symbol. */ ++ ++static bfd_boolean ++nds32_elf_is_target_special_symbol (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym) ++{ ++ if (!sym || !sym->name || sym->name[0] != '$') ++ return FALSE; ++ return TRUE; ++} ++ ++/* nds32 find maybe function sym. Ignore target special symbol ++ first, and then go the general function. */ ++ ++static bfd_size_type ++nds32_elf_maybe_function_sym (const asymbol *sym, asection *sec, ++ bfd_vma *code_off) ++{ ++ if (nds32_elf_is_target_special_symbol (NULL, (asymbol *) sym)) ++ return 0; ++ ++ return _bfd_elf_maybe_function_sym (sym, sec, code_off); ++} ++ ++ ++/* Link-time IFC relaxation. ++ In this optimization, we chains jump instructions ++ of the same destination with ifcall. */ ++ ++ ++/* List to save jal and j relocation. */ ++struct elf_nds32_ifc_symbol_entry ++{ ++ asection *sec; ++ struct elf_link_hash_entry *h; ++ struct elf_nds32_ifc_irel_list *irel_head; ++ unsigned long insn; ++ int times; ++ int enable; /* Apply ifc. */ ++ int ex9_enable; /* Apply ifc after ex9. */ ++ struct elf_nds32_ifc_symbol_entry *next; ++}; ++ ++struct elf_nds32_ifc_irel_list ++{ ++ Elf_Internal_Rela *irel; ++ asection *sec; ++ bfd_vma addr; ++ /* If this is set, then it is the last instruction for ++ ifc-chain, so it must be keep for the actual branching. */ ++ int keep; ++ struct elf_nds32_ifc_irel_list *next; ++}; ++ ++static struct elf_nds32_ifc_symbol_entry *ifc_symbol_head = NULL; ++ ++/* Insert symbol of jal and j for ifc. */ ++ ++static void ++nds32_elf_ifc_insert_symbol (asection *sec, ++ struct elf_link_hash_entry *h, ++ Elf_Internal_Rela *irel, ++ unsigned long insn) ++{ ++ struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head; ++ ++ /* Check there is target of existing entry the same as the new one. */ ++ while (ptr != NULL) ++ { ++ if (((h == NULL && ptr->sec == sec ++ && ELF32_R_SYM (ptr->irel_head->irel->r_info) == ELF32_R_SYM (irel->r_info) ++ && ptr->irel_head->irel->r_addend == irel->r_addend) ++ || h != NULL) ++ && ptr->h == h ++ && ptr->insn == insn) ++ { ++ /* The same target exist, so insert into list. */ ++ struct elf_nds32_ifc_irel_list *irel_list = ptr->irel_head; ++ ++ while (irel_list->next != NULL) ++ irel_list = irel_list->next; ++ irel_list->next = bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list)); ++ irel_list = irel_list->next; ++ irel_list->irel = irel; ++ irel_list->keep = 1; ++ ++ if (h == NULL) ++ irel_list->sec = NULL; ++ else ++ irel_list->sec = sec; ++ irel_list->next = NULL; ++ return; ++ } ++ if (ptr->next == NULL) ++ break; ++ ptr = ptr->next; ++ } ++ ++ /* There is no same target entry, so build a new one. */ ++ if (ifc_symbol_head == NULL) ++ { ++ ifc_symbol_head = bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry)); ++ ptr = ifc_symbol_head; ++ } ++ else ++ { ++ ptr->next = bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry)); ++ ptr = ptr->next; ++ } ++ ++ ptr->h = h; ++ ptr->irel_head = bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list)); ++ ptr->irel_head->irel = irel; ++ ptr->insn = insn; ++ ptr->irel_head->keep = 1; ++ ++ if (h == NULL) ++ { ++ /* Local symbols. */ ++ ptr->sec = sec; ++ ptr->irel_head->sec = NULL; ++ } ++ else ++ { ++ /* Global symbol. */ ++ ptr->sec = NULL; ++ ptr->irel_head->sec = sec; ++ } ++ ++ ptr->irel_head->next = NULL; ++ ptr->times = 0; ++ ptr->enable = 0; ++ ptr->ex9_enable = 0; ++ ptr->next = NULL; ++} ++ ++/* Check if ignoring ifc. */ ++ ++static bfd_boolean ++nds32_elf_ifc_check_region (Elf_Internal_Rela **irel, ++ Elf_Internal_Rela *irelend, ++ struct bfd_link_info *info) ++{ ++ struct elf_nds32_link_hash_table *table; ++ int nest = 0; ++ bfd_boolean ifc_loop_aware; ++ bfd_boolean security = FALSE; ++ ++ table = nds32_elf_hash_table (info); ++ ifc_loop_aware = table->ifc_loop_aware; ++ ++ if ((ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_BEGIN ++ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_IFC_FLAG ++ || (ifc_loop_aware == 1 ++ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG)) ++ || (*irel)->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG)) ++ || (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_SECURITY_16)) ++ { ++ /* Check the region if loop, no_ifc, or security. If it is true, ++ ignore the region till region end. */ ++ if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_SECURITY_16) ++ security = TRUE; ++ else ++ nest++; ++ ++ (*irel)++; ++ while ((*irel) != NULL && (*irel) < irelend) ++ { ++ if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_BEGIN ++ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_IFC_FLAG ++ || (ifc_loop_aware == 1 ++ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG)) ++ || (*irel)->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG)) ++ nest++; ++ ++ else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_SECURITY_16 ++ && (*irel)->r_addend != NDS32_SECURITY_END) ++ security = TRUE; ++ ++ if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_END ++ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_IFC_FLAG ++ || (ifc_loop_aware == 1 ++ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG)) ++ || (*irel)->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG)) ++ { ++ if (nest > 0) ++ nest--; ++ } ++ else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_SECURITY_16 ++ && (*irel)->r_addend == NDS32_SECURITY_END) ++ security = FALSE; ++ ++ if (nest <= 0 && !security) ++ break; ++ ++ (*irel)++; ++ } ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ ++/* Gather all jal and j instructions. */ ++ ++static bfd_boolean ++nds32_elf_ifc_calc (struct bfd_link_info *info, ++ bfd *abfd, asection *sec) ++{ ++ Elf_Internal_Rela *internal_relocs; ++ Elf_Internal_Rela *irelend; ++ Elf_Internal_Rela *irel; ++ Elf_Internal_Shdr *symtab_hdr; ++ bfd_byte *contents = NULL; ++ uint32_t insn, insn_with_reg; ++ unsigned long r_symndx; ++ struct elf_link_hash_entry *h; ++ struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd); ++ ++ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, ++ TRUE /* keep_memory */); ++ irelend = internal_relocs + sec->reloc_count; ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ ++ /* Check if the object enable ifc. */ ++ irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend, ++ R_NDS32_RELAX_ENTRY); ++ ++ if (irel == NULL ++ || irel >= irelend ++ || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY ++ || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY ++ && !(irel->r_addend & R_NDS32_RELAX_ENTRY_IFC_FLAG))) ++ return TRUE; ++ ++ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)) ++ return FALSE; ++ ++ while (irel != NULL && irel < irelend) ++ { ++ /* Traverse all relocation and gather all of them to build the list. */ ++ ++ if (nds32_elf_ifc_check_region (&irel, irelend, info)) ++ if (irel == NULL || irel >= irelend) ++ return TRUE; ++ ++ ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA) ++ { ++ insn = bfd_getb32 (contents + irel->r_offset); ++ nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg); ++ r_symndx = ELF32_R_SYM (irel->r_info); ++ if (r_symndx < symtab_hdr->sh_info) ++ { ++ /* Local symbol. */ ++ nds32_elf_ifc_insert_symbol (sec, NULL, irel, insn_with_reg); ++ } ++ else ++ { ++ /* External symbol. */ ++ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; ++ nds32_elf_ifc_insert_symbol (sec, h, irel, insn_with_reg); ++ } ++ } ++ irel++; ++ } ++ return TRUE; ++} ++ ++/* Determine whether j and jal should be substituted. */ ++ ++static void ++nds32_elf_ifc_filter (struct bfd_link_info *info) ++{ ++ struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head; ++ struct elf_nds32_ifc_irel_list *irel_ptr = NULL; ++ struct elf_nds32_ifc_irel_list *irel_keeper = NULL; ++ struct elf_nds32_link_hash_table *table; ++ int target_optimize; ++ bfd_vma address; ++ ++ table = nds32_elf_hash_table (info); ++ target_optimize = table->target_optimize; ++ while (ptr) ++ { ++ irel_ptr = ptr->irel_head; ++ if (ptr->h == NULL) ++ { ++ /* Local symbol. */ ++ irel_keeper = irel_ptr; ++ while (irel_ptr && irel_ptr->next) ++ { ++ /* Check there is jump target can be used. */ ++ if ((irel_ptr->next->irel->r_offset ++ - irel_keeper->irel->r_offset) > 1022) ++ irel_keeper = irel_ptr->next; ++ else ++ { ++ ptr->enable = 1; ++ irel_ptr->keep = 0; ++ } ++ irel_ptr = irel_ptr->next; ++ } ++ } ++ else ++ { ++ /* Global symbol. */ ++ /* We have to get the absolute address and decide ++ whether to keep it or not.*/ ++ while (irel_ptr) ++ { ++ address = (irel_ptr->irel->r_offset ++ + irel_ptr->sec->output_section->vma ++ + irel_ptr->sec->output_offset); ++ irel_ptr->addr = address; ++ irel_ptr = irel_ptr->next; ++ } ++ ++ irel_ptr = ptr->irel_head; ++ while (irel_ptr) ++ { ++ /* Sort by address. */ ++ struct elf_nds32_ifc_irel_list *irel_dest = irel_ptr; ++ struct elf_nds32_ifc_irel_list *irel_temp = irel_ptr; ++ struct elf_nds32_ifc_irel_list *irel_ptr_prev = NULL; ++ struct elf_nds32_ifc_irel_list *irel_dest_prev = NULL; ++ ++ /* Get the smallest one. */ ++ while (irel_temp->next) ++ { ++ if (irel_temp->next->addr < irel_dest->addr) ++ { ++ irel_dest_prev = irel_temp; ++ irel_dest = irel_temp->next; ++ } ++ irel_temp = irel_temp->next; ++ } ++ ++ if (irel_dest != irel_ptr) ++ { ++ if (irel_ptr_prev) ++ irel_ptr_prev->next = irel_dest; ++ if (irel_dest_prev) ++ irel_dest_prev->next = irel_ptr; ++ irel_temp = irel_ptr->next; ++ irel_ptr->next = irel_dest->next; ++ irel_dest->next = irel_temp; ++ } ++ irel_ptr_prev = irel_ptr; ++ irel_ptr = irel_ptr->next; ++ } ++ ++ irel_ptr = ptr->irel_head; ++ irel_keeper = irel_ptr; ++ while (irel_ptr && irel_ptr->next) ++ { ++ if ((irel_ptr->next->addr - irel_keeper->addr) > 1022) ++ irel_keeper = irel_ptr->next; ++ else ++ { ++ ptr->enable = 1; ++ irel_ptr->keep = 0; ++ } ++ irel_ptr = irel_ptr->next; ++ } ++ } ++ ++ /* Ex9 enable. Reserve it for ex9. */ ++ if ((target_optimize & NDS32_RELAX_EX9_ON) ++ && ptr->irel_head != irel_keeper) ++ ptr->enable = 0; ++ ptr = ptr->next; ++ } ++} ++ ++/* Determine whether j and jal should be substituted after ex9 done. */ ++ ++static void ++nds32_elf_ifc_filter_after_ex9 (void) ++{ ++ struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head; ++ struct elf_nds32_ifc_irel_list *irel_ptr = NULL; ++ ++ while (ptr) ++ { ++ if (ptr->enable == 0) ++ { ++ /* Check whether ifc is applied or not. */ ++ irel_ptr = ptr->irel_head; ++ ptr->ex9_enable = 1; ++ while (irel_ptr) ++ { ++ if (ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_TRAN) ++ { ++ /* Ex9 already. */ ++ ptr->ex9_enable = 0; ++ break; ++ } ++ irel_ptr = irel_ptr->next; ++ } ++ } ++ ptr = ptr->next; ++ } ++} ++ ++/* Wrapper to do ifc relaxation. */ ++ ++bfd_boolean ++nds32_elf_ifc_finish (struct bfd_link_info *info) ++{ ++ int relax_status; ++ struct elf_nds32_link_hash_table *table; ++ ++ table = nds32_elf_hash_table (info); ++ relax_status = table->relax_status; ++ ++ if (!(relax_status & NDS32_RELAX_JUMP_IFC_DONE)) ++ nds32_elf_ifc_filter (info); ++ else ++ nds32_elf_ifc_filter_after_ex9 (); ++ ++ if (!nds32_elf_ifc_replace (info)) ++ return FALSE; ++ ++ if (table) ++ table->relax_status |= NDS32_RELAX_JUMP_IFC_DONE; ++ return TRUE; ++} ++ ++/* Traverse the result of ifc filter and replace it with ifcall9. */ ++ ++static bfd_boolean ++nds32_elf_ifc_replace (struct bfd_link_info *info) ++{ ++ struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head; ++ struct elf_nds32_ifc_irel_list *irel_ptr = NULL; ++ nds32_elf_blank_t *relax_blank_list = NULL; ++ bfd_byte *contents = NULL; ++ Elf_Internal_Rela *internal_relocs; ++ Elf_Internal_Rela *irel; ++ Elf_Internal_Rela *irelend; ++ unsigned short insn16 = INSN_IFCALL9; ++ struct elf_nds32_link_hash_table *table; ++ int relax_status; ++ ++ table = nds32_elf_hash_table (info); ++ relax_status = table->relax_status; ++ ++ while (ptr) ++ { ++ /* Traverse the ifc gather list, and replace the ++ filter entries by ifcall9. */ ++ if ((!(relax_status & NDS32_RELAX_JUMP_IFC_DONE) ++ && ptr->enable == 1) ++ || ((relax_status & NDS32_RELAX_JUMP_IFC_DONE) ++ && ptr->ex9_enable == 1)) ++ { ++ irel_ptr = ptr->irel_head; ++ if (ptr->h == NULL) ++ { ++ /* Local symbol. */ ++ internal_relocs = _bfd_elf_link_read_relocs ++ (ptr->sec->owner, ptr->sec, NULL, NULL, TRUE /* keep_memory */); ++ irelend = internal_relocs + ptr->sec->reloc_count; ++ ++ if (!nds32_get_section_contents (ptr->sec->owner, ptr->sec, ++ &contents, TRUE)) ++ return FALSE; ++ ++ while (irel_ptr) ++ { ++ if (irel_ptr->keep == 0 && irel_ptr->next) ++ { ++ /* The one can be replaced. We have to check whether ++ there is any alignment point in the region. */ ++ irel = irel_ptr->irel; ++ while (((irel_ptr->next->keep == 0 ++ && irel < irel_ptr->next->irel) ++ || (irel_ptr->next->keep == 1 && irel < irelend)) ++ && !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL ++ && (irel->r_addend & 0x1f) == 2)) ++ irel++; ++ if (irel >= irelend ++ || !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL ++ && (irel->r_addend & 0x1f) == 2 ++ && ((irel->r_offset - get_nds32_elf_blank_total ++ (&relax_blank_list, irel->r_offset, 1)) ++ & 0x02) == 0)) ++ { ++ /* Replace by ifcall9. */ ++ bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset); ++ if (!insert_nds32_elf_blank_recalc_total ++ (&relax_blank_list, irel_ptr->irel->r_offset + 2, 2)) ++ return FALSE; ++ irel_ptr->irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info), ++ R_NDS32_10IFCU_PCREL_RELA); ++ } ++ } ++ irel_ptr = irel_ptr->next; ++ } ++ ++ /* Delete the redundant code. */ ++ if (relax_blank_list) ++ { ++ nds32_elf_relax_delete_blanks (ptr->sec->owner, ptr->sec, ++ relax_blank_list); ++ relax_blank_list = NULL; ++ } ++ } ++ else ++ { ++ /* Global symbol. */ ++ while (irel_ptr) ++ { ++ if (irel_ptr->keep == 0 && irel_ptr->next) ++ { ++ /* The one can be replaced, and we have to check ++ whether there is any alignment point in the region. */ ++ internal_relocs = _bfd_elf_link_read_relocs ++ (irel_ptr->sec->owner, irel_ptr->sec, NULL, NULL, ++ TRUE /* keep_memory */); ++ irelend = internal_relocs + irel_ptr->sec->reloc_count; ++ if (!nds32_get_section_contents (irel_ptr->sec->owner, ++ irel_ptr->sec, &contents, ++ TRUE)) ++ return FALSE; ++ ++ irel = irel_ptr->irel; ++ while (((irel_ptr->sec == irel_ptr->next->sec ++ && irel_ptr->next->keep == 0 ++ && irel < irel_ptr->next->irel) ++ || ((irel_ptr->sec != irel_ptr->next->sec ++ || irel_ptr->next->keep == 1) ++ && irel < irelend)) ++ && !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL ++ && (irel->r_addend & 0x1f) == 2)) ++ irel++; ++ if (irel >= irelend ++ || !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL ++ && (irel->r_addend & 0x1f) == 2 ++ && ((irel->r_offset ++ - get_nds32_elf_blank_total (&relax_blank_list, ++ irel->r_offset, 1)) & 0x02) == 0)) ++ { ++ /* Replace by ifcall9. */ ++ bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset); ++ if (!insert_nds32_elf_blank_recalc_total ++ (&relax_blank_list, irel_ptr->irel->r_offset + 2, 2)) ++ return FALSE; ++ ++ /* Delete the redundant code, and clear the relocation. */ ++ nds32_elf_relax_delete_blanks (irel_ptr->sec->owner, ++ irel_ptr->sec, ++ relax_blank_list); ++ irel_ptr->irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info), ++ R_NDS32_10IFCU_PCREL_RELA); ++ relax_blank_list = NULL; ++ } ++ } ++ ++ irel_ptr = irel_ptr->next; ++ } ++ } ++ } ++ ptr = ptr->next; ++ } ++ ++ return TRUE; ++} ++ ++/* Relocate ifcall. */ ++ ++static bfd_boolean ++nds32_elf_ifc_reloc (void) ++{ ++ struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head; ++ struct elf_nds32_ifc_irel_list *irel_ptr = NULL; ++ struct elf_nds32_ifc_irel_list *irel_keeper = NULL; ++ bfd_vma relocation, address; ++ unsigned short insn16; ++ static bfd_boolean done = FALSE; ++ ++ if (done) ++ return TRUE; ++ ++ done = TRUE; ++ ++ bfd_byte *contents = NULL; ++ ++ while (ptr) ++ { ++ /* Check the entry is enable ifcall. */ ++ if (ptr->enable == 1 || ptr->ex9_enable == 1) ++ { ++ /* Get the reserve jump. */ ++ irel_ptr = ptr->irel_head; ++ while (irel_ptr) ++ { ++ if (irel_ptr->keep == 1) ++ { ++ irel_keeper = irel_ptr; ++ break; ++ } ++ irel_ptr = irel_ptr->next; ++ } ++ ++ irel_ptr = ptr->irel_head; ++ if (ptr->h == NULL) ++ { ++ /* Local symbol. */ ++ if (!nds32_get_section_contents (ptr->sec->owner, ptr->sec, ++ &contents, TRUE)) ++ return FALSE; ++ ++ while (irel_ptr) ++ { ++ if (irel_ptr->keep == 0 ++ && ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_10IFCU_PCREL_RELA) ++ { ++ relocation = irel_keeper->irel->r_offset; ++ relocation = relocation - irel_ptr->irel->r_offset; ++ while (irel_keeper && relocation > 1022) ++ { ++ irel_keeper = irel_keeper->next; ++ if (irel_keeper && irel_keeper->keep == 1) ++ { ++ relocation = irel_keeper->irel->r_offset; ++ relocation = relocation - irel_ptr->irel->r_offset; ++ } ++ } ++ if (relocation > 1022) ++ { ++ /* Double check. */ ++ irel_keeper = ptr->irel_head; ++ while (irel_keeper) ++ { ++ if (irel_keeper->keep == 1) ++ { ++ relocation = irel_keeper->irel->r_offset; ++ relocation = relocation - irel_ptr->irel->r_offset; ++ } ++ if (relocation <= 1022) ++ break; ++ irel_keeper = irel_keeper->next; ++ } ++ if (!irel_keeper) ++ return FALSE; ++ } ++ irel_ptr->irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info), ++ R_NDS32_NONE); ++ insn16 = INSN_IFCALL9 | (relocation >> 1); ++ bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset); ++ } ++ irel_ptr = irel_ptr->next; ++ } ++ } ++ else ++ { ++ /* Global symbol. */ ++ while (irel_ptr) ++ { ++ if (irel_ptr->keep == 0 ++ && ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_10IFCU_PCREL_RELA) ++ { ++ /* Get the distance between ifcall and jump. */ ++ relocation = (irel_keeper->irel->r_offset ++ + irel_keeper->sec->output_section->vma ++ + irel_keeper->sec->output_offset); ++ address = (irel_ptr->irel->r_offset ++ + irel_ptr->sec->output_section->vma ++ + irel_ptr->sec->output_offset); ++ relocation = relocation - address; ++ ++ /* The distance is over ragne, find callee again. */ ++ while (irel_keeper && relocation > 1022) ++ { ++ irel_keeper = irel_keeper->next; ++ if (irel_keeper && irel_keeper->keep ==1) ++ { ++ relocation = (irel_keeper->irel->r_offset ++ + irel_keeper->sec->output_section->vma ++ + irel_keeper->sec->output_offset); ++ relocation = relocation - address; ++ } ++ } ++ ++ if (relocation > 1022) ++ { ++ /* Double check. */ ++ irel_keeper = ptr->irel_head; ++ while (irel_keeper) ++ { ++ if (irel_keeper->keep == 1) ++ { ++ ++ relocation = (irel_keeper->irel->r_offset ++ + irel_keeper->sec->output_section->vma ++ + irel_keeper->sec->output_offset); ++ relocation = relocation - address; ++ } ++ if (relocation <= 1022) ++ break; ++ irel_keeper = irel_keeper->next; ++ } ++ if (!irel_keeper) ++ return FALSE; ++ } ++ if (!nds32_get_section_contents ++ (irel_ptr->sec->owner, irel_ptr->sec, &contents, TRUE)) ++ return FALSE; ++ insn16 = INSN_IFCALL9 | (relocation >> 1); ++ bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset); ++ irel_ptr->irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info), ++ R_NDS32_NONE); ++ } ++ irel_ptr =irel_ptr->next; ++ } ++ } ++ } ++ ptr = ptr->next; ++ } ++ ++ return TRUE; ++} ++ ++/* End of IFC relaxation. */ ++ ++/* EX9 Instruction Table Relaxation. */ ++#define EX9_SECTION ".ex9.itable" ++ ++/* Global hash list. */ ++struct elf_link_hash_entry_list ++{ ++ struct elf_link_hash_entry *h; ++ struct elf_link_hash_entry_list *next; ++}; ++ ++/* Save different destination but same insn. */ ++struct elf_link_hash_entry_mul_list ++{ ++ /* Global symbol times. */ ++ int times; ++ /* Save relocation for each global symbol but useful?? */ ++ Elf_Internal_Rela *irel; ++ /* For sethi, two sethi may have the same high-part but different low-parts. */ ++ Elf_Internal_Rela rel_backup; ++ struct elf_link_hash_entry_list *h_list; ++ struct elf_link_hash_entry_mul_list *next; ++}; ++ ++/* Instruction hash table. */ ++struct elf_nds32_code_hash_entry ++{ ++ struct bfd_hash_entry root; ++ int times; ++ /* For insn that can use relocation or constant ex: sethi. */ ++ int const_insn; ++ asection *sec; ++ struct elf_link_hash_entry_mul_list *m_list; ++ /* Using r_addend. */ ++ Elf_Internal_Rela *irel; ++ /* Using r_info. */ ++ Elf_Internal_Rela rel_backup; ++}; ++ ++/* Instruction count list. */ ++struct elf_nds32_insn_times_entry ++{ ++ const char *string; ++ int times; ++ int order; ++ asection *sec; ++ struct elf_link_hash_entry_mul_list *m_list; ++ Elf_Internal_Rela *irel; ++ Elf_Internal_Rela rel_backup; ++ struct elf_nds32_insn_times_entry *next; ++}; ++ ++/* J and JAL symbol list. */ ++struct elf_nds32_symbol_entry ++{ ++ char *string; ++ unsigned long insn; ++ struct elf_nds32_symbol_entry *next; ++}; ++ ++/* Relocation list. */ ++struct elf_nds32_irel_entry ++{ ++ Elf_Internal_Rela *irel; ++ struct elf_nds32_irel_entry *next; ++}; ++ ++/* ex9.it insn need to be fixed. */ ++struct elf_nds32_ex9_refix ++{ ++ Elf_Internal_Rela *irel; ++ asection *sec; ++ struct elf_link_hash_entry *h; ++ int order; ++ struct elf_nds32_ex9_refix *next; ++}; ++ ++static struct bfd_hash_table ex9_code_table; ++static struct elf_nds32_insn_times_entry *ex9_insn_head = NULL; ++static struct elf_nds32_ex9_refix *ex9_refix_head = NULL; ++ ++/* EX9 hash function. */ ++ ++static struct bfd_hash_entry * ++nds32_elf_code_hash_newfunc (struct bfd_hash_entry *entry, ++ struct bfd_hash_table *table, ++ const char *string) ++{ ++ struct elf_nds32_code_hash_entry *ret; ++ ++ /* Allocate the structure if it has not already been allocated by a ++ subclass. */ ++ if (entry == NULL) ++ { ++ entry = (struct bfd_hash_entry *) ++ bfd_hash_allocate (table, sizeof (*ret)); ++ if (entry == NULL) ++ return entry; ++ } ++ ++ /* Call the allocation method of the superclass. */ ++ entry = bfd_hash_newfunc (entry, table, string); ++ if (entry == NULL) ++ return entry; ++ ++ ret = (struct elf_nds32_code_hash_entry*) entry; ++ ret->times = 0; ++ ret->const_insn = 0; ++ ret->m_list = NULL; ++ ret->sec = NULL; ++ ret->irel = NULL; ++ return &ret->root; ++} ++ ++/* Insert ex9 entry ++ this insert must be stable sorted by times. */ ++ ++static void ++nds32_elf_ex9_insert_entry (struct elf_nds32_insn_times_entry *ptr) ++{ ++ struct elf_nds32_insn_times_entry *temp; ++ struct elf_nds32_insn_times_entry *temp2; ++ ++ if (ex9_insn_head == NULL) ++ { ++ ex9_insn_head = ptr; ++ ptr->next = NULL; ++ } ++ else ++ { ++ temp = ex9_insn_head; ++ temp2 = ex9_insn_head; ++ while (temp->next && ++ (temp->next->times >= ptr->times ++ || temp->times == -1)) ++ { ++ if (temp->times == -1) ++ temp2 = temp; ++ temp = temp->next; ++ } ++ if (ptr->times > temp->times && temp->times != -1) ++ { ++ ptr->next = temp; ++ if (temp2->times == -1) ++ temp2->next = ptr; ++ else ++ ex9_insn_head = ptr; ++ } ++ else if (temp->next == NULL) ++ { ++ temp->next = ptr; ++ ptr->next = NULL; ++ } ++ else ++ { ++ ptr->next = temp->next; ++ temp->next = ptr; ++ } ++ } ++} ++ ++/* Examine each insn times in hash table. ++ Handle multi-link hash entry. ++ ++ TODO: This function doesn't assign so much info since it is fake. */ ++ ++static int ++nds32_elf_examine_insn_times (struct elf_nds32_code_hash_entry *h) ++{ ++ struct elf_nds32_insn_times_entry *ptr; ++ int times; ++ ++ if (h->m_list == NULL) ++ { ++ /* Local symbol insn or insn without relocation. */ ++ if (h->times < 3) ++ return TRUE; ++ ++ ptr = (struct elf_nds32_insn_times_entry *) ++ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry)); ++ ptr->times = h->times; ++ ptr->string = h->root.string; ++ ptr->m_list = NULL; ++ ptr->sec = h->sec; ++ ptr->irel = h->irel; ++ ptr->rel_backup = h->rel_backup; ++ nds32_elf_ex9_insert_entry (ptr); ++ } ++ else ++ { ++ /* Global symbol insn. */ ++ /* Only sethi insn has multiple m_list. */ ++ struct elf_link_hash_entry_mul_list *m_list = h->m_list; ++ ++ times = 0; ++ while (m_list) ++ { ++ times += m_list->times; ++ m_list = m_list->next; ++ } ++ if (times >= 3) ++ { ++ m_list = h->m_list; ++ ptr = (struct elf_nds32_insn_times_entry *) ++ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry)); ++ ptr->times = times; /* Use the total times. */ ++ ptr->string = h->root.string; ++ ptr->m_list = m_list; ++ ptr->sec = h->sec; ++ ptr->irel = m_list->irel; ++ ptr->rel_backup = m_list->rel_backup; ++ nds32_elf_ex9_insert_entry (ptr); ++ } ++ if (h->const_insn == 1) ++ { ++ /* sethi with constant value. */ ++ if (h->times < 3) ++ return TRUE; ++ ++ ptr = (struct elf_nds32_insn_times_entry *) ++ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry)); ++ ptr->times = h->times; ++ ptr->string = h->root.string; ++ ptr->m_list = NULL; ++ ptr->sec = NULL; ++ ptr->irel = NULL; ++ ptr->rel_backup = h->rel_backup; ++ nds32_elf_ex9_insert_entry (ptr); ++ } ++ } ++ return TRUE; ++} ++ ++/* Count each insn times in hash table. ++ Handle multi-link hash entry. */ ++ ++static int ++nds32_elf_count_insn_times (struct elf_nds32_code_hash_entry *h) ++{ ++ int reservation, times; ++ unsigned long relocation, min_relocation; ++ struct elf_nds32_insn_times_entry *ptr; ++ ++ if (h->m_list == NULL) ++ { ++ /* Local symbol insn or insn without relocation. */ ++ if (h->times < 3) ++ return TRUE; ++ ptr = (struct elf_nds32_insn_times_entry *) ++ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry)); ++ ptr->times = h->times; ++ ptr->string = h->root.string; ++ ptr->m_list = NULL; ++ ptr->sec = h->sec; ++ ptr->irel = h->irel; ++ ptr->rel_backup = h->rel_backup; ++ nds32_elf_ex9_insert_entry (ptr); ++ } ++ else ++ { ++ /* Global symbol insn. */ ++ /* Only sethi insn has multiple m_list. */ ++ struct elf_link_hash_entry_mul_list *m_list = h->m_list; ++ ++ if (ELF32_R_TYPE (m_list->rel_backup.r_info) == R_NDS32_HI20_RELA ++ && m_list->next != NULL) ++ { ++ /* Sethi insn has different symbol or addend but has same hi20. */ ++ times = 0; ++ reservation = 1; ++ relocation = 0; ++ min_relocation = 0xffffffff; ++ while (m_list) ++ { ++ /* Get the minimum sethi address ++ and calculate how many entry the sethi-list have to use. */ ++ if ((m_list->h_list->h->root.type == bfd_link_hash_defined ++ || m_list->h_list->h->root.type == bfd_link_hash_defweak) ++ && (m_list->h_list->h->root.u.def.section != NULL ++ && m_list->h_list->h->root.u.def.section->output_section != NULL)) ++ { ++ relocation = (m_list->h_list->h->root.u.def.value + ++ m_list->h_list->h->root.u.def.section->output_section->vma + ++ m_list->h_list->h->root.u.def.section->output_offset); ++ relocation += m_list->irel->r_addend; ++ } ++ else ++ relocation = 0; ++ if (relocation < min_relocation) ++ min_relocation = relocation; ++ times += m_list->times; ++ m_list = m_list->next; ++ } ++ if (min_relocation < ex9_relax_size) ++ reservation = (min_relocation >> 12) + 1; ++ else ++ reservation = (min_relocation >> 12) ++ - ((min_relocation - ex9_relax_size) >> 12) + 1; ++ if ((reservation * 3) <= times) ++ { ++ /* Efficient enough to use ex9. */ ++ int i; ++ ++ for (i = reservation ; i > 0; i--) ++ { ++ /* Allocate number of reservation ex9 entry. */ ++ ptr = (struct elf_nds32_insn_times_entry *) ++ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry)); ++ ptr->times = h->m_list->times / reservation; ++ ptr->string = h->root.string; ++ ptr->m_list = h->m_list; ++ ptr->sec = h->sec; ++ ptr->irel = h->m_list->irel; ++ ptr->rel_backup = h->m_list->rel_backup; ++ nds32_elf_ex9_insert_entry (ptr); ++ } ++ } ++ } ++ else ++ { ++ /* Normal global symbol that means no different address symbol ++ using same ex9 entry. */ ++ if (m_list->times >= 3) ++ { ++ ptr = (struct elf_nds32_insn_times_entry *) ++ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry)); ++ ptr->times = m_list->times; ++ ptr->string = h->root.string; ++ ptr->m_list = h->m_list; ++ ptr->sec = h->sec; ++ ptr->irel = h->m_list->irel; ++ ptr->rel_backup = h->m_list->rel_backup; ++ nds32_elf_ex9_insert_entry (ptr); ++ } ++ } ++ ++ if (h->const_insn == 1) ++ { ++ /* sethi with constant value. */ ++ if (h->times < 3) ++ return TRUE; ++ ++ ptr = (struct elf_nds32_insn_times_entry *) ++ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry)); ++ ptr->times = h->times; ++ ptr->string = h->root.string; ++ ptr->m_list = NULL; ++ ptr->sec = NULL; ++ ptr->irel = NULL; ++ ptr->rel_backup = h->rel_backup; ++ nds32_elf_ex9_insert_entry (ptr); ++ } ++ } ++ ++ return TRUE; ++} ++ ++/* Hash table traverse function. */ ++ ++static void ++nds32_elf_code_hash_traverse (int (*func) (struct elf_nds32_code_hash_entry*)) ++{ ++ unsigned int i; ++ ++ ex9_code_table.frozen = 1; ++ for (i = 0; i < ex9_code_table.size; i++) ++ { ++ struct bfd_hash_entry *p; ++ ++ for (p = ex9_code_table.table[i]; p != NULL; p = p->next) ++ if (!func ((struct elf_nds32_code_hash_entry *) p)) ++ goto out; ++ } ++out: ++ ex9_code_table.frozen = 0; ++} ++ ++ ++/* Give order number to insn list. */ ++ ++static void ++nds32_elf_order_insn_times (struct bfd_link_info *info) ++{ ++ struct elf_nds32_insn_times_entry *ex9_insn; ++ struct elf_nds32_insn_times_entry *temp = NULL; ++ struct elf_nds32_link_hash_table *table; ++ int ex9_limit; ++ int number = 0; ++ ++ if (ex9_insn_head == NULL) ++ return; ++ ++/* The max number of entries is 512. */ ++ ex9_insn = ex9_insn_head; ++ table = nds32_elf_hash_table (info); ++ ex9_limit = table->ex9_limit; ++ ++ ex9_insn = ex9_insn_head; ++ ++ while (ex9_insn != NULL && number < ex9_limit) ++ { ++ ex9_insn->order = number; ++ number++; ++ temp = ex9_insn; ++ ex9_insn = ex9_insn->next; ++ } ++ ++ if (ex9_insn && temp) ++ temp->next = NULL; ++ ++ while (ex9_insn != NULL) ++ { ++ /* Free useless entry. */ ++ temp = ex9_insn; ++ ex9_insn = ex9_insn->next; ++ free (temp); ++ } ++} ++ ++/* Get section .ex9.itable. */ ++ ++static asection* ++nds32_elf_ex9_get_section (bfd *input_bfds) ++{ ++ asection *sec = NULL; ++ bfd *abfd; ++ ++ if (ex9_section != NULL) ++ return ex9_section; ++ ++ for (abfd = input_bfds; abfd != NULL; abfd = abfd->link_next) ++ { ++ sec = bfd_get_section_by_name (abfd, EX9_SECTION); ++ if (sec != NULL) ++ break; ++ } ++ ++ ex9_section = sec; ++ return sec; ++} ++ ++/* Build .ex9.itable section. */ ++ ++static void ++nds32_elf_ex9_build_itable (struct bfd_link_info *link_info) ++{ ++ asection *table_sec; ++ struct elf_nds32_insn_times_entry *ptr; ++ int number = 0; ++ bfd_byte *contents = NULL; ++ struct elf_nds32_link_hash_table *table; ++ ++ table = nds32_elf_hash_table (link_info); ++ ++ /* Find the section .ex9.itable, and put all entries into it. */ ++ table_sec = nds32_elf_ex9_get_section (link_info->input_bfds); ++ ++ if (table_sec != NULL) ++ { ++ if (!nds32_get_section_contents (table_sec->owner, table_sec, ++ &contents, TRUE)) ++ return; ++ ++ for (ptr = ex9_insn_head; ptr !=NULL ; ptr = ptr->next) ++ number++; ++ ++ table_sec->size = number * 4; ++ ++ if (number == 0) ++ return; ++ ++ /* Check $itb register if set. */ ++ if (!table->ex9_import_file ++ && !bfd_link_hash_lookup (link_info->hash, "_ITB_BASE_", ++ FALSE, FALSE, TRUE)) ++ { ++ (*_bfd_error_handler) ++ (_("\nError: Instruction Table(IT) is used, but Instruction " ++ "Table Base($ITB) isn't set.\nPlease add the following " ++ "instructions in _start of crt0.S:\n" ++ "\"la $r0,_ITB_BASE_;mtusr $r0,$ITB\"")); ++ exit (1); ++ } ++ ++ elf_elfheader (link_info->output_bfd)->e_flags |= E_NDS32_HAS_EX9_INST; ++ number = 0; ++ for (ptr = ex9_insn_head; ptr !=NULL ; ptr = ptr->next) ++ { ++ long val; ++ ++ val = strtol (ptr->string, NULL, 16); ++ bfd_putb32 ((bfd_vma) val, (char *) contents + (number * 4)); ++ number++; ++ } ++ } ++} ++ ++/* Get insn with regs according to relocation type. */ ++ ++static void ++nds32_elf_get_insn_with_reg (Elf_Internal_Rela *irel, ++ uint32_t insn, uint32_t *insn_with_reg) ++{ ++ reloc_howto_type *howto = NULL; ++ ++ if (irel == NULL ++ || (ELF32_R_TYPE (irel->r_info) >= (int) ARRAY_SIZE (nds32_elf_howto_table) ++ && (ELF32_R_TYPE (irel->r_info) - R_NDS32_RELAX_ENTRY) ++ >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table))) ++ { ++ *insn_with_reg = insn; ++ return; ++ } ++ ++ howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info)); ++ *insn_with_reg = insn & (0xffffffff ^ howto->dst_mask); ++} ++ ++/* Mask number of address bits according to relocation. */ ++ ++static unsigned long ++nds32_elf_irel_mask (Elf_Internal_Rela *irel) ++{ ++ reloc_howto_type *howto = NULL; ++ ++ if (irel == NULL ++ || (ELF32_R_TYPE (irel->r_info) >= (int) ARRAY_SIZE (nds32_elf_howto_table) ++ && (ELF32_R_TYPE (irel->r_info) - R_NDS32_RELAX_ENTRY) ++ >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table))) ++ return 0; ++ ++ howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info)); ++ return howto->dst_mask; ++} ++ ++static void ++nds32_elf_insert_irel_entry (struct elf_nds32_irel_entry **irel_list, ++ struct elf_nds32_irel_entry *irel_ptr) ++{ ++ if (*irel_list == NULL) ++ { ++ *irel_list = irel_ptr; ++ irel_ptr->next = NULL; ++ } ++ else ++ { ++ irel_ptr->next = *irel_list; ++ *irel_list = irel_ptr; ++ } ++} ++ ++static void ++nds32_elf_ex9_insert_fix (asection * sec, Elf_Internal_Rela * irel, ++ struct elf_link_hash_entry *h, int order) ++{ ++ struct elf_nds32_ex9_refix *ptr; ++ ++ ptr = bfd_malloc (sizeof (struct elf_nds32_ex9_refix)); ++ ptr->sec = sec; ++ ptr->irel = irel; ++ ptr->h = h; ++ ptr->order = order; ++ ptr->next = NULL; ++ ++ if (ex9_refix_head == NULL) ++ ex9_refix_head = ptr; ++ else ++ { ++ struct elf_nds32_ex9_refix *temp = ex9_refix_head; ++ ++ while (temp->next != NULL) ++ temp = temp->next; ++ temp->next = ptr; ++ } ++} ++ ++enum ++{ ++ DATA_EXIST = 1, ++ CLEAN_PRE = 1 << 1, ++ PUSH_PRE = 1 << 2 ++}; ++ ++/* Check relocation type if supporting for ex9. */ ++ ++static int ++nds32_elf_ex9_relocation_check (struct bfd_link_info *info, ++ Elf_Internal_Rela **irel, ++ Elf_Internal_Rela *irelend, ++ nds32_elf_blank_t *relax_blank_list, ++ asection *sec, bfd_vma *off, ++ bfd_byte *contents) ++{ ++ /* Suppress ex9 if `.no_relax ex9' or inner loop. */ ++ bfd_boolean nested_ex9, nested_loop; ++ bfd_boolean ex9_loop_aware; ++ /* We use the highest 1 byte of result to record ++ how many bytes location counter has to move. */ ++ int result = 0; ++ Elf_Internal_Rela *irel_save = NULL; ++ struct elf_nds32_link_hash_table *table; ++ ++ table = nds32_elf_hash_table (info); ++ ex9_loop_aware = table->ex9_loop_aware; ++ ++ while ((*irel) != NULL && (*irel) < irelend && *off == (*irel)->r_offset) ++ { ++ switch (ELF32_R_TYPE ((*irel)->r_info)) ++ { ++ case R_NDS32_RELAX_REGION_BEGIN: ++ /* Ignore code block. */ ++ nested_ex9 = FALSE; ++ nested_loop = FALSE; ++ if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG) ++ || (ex9_loop_aware ++ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))) ++ { ++ /* Check the region if loop or not. If it is true and ++ ex9-loop-aware is true, ignore the region till region end. */ ++ /* To save the status for in .no_relax ex9 region and ++ loop region to conform the block can do ex9 relaxation. */ ++ nested_ex9 = ((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG); ++ nested_loop = (ex9_loop_aware ++ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG)); ++ while ((*irel) && (*irel) < irelend && (nested_ex9 || nested_loop)) ++ { ++ (*irel)++; ++ if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_BEGIN) ++ { ++ /* There may be nested region. */ ++ if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG) != 0) ++ nested_ex9 = TRUE; ++ else if (ex9_loop_aware ++ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG)) ++ nested_loop = TRUE; ++ } ++ else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_END) ++ { ++ /* The end of region. */ ++ if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG) != 0) ++ nested_ex9 = FALSE; ++ else if (ex9_loop_aware ++ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG)) ++ nested_loop = FALSE; ++ } ++ else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_LABEL ++ && ((*irel)->r_addend & 0x1f) == 2) ++ { ++ /* Alignment exist in the region. */ ++ result |= CLEAN_PRE; ++ if (((*irel)->r_offset - ++ get_nds32_elf_blank_total (&relax_blank_list, ++ (*irel)->r_offset, 0)) & 0x02) ++ result |= PUSH_PRE; ++ } ++ } ++ if ((*irel) >= irelend) ++ *off = sec->size; ++ else ++ *off = (*irel)->r_offset; ++ ++ /* The final instruction in the region, regard this one as data to ignore it. */ ++ result |= DATA_EXIST; ++ return result; ++ } ++ break; ++ ++ case R_NDS32_LABEL: ++ if (((*irel)->r_addend & 0x1f) == 2) ++ { ++ /* Check this point is align and decide to do ex9 or not. */ ++ result |= CLEAN_PRE; ++ if (((*irel)->r_offset - ++ get_nds32_elf_blank_total (&relax_blank_list, ++ (*irel)->r_offset, 0)) & 0x02) ++ result |= PUSH_PRE; ++ } ++ break; ++ case R_NDS32_32_RELA: ++ /* Data. */ ++ result |= (4 << 24); ++ result |= DATA_EXIST; ++ break; ++ case R_NDS32_16_RELA: ++ /* Data. */ ++ result |= (2 << 24); ++ result |= DATA_EXIST; ++ break; ++ case R_NDS32_DATA: ++ /* Data. */ ++ /* The least code alignment is 2. If the data is only one byte, ++ we have to shift one more byte. */ ++ if ((*irel)->r_addend == 1) ++ result |= ((*irel)->r_addend << 25) ; ++ else ++ result |= ((*irel)->r_addend << 24) ; ++ ++ result |= DATA_EXIST; ++ break; ++ ++ case R_NDS32_25_PCREL_RELA: ++ case R_NDS32_SDA16S3_RELA: ++ case R_NDS32_SDA15S3_RELA: ++ case R_NDS32_SDA15S3: ++ case R_NDS32_SDA17S2_RELA: ++ case R_NDS32_SDA15S2_RELA: ++ case R_NDS32_SDA12S2_SP_RELA: ++ case R_NDS32_SDA12S2_DP_RELA: ++ case R_NDS32_SDA15S2: ++ case R_NDS32_SDA18S1_RELA: ++ case R_NDS32_SDA15S1_RELA: ++ case R_NDS32_SDA15S1: ++ case R_NDS32_SDA19S0_RELA: ++ case R_NDS32_SDA15S0_RELA: ++ case R_NDS32_SDA15S0: ++ case R_NDS32_HI20_RELA: ++ case R_NDS32_LO12S0_ORI_RELA: ++ case R_NDS32_LO12S0_RELA: ++ case R_NDS32_LO12S1_RELA: ++ case R_NDS32_LO12S2_RELA: ++ case R_NDS32_20_RELA: ++ /* These relocation is supported ex9 relaxation currently. */ ++ /* We have to save the relocation for using later, since we have ++ to check there is any alignment in the same address. */ ++ irel_save = *irel; ++ break; ++ default: ++ /* Not support relocations. */ ++ if (ELF32_R_TYPE ((*irel)->r_info) < ARRAY_SIZE (nds32_elf_howto_table) ++ && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_NONE ++ && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_INSN16 ++ && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_LOADSTORE) ++ { ++ /* Note: To optimize aggressively, it maybe can ignore ++ R_NDS32_INSN16 here. But we have to consider ++ if there is any side-effect. */ ++ if (!(result & DATA_EXIST)) ++ { ++ /* We have to confirm there is no data relocation in the ++ same address. In general case, this won't happen. */ ++ /* We have to do ex9 conservative, for those relocation not ++ considerd we ignore instruction. */ ++ result |= DATA_EXIST; ++ if (*(contents + *off) & 0x80) ++ result |= (2 << 24); ++ else ++ result |= (4 << 24); ++ break; ++ } ++ } ++ } ++ if ((*irel) < irelend ++ && ((*irel) + 1) < irelend ++ && (*irel)->r_offset == ((*irel) + 1)->r_offset) ++ /* There are relocations pointing to the same address, we have to ++ check all of them. */ ++ (*irel)++; ++ else ++ { ++ if (irel_save) ++ *irel = irel_save; ++ return result; ++ } ++ } ++ return result; ++} ++ ++/* Replace with ex9 instruction. */ ++static bfd_boolean ++nds32_elf_ex9_push_insn (uint16_t insn16, bfd_byte *contents, bfd_vma pre_off, ++ nds32_elf_blank_t **relax_blank_list, ++ struct elf_nds32_irel_entry *pre_irel_ptr, ++ struct elf_nds32_irel_entry **irel_list) ++{ ++ if (insn16 != 0) ++ { ++ /* Implement the ex9 relaxation. */ ++ bfd_putb16 (insn16, contents + pre_off); ++ if (!insert_nds32_elf_blank_recalc_total (relax_blank_list, ++ pre_off + 2, 2)) ++ return FALSE; ++ if (pre_irel_ptr != NULL) ++ nds32_elf_insert_irel_entry (irel_list, pre_irel_ptr); ++ } ++ return TRUE; ++} ++ ++/* Replace input file instruction which is in ex9 itable. */ ++ ++static bfd_boolean ++nds32_elf_ex9_replace_instruction (struct bfd_link_info *info, bfd *abfd, asection *sec) ++{ ++ struct elf_nds32_insn_times_entry *ex9_insn = ex9_insn_head; ++ bfd_byte *contents = NULL; ++ bfd_vma off; ++ uint16_t insn16, insn_ex9; ++ /* `pre_*' are used to track previous instruction that can use ex9.it. */ ++ bfd_vma pre_off = -1; ++ uint16_t pre_insn16 = 0; ++ struct elf_nds32_irel_entry *pre_irel_ptr = NULL; ++ Elf_Internal_Rela *internal_relocs; ++ Elf_Internal_Rela *irel; ++ Elf_Internal_Rela *irelend; ++ Elf_Internal_Shdr *symtab_hdr; ++ Elf_Internal_Sym *isym = NULL; ++ nds32_elf_blank_t *relax_blank_list = NULL; ++ uint32_t insn = 0; ++ uint32_t insn_with_reg = 0; ++ uint32_t it_insn; ++ uint32_t it_insn_with_reg; ++ unsigned long r_symndx; ++ asection *isec; ++ struct elf_nds32_irel_entry *irel_list = NULL; ++ struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd); ++ int data_flag, do_replace, save_irel; ++ struct elf_link_hash_entry_list *h_list; ++ ++ ++ /* Load section instructions, relocations, and symbol table. */ ++ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE) ++ || !nds32_get_local_syms (abfd, sec, &isym)) ++ return FALSE; ++ internal_relocs = ++ _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, TRUE /* keep_memory */); ++ irelend = internal_relocs + sec->reloc_count; ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ ++ off = 0; ++ ++ /* Check if the object enable ex9. */ ++ irel = find_relocs_at_address (internal_relocs, internal_relocs, ++ irelend, R_NDS32_RELAX_ENTRY); ++ ++ /* Check this section trigger ex9 relaxation. */ ++ if (irel == NULL ++ || irel >= irelend ++ || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY ++ || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY ++ && !(irel->r_addend & R_NDS32_RELAX_ENTRY_EX9_FLAG))) ++ return TRUE; ++ ++ irel = internal_relocs; ++ ++ /* Check alignment and fetch proper relocation. */ ++ while (off < sec->size) ++ { ++ struct elf_link_hash_entry *h = NULL; ++ struct elf_nds32_irel_entry *irel_ptr = NULL; ++ ++ /* Syn the instruction and the relocation. */ ++ while (irel != NULL && irel < irelend && irel->r_offset < off) ++ irel++; ++ ++ data_flag = nds32_elf_ex9_relocation_check (info, &irel, irelend, ++ relax_blank_list, sec, ++ &off, contents); ++ if (data_flag & PUSH_PRE) ++ if (!nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off, ++ &relax_blank_list, pre_irel_ptr, ++ &irel_list)) ++ return FALSE; ++ ++ if (data_flag & CLEAN_PRE) ++ { ++ pre_off = 0; ++ pre_insn16 = 0; ++ pre_irel_ptr = NULL; ++ } ++ if (data_flag & DATA_EXIST) ++ { ++ /* We save the move offset in the highest byte. */ ++ off += (data_flag >> 24); ++ continue; ++ } ++ ++ if (*(contents + off) & 0x80) ++ { ++ /* 2-byte instruction. */ ++ off += 2; ++ continue; ++ } ++ ++ /* Load the instruction and its opcode with register for comparing. */ ++ ex9_insn = ex9_insn_head; ++ insn = bfd_getb32 (contents + off); ++ insn_with_reg = 0; ++ /* Insn with relocation. Mask instruction. */ ++ if (irel != NULL && irel < irelend && irel->r_offset == off) ++ nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg); ++ ++ while (ex9_insn) ++ { ++ it_insn = strtol (ex9_insn->string, NULL, 16); ++ it_insn_with_reg = 0; ++ do_replace = 0; ++ save_irel = 0; ++ ++ if (irel != NULL && irel < irelend && irel->r_offset == off ++ && ex9_insn->irel != NULL) ++ nds32_elf_get_insn_with_reg (ex9_insn->irel, it_insn, ++ &it_insn_with_reg); ++ ++ /* Instruction and ex9 both have relocation. */ ++ if (insn_with_reg != 0 && it_insn_with_reg != 0 ++ && (ELF32_R_TYPE (irel->r_info) == ++ ELF32_R_TYPE (ex9_insn->irel->r_info)) ++ && (insn_with_reg == it_insn_with_reg)) ++ { ++ /* Insn relocation and format is the same as table entry. */ ++ ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_ORI_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S1_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_RELA ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3 ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0) ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA) ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA ++ && ELF32_R_TYPE (irel->r_info) <= ++ R_NDS32_SDA12S2_SP_RELA) ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA) ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_20_RELA) ++ { ++ r_symndx = ELF32_R_SYM (irel->r_info); ++ if (r_symndx < symtab_hdr->sh_info) ++ { ++ /* Local symbol. */ ++ int shndx = isym[r_symndx].st_shndx; ++ ++ isec = elf_elfsections (abfd)[shndx]->bfd_section; ++ if (ex9_insn->sec == isec ++ && ex9_insn->irel->r_addend == irel->r_addend ++ && ex9_insn->irel->r_info == irel->r_info) ++ { ++ do_replace = 1; ++ save_irel = 1; ++ } ++ } ++ else if (ex9_insn->m_list) ++ { ++ /* External symbol. */ ++ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; ++ h_list = ex9_insn->m_list->h_list; ++ while (h_list) ++ { ++ if (ex9_insn->m_list->irel->r_addend == irel->r_addend ++ && h == h_list->h) ++ { ++ do_replace = 1; ++ save_irel = 1; ++ break; ++ } ++ h_list = h_list->next; ++ } ++ } ++ } ++ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_HI20_RELA) ++ { ++ r_symndx = ELF32_R_SYM (irel->r_info); ++ if (r_symndx < symtab_hdr->sh_info) ++ { ++ /* Local symbols. Compare its base symbol ++ and offset. */ ++ int shndx = isym[r_symndx].st_shndx; ++ ++ isec = elf_elfsections (abfd)[shndx]->bfd_section; ++ if (ex9_insn->sec == isec ++ && ex9_insn->irel->r_addend == irel->r_addend ++ && ex9_insn->irel->r_info == irel->r_info) ++ { ++ do_replace = 1; ++ save_irel = 1; ++ } ++ } ++ else ++ { ++ /* External symbol. */ ++ struct elf_link_hash_entry_mul_list *m_list; ++ ++ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; ++ m_list = ex9_insn->m_list; ++ ++ while (m_list && !do_replace) ++ { ++ h_list = m_list->h_list; ++ while (h_list) ++ { ++ if (h == h_list->h ++ && m_list->irel->r_addend == irel->r_addend) ++ { ++ do_replace = 1; ++ save_irel = 1; ++ /* sethi multiple entry must be fixed. */ ++ if (ex9_insn->next && ex9_insn->m_list ++ && ex9_insn->m_list == ex9_insn->next->m_list) ++ nds32_elf_ex9_insert_fix (sec, irel, h, ++ ex9_insn->order); ++ break; ++ } ++ h_list = h_list->next; ++ } ++ m_list = m_list->next; ++ } ++ } ++ } ++ } ++ /* Import table: Check the symbol hash table and the ++ jump target. Only R_NDS32_25_PCREL_RELA now. */ ++ else if (insn_with_reg != 0 && ex9_insn->times == -1 ++ && ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA) ++ { ++ nds32_elf_get_insn_with_reg (irel, it_insn, &it_insn_with_reg); ++ if (insn_with_reg == it_insn_with_reg) ++ { ++ char code[10]; ++ bfd_vma relocation; ++ ++ r_symndx = ELF32_R_SYM (irel->r_info); ++ if (r_symndx >= symtab_hdr->sh_info) ++ { ++ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; ++ if ((h->root.type == bfd_link_hash_defined ++ || h->root.type == bfd_link_hash_defweak) ++ && h->root.u.def.section != NULL ++ && h->root.u.def.section->output_section != NULL ++ && h->root.u.def.section->gc_mark == 1 ++ && bfd_is_abs_section (h->root.u.def.section) ++ && h->root.u.def.value > sec->size) ++ { ++ relocation = h->root.u.def.value + ++ h->root.u.def.section->output_section->vma + ++ h->root.u.def.section->output_offset; ++ relocation += irel->r_addend; ++ insn = insn_with_reg ++ | ((relocation >> 1) & 0xffffff); ++ snprintf (code, sizeof (code), "%08x", insn); ++ if (strcmp (code, ex9_insn->string) == 0) ++ { ++ do_replace = 1; ++ save_irel = 1; ++ } ++ } ++ } ++ } ++ } ++ else if ((irel == NULL || irel >= irelend || irel->r_offset != off) ++ && insn == it_insn && ex9_insn->irel == NULL) ++ { ++ /* Instruction without relocation, we only ++ have to compare their byte code. */ ++ do_replace = 1; ++ } ++ ++ /* Insntruction match so replacing the code here. */ ++ if (do_replace == 1) ++ { ++ /* There are two formats of ex9 instruction. */ ++ if (ex9_insn->order < 32) ++ insn_ex9 = INSN_EX9_IT_2; ++ else ++ insn_ex9 = INSN_EX9_IT_1; ++ insn16 = insn_ex9 | ex9_insn->order; ++ ++ /* Insert ex9 instruction. */ ++ nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off, ++ &relax_blank_list, pre_irel_ptr, ++ &irel_list); ++ pre_off = off; ++ pre_insn16 = insn16; ++ ++ if (save_irel) ++ { ++ /* For instuction with relocation do relax. */ ++ irel_ptr = (struct elf_nds32_irel_entry *) ++ bfd_malloc (sizeof (struct elf_nds32_irel_entry)); ++ irel_ptr->irel = irel; ++ irel_ptr->next = NULL; ++ pre_irel_ptr = irel_ptr; ++ } ++ else ++ pre_irel_ptr = NULL; ++ break; ++ } ++ ex9_insn = ex9_insn->next; ++ } ++ off += 4; ++ } ++ ++ /* Insert ex9 instruction. */ ++ nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off, ++ &relax_blank_list, pre_irel_ptr, ++ &irel_list); ++ ++ /* Delete the redundant code. */ ++ if (relax_blank_list) ++ { ++ nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list); ++ relax_blank_list = NULL; ++ } ++ ++ /* Clear the relocation that is replaced by ex9. */ ++ while (irel_list) ++ { ++ struct elf_nds32_irel_entry *irel_ptr; ++ ++ irel_ptr = irel_list; ++ irel_list = irel_ptr->next; ++ irel_ptr->irel->r_info = ++ ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info), R_NDS32_TRAN); ++ free (irel_ptr); ++ } ++ return TRUE; ++} ++ ++/* Initialize ex9 hash table. */ ++ ++static int ++nds32_elf_ex9_init (void) ++{ ++ if (!bfd_hash_table_init_n (&ex9_code_table, nds32_elf_code_hash_newfunc, ++ sizeof (struct elf_nds32_code_hash_entry), ++ 1023)) ++ { ++ (*_bfd_error_handler) (_("Linker: cannot init ex9 hash table error \n")); ++ return FALSE; ++ } ++ return TRUE; ++} ++ ++/* Predict how many bytes will be relaxed with ex9 and ifc. */ ++ ++static void ++nds32_elf_ex9_total_relax (struct bfd_link_info *info) ++{ ++ struct elf_nds32_insn_times_entry *ex9_insn; ++ struct elf_nds32_insn_times_entry *temp; ++ int target_optimize; ++ struct elf_nds32_link_hash_table *table; ++ ++ if (ex9_insn_head == NULL) ++ return; ++ ++ table = nds32_elf_hash_table (info); ++ target_optimize = table->target_optimize; ++ ex9_insn = ex9_insn_head; ++ while (ex9_insn) ++ { ++ ex9_relax_size = ex9_insn->times * 2 + ex9_relax_size; ++ temp = ex9_insn; ++ ex9_insn = ex9_insn->next; ++ free (temp); ++ } ++ ex9_insn_head = NULL; ++ ++ if ((target_optimize & NDS32_RELAX_IFC_ON)) ++ { ++ /* Examine the potential of ifc reduce size. */ ++ struct elf_nds32_ifc_symbol_entry *ifc_ent = ifc_symbol_head; ++ struct elf_nds32_ifc_irel_list *irel_ptr = NULL; ++ int size = 0; ++ ++ while (ifc_ent) ++ { ++ if (ifc_ent->enable == 0) ++ { ++ /* Not ifc yet. */ ++ irel_ptr = ifc_ent->irel_head; ++ while (irel_ptr) ++ { ++ size += 2; ++ irel_ptr = irel_ptr->next; ++ } ++ } ++ size -= 2; ++ ifc_ent = ifc_ent->next; ++ } ++ ex9_relax_size += size; ++ } ++} ++ ++/* Finish ex9 table. */ ++ ++void ++nds32_elf_ex9_finish (struct bfd_link_info *link_info) ++{ ++ nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times); ++ nds32_elf_order_insn_times (link_info); ++ nds32_elf_ex9_total_relax (link_info); ++ /* Traverse the hash table and count its times. */ ++ nds32_elf_code_hash_traverse (nds32_elf_count_insn_times); ++ nds32_elf_order_insn_times (link_info); ++ nds32_elf_ex9_build_itable (link_info); ++} ++ ++/* Relocate the entries in ex9 table. */ ++ ++static bfd_vma ++nds32_elf_ex9_reloc_insn (struct elf_nds32_insn_times_entry *ptr, ++ struct bfd_link_info *link_info) ++{ ++ Elf_Internal_Sym *isym = NULL; ++ bfd_vma relocation = -1; ++ struct elf_link_hash_entry *h; ++ ++ if (ptr->m_list != NULL) ++ { ++ /* Global symbol. */ ++ h = ptr->m_list->h_list->h; ++ if ((h->root.type == bfd_link_hash_defined ++ || h->root.type == bfd_link_hash_defweak) ++ && h->root.u.def.section != NULL ++ && h->root.u.def.section->output_section != NULL) ++ { ++ ++ relocation = h->root.u.def.value + ++ h->root.u.def.section->output_section->vma + ++ h->root.u.def.section->output_offset; ++ relocation += ptr->m_list->irel->r_addend; ++ } ++ else ++ relocation = 0; ++ } ++ else if (ptr->sec !=NULL) ++ { ++ /* Local symbol. */ ++ Elf_Internal_Sym sym; ++ asection *sec = NULL; ++ asection isec; ++ asection *isec_ptr = &isec; ++ Elf_Internal_Rela irel_backup = *(ptr->irel); ++ asection *sec_backup = ptr->sec; ++ bfd *abfd = ptr->sec->owner; ++ ++ if (!nds32_get_local_syms (abfd, sec, &isym)) ++ return FALSE; ++ isym = isym + ELF32_R_SYM (ptr->irel->r_info); ++ ++ sec = bfd_section_from_elf_index (abfd, isym->st_shndx); ++ if (sec != NULL) ++ *isec_ptr = *sec; ++ sym = *isym; ++ ++ /* The purpose is same as elf_link_input_bfd. */ ++ if (isec_ptr != NULL ++ && isec_ptr->sec_info_type == SEC_INFO_TYPE_MERGE ++ && ELF_ST_TYPE (isym->st_info) != STT_SECTION) ++ { ++ sym.st_value = ++ _bfd_merged_section_offset (ptr->sec->output_section->owner, &isec_ptr, ++ elf_section_data (isec_ptr)->sec_info, ++ isym->st_value); ++ } ++ relocation = _bfd_elf_rela_local_sym (link_info->output_bfd, &sym, ++ &ptr->sec, ptr->irel); ++ if (ptr->irel != NULL) ++ relocation += ptr->irel->r_addend; ++ ++ /* Restore origin value since there may be some insntructions that ++ could not be replaced with ex9.it. */ ++ *(ptr->irel) = irel_backup; ++ ptr->sec = sec_backup; ++ } ++ ++ return relocation; ++} ++ ++/* Import ex9 table and build list. */ ++ ++void ++nds32_elf_ex9_import_table (struct bfd_link_info *info) ++{ ++ int num = 0; ++ bfd_byte *contents; ++ unsigned long insn; ++ FILE *ex9_import_file; ++ int update_ex9_table; ++ struct elf_nds32_link_hash_table *table; ++ ++ table = nds32_elf_hash_table (info); ++ ex9_import_file = table->ex9_import_file; ++ rewind (table->ex9_import_file); ++ ++ contents = bfd_malloc (sizeof (bfd_byte) * 4); ++ ++ /* Read instructions from the input file and build the list. */ ++ while (!feof (ex9_import_file)) ++ { ++ char *code; ++ struct elf_nds32_insn_times_entry *ptr; ++ size_t nread; ++ ++ nread = fread (contents, sizeof (bfd_byte) * 4, 1, ex9_import_file); ++ /* Ignore the final byte 0x0a. */ ++ if (nread < 1) ++ break; ++ insn = bfd_getb32 (contents); ++ code = bfd_malloc (sizeof (char) * 9); ++ snprintf (code, 9, "%08lx", insn); ++ ptr = bfd_malloc (sizeof (struct elf_nds32_insn_times_entry)); ++ ptr->string = code; ++ ptr->order = num; ++ ptr->times = -1; ++ ptr->sec = NULL; ++ ptr->m_list = NULL; ++ ptr->rel_backup.r_offset = 0; ++ ptr->rel_backup.r_info = 0; ++ ptr->rel_backup.r_addend = 0; ++ ptr->irel = NULL; ++ ptr->next = NULL; ++ nds32_elf_ex9_insert_entry (ptr); ++ num++; ++ } ++ ++ update_ex9_table = table->update_ex9_table; ++ if (update_ex9_table == 1) ++ { ++ /* It has to consider of sethi need to use multiple page ++ but it not be done yet. */ ++ nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times); ++ nds32_elf_order_insn_times (info); ++ } ++} ++ ++/* Export ex9 table. */ ++ ++static void ++nds32_elf_ex9_export (struct bfd_link_info *info, ++ bfd_byte *contents, int size) ++{ ++ FILE *ex9_export_file; ++ struct elf_nds32_link_hash_table *table; ++ ++ table = nds32_elf_hash_table (info); ++ ex9_export_file = table->ex9_export_file; ++ fwrite (contents, sizeof (bfd_byte), size, ex9_export_file); ++ fclose (ex9_export_file); ++} ++ ++/* Adjust relocations of J and JAL in ex9.itable. ++ Export ex9 table. */ ++ ++static void ++nds32_elf_ex9_reloc_jmp (struct bfd_link_info *link_info) ++{ ++ asection *table_sec = NULL; ++ struct elf_nds32_insn_times_entry *ex9_insn = ex9_insn_head; ++ struct elf_nds32_insn_times_entry *temp_ptr, *temp_ptr2; ++ uint32_t insn, insn_with_reg, source_insn; ++ bfd_byte *contents = NULL, *source_contents = NULL; ++ int size = 0; ++ bfd_vma gp; ++ int shift, update_ex9_table, offset = 0; ++ reloc_howto_type *howto = NULL; ++ Elf_Internal_Rela rel_backup; ++ unsigned short insn_ex9; ++ struct elf_nds32_link_hash_table *table; ++ FILE *ex9_export_file; ++ static bfd_boolean done = FALSE; ++ ++ if (done) ++ return; ++ ++ done = TRUE; ++ ++ table = nds32_elf_hash_table (link_info); ++ if (table) ++ table->relax_status |= NDS32_RELAX_EX9_DONE; ++ ++ update_ex9_table = table->update_ex9_table; ++ ++ /* Generated ex9.itable exactly. */ ++ if (update_ex9_table == 0) ++ { ++ bfd *output_bfd; ++ table_sec = nds32_elf_ex9_get_section (link_info->input_bfds); ++ ++ if (table_sec == NULL) ++ { ++ (*_bfd_error_handler) (_("ld: error cannot find ex9 section.\n")); ++ return; ++ } ++ ++ output_bfd = table_sec->output_section->owner; ++ nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE); ++ if (table_sec->size == 0) ++ return; ++ ++ if (!nds32_get_section_contents (table_sec->owner, table_sec, ++ &contents, TRUE)) ++ return; ++ } ++ else ++ { ++ /* Set gp. */ ++ bfd *output_bfd; ++ ++ output_bfd = link_info->input_bfds->sections->output_section->owner; ++ nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE); ++ contents = bfd_malloc (sizeof (bfd_byte) * 2048); ++ } ++ ++ /* Relocate instruction. */ ++ while (ex9_insn) ++ { ++ bfd_vma relocation, min_relocation = 0xffffffff; ++ ++ insn = strtol (ex9_insn->string, NULL, 16); ++ insn_with_reg = 0; ++ if (ex9_insn->m_list != NULL || ex9_insn->sec != NULL) ++ { ++ if (ex9_insn->m_list) ++ rel_backup = ex9_insn->m_list->rel_backup; ++ else ++ rel_backup = ex9_insn->rel_backup; ++ ++ nds32_elf_get_insn_with_reg (&rel_backup, insn, &insn_with_reg); ++ howto = ++ bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE ++ (rel_backup.r_info)); ++ shift = howto->rightshift; ++ if (ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_25_PCREL_RELA ++ || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S0_ORI_RELA ++ || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S0_RELA ++ || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S1_RELA ++ || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S2_RELA ++ || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_20_RELA) ++ { ++ relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info); ++ insn = ++ insn_with_reg | ((relocation >> shift) & ++ nds32_elf_irel_mask (&rel_backup)); ++ bfd_putb32 (insn, contents + (ex9_insn->order) * 4); ++ } ++ else if ((ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA15S3 ++ && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA15S0) ++ || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA15S3_RELA ++ && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA15S0_RELA) ++ || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA12S2_DP_RELA ++ && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA12S2_SP_RELA) ++ || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA16S3_RELA ++ && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA19S0_RELA)) ++ { ++ relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info); ++ insn = ++ insn_with_reg | (((relocation - gp) >> shift) & ++ nds32_elf_irel_mask (&rel_backup)); ++ bfd_putb32 (insn, contents + (ex9_insn->order) * 4); ++ } ++ else if (ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_HI20_RELA) ++ { ++ /* Sethi may be multiple entry for one insn. */ ++ if (ex9_insn->next && ex9_insn->m_list ++ && ex9_insn->m_list == ex9_insn->next->m_list) ++ { ++ struct elf_link_hash_entry_mul_list *m_list; ++ struct elf_nds32_ex9_refix *fix_ptr; ++ struct elf_link_hash_entry *h; ++ ++ temp_ptr = ex9_insn; ++ temp_ptr2 = ex9_insn; ++ m_list = ex9_insn->m_list; ++ while (m_list) ++ { ++ h = m_list->h_list->h; ++ relocation = h->root.u.def.value + ++ h->root.u.def.section->output_section->vma + ++ h->root.u.def.section->output_offset; ++ relocation += m_list->irel->r_addend; ++ ++ if (relocation < min_relocation) ++ min_relocation = relocation; ++ m_list = m_list->next; ++ } ++ relocation = min_relocation; ++ ++ /* Put insntruction into ex9 table. */ ++ insn = insn_with_reg ++ | ((relocation >> shift) & nds32_elf_irel_mask (&rel_backup)); ++ bfd_putb32 (insn, contents + (ex9_insn->order) * 4); ++ relocation = relocation + 0x1000; /* hi20 */ ++ ++ while (ex9_insn->next && ex9_insn->m_list ++ && ex9_insn->m_list == ex9_insn->next->m_list) ++ { ++ /* Multiple sethi. */ ++ ex9_insn = ex9_insn->next; ++ size += 4; ++ insn = ++ insn_with_reg | ((relocation >> shift) & ++ nds32_elf_irel_mask (&rel_backup)); ++ bfd_putb32 (insn, contents + (ex9_insn->order) * 4); ++ relocation = relocation + 0x1000; /* hi20 */ ++ } ++ ++ fix_ptr = ex9_refix_head; ++ while (fix_ptr) ++ { ++ /* Fix ex9 insn. */ ++ /* temp_ptr2 points to the head of multiple sethi. */ ++ temp_ptr = temp_ptr2; ++ while (fix_ptr->order != temp_ptr->order && fix_ptr->next) ++ { ++ fix_ptr = fix_ptr->next; ++ } ++ if (fix_ptr->order != temp_ptr->order) ++ break; ++ ++ /* Set source insn. */ ++ relocation = ++ fix_ptr->h->root.u.def.value + ++ fix_ptr->h->root.u.def.section->output_section->vma + ++ fix_ptr->h->root.u.def.section->output_offset; ++ relocation += fix_ptr->irel->r_addend; ++ /* sethi imm is imm20s. */ ++ source_insn = insn_with_reg | ((relocation >> shift) & 0xfffff); ++ ++ while (temp_ptr) ++ { ++ /* Match entry and source code. */ ++ insn = bfd_getb32 (contents + (temp_ptr->order) * 4 + offset); ++ if (insn == source_insn) ++ { ++ /* Fix the ex9 insn. */ ++ if (temp_ptr->order != fix_ptr->order) ++ { ++ if (!nds32_get_section_contents ++ (fix_ptr->sec->owner, fix_ptr->sec, ++ &source_contents, TRUE)) ++ (*_bfd_error_handler) ++ (_("Linker: error cannot fixed ex9 relocation \n")); ++ if (temp_ptr->order < 32) ++ insn_ex9 = INSN_EX9_IT_2; ++ else ++ insn_ex9 = INSN_EX9_IT_1; ++ insn_ex9 = insn_ex9 | temp_ptr->order; ++ bfd_putb16 (insn_ex9, source_contents + fix_ptr->irel->r_offset); ++ } ++ break; ++ } ++ else ++ { ++ if (!temp_ptr->next || temp_ptr->m_list != temp_ptr->next->m_list) ++ (*_bfd_error_handler) ++ (_("Linker: error cannot fixed ex9 relocation \n")); ++ else ++ temp_ptr = temp_ptr->next; ++ } ++ } ++ fix_ptr = fix_ptr->next; ++ } ++ } ++ else ++ { ++ relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info); ++ insn = insn_with_reg ++ | ((relocation >> shift) & nds32_elf_irel_mask (&rel_backup)); ++ bfd_putb32 (insn, contents + (ex9_insn->order) * 4); ++ } ++ } ++ } ++ else ++ { ++ /* Insn without relocation does not have to be fixed ++ if need to update export table. */ ++ if (update_ex9_table == 1) ++ bfd_putb32 (insn, contents + (ex9_insn->order) * 4); ++ } ++ ex9_insn = ex9_insn->next; ++ size += 4; ++ } ++ ++ ex9_export_file = table->ex9_export_file; ++ if (ex9_export_file != NULL) ++ nds32_elf_ex9_export (link_info, contents, table_sec->size); ++ else if (update_ex9_table == 1) ++ { ++ table->ex9_export_file = table->ex9_import_file; ++ rewind (table->ex9_export_file); ++ nds32_elf_ex9_export (link_info, contents, size); ++ } ++} ++ ++/* Check this instruction is convertable to ex9. */ ++static bfd_boolean ++nds32_elf_ex9_check_available (uint32_t insn) ++{ ++ if (N32_OP6 (insn) == N32_OP6_MISC ++ && (N32_SUB5 (insn) == N32_MISC_SYSCALL ++ || N32_SUB5 (insn) == N32_MISC_BREAK ++ || N32_SUB5 (insn) == N32_MISC_TEQZ ++ || N32_SUB5 (insn) == N32_MISC_TNEZ ++ || N32_SUB5 (insn) == N32_MISC_TRAP)) ++ return FALSE; ++ return TRUE; ++} ++ ++/* Generate ex9 hash table. */ ++ ++static bfd_boolean ++nds32_elf_ex9_build_hash_table (bfd *abfd, asection *sec, ++ struct bfd_link_info *link_info) ++{ ++ Elf_Internal_Rela *internal_relocs; ++ Elf_Internal_Rela *irelend; ++ Elf_Internal_Rela *irel; ++ Elf_Internal_Rela *jrel; ++ Elf_Internal_Rela rel_backup; ++ Elf_Internal_Shdr *symtab_hdr; ++ Elf_Internal_Sym *isym = NULL; ++ asection *isec; ++ struct elf_link_hash_entry **sym_hashes; ++ bfd_byte *contents = NULL; ++ bfd_vma off = 0; ++ unsigned long r_symndx; ++ uint32_t insn, insn_with_reg; ++ struct elf_link_hash_entry *h; ++ int data_flag, shift, align; ++ bfd_vma relocation; ++ /* Suppress ex9 if `.no_relax ex9' or inner loop. */ ++ reloc_howto_type *howto = NULL; ++ ++ sym_hashes = elf_sym_hashes (abfd); ++ /* Load section instructions, relocations, and symbol table. */ ++ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)) ++ return FALSE; ++ ++ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, ++ TRUE /* keep_memory */); ++ irelend = internal_relocs + sec->reloc_count; ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ if (!nds32_get_local_syms (abfd, sec, &isym)) ++ return FALSE; ++ ++ /* Check the object if enable ex9. */ ++ irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend, ++ R_NDS32_RELAX_ENTRY); ++ ++ /* Check this section trigger ex9 relaxation. */ ++ if (irel == NULL ++ || irel >= irelend ++ || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY ++ || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY ++ && !(irel->r_addend & R_NDS32_RELAX_ENTRY_EX9_FLAG))) ++ return TRUE; ++ ++ irel = internal_relocs; ++ ++ /* Push each insn into hash table. */ ++ while (off < sec->size) ++ { ++ char code[10]; ++ struct elf_nds32_code_hash_entry *entry; ++ ++ while (irel != NULL && irel < irelend && irel->r_offset < off) ++ irel++; ++ ++ data_flag = nds32_elf_ex9_relocation_check (link_info, &irel, irelend, ++ NULL, sec, &off, contents); ++ if (data_flag & DATA_EXIST) ++ { ++ /* We save the move offset in the highest byte. */ ++ off += (data_flag >> 24); ++ continue; ++ } ++ ++ /* Ignore 2-byte instruction. */ ++ if (*(contents + off) & 0x80) ++ { ++ off += 2; ++ continue; ++ } ++ ++ insn = bfd_getb32 (contents + off); ++ if (!nds32_elf_ex9_check_available (insn)) ++ { ++ off += 4; ++ continue; ++ } ++ ++ h = NULL; ++ isec = NULL; ++ jrel = NULL; ++ rel_backup.r_info = 0; ++ rel_backup.r_offset = 0; ++ rel_backup.r_addend = 0; ++ /* Load the instruction and its opcode with register for comparing. */ ++ insn_with_reg = 0; ++ if (irel != NULL && irel < irelend && irel->r_offset == off) ++ { ++ nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg); ++ howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info)); ++ shift = howto->rightshift; ++ align = (1 << shift) - 1; ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_HI20_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_ORI_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S1_RELA ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_RELA ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3 ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0) ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA) ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA) ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA) ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_20_RELA) ++ { ++ r_symndx = ELF32_R_SYM (irel->r_info); ++ jrel = irel; ++ rel_backup = *irel; ++ if (r_symndx < symtab_hdr->sh_info) ++ { ++ /* Local symbol. */ ++ int shndx = isym[r_symndx].st_shndx; ++ ++ bfd_vma st_value = (isym + r_symndx)->st_value; ++ isec = elf_elfsections (abfd)[shndx]->bfd_section; ++ relocation = (isec->output_section->vma + isec->output_offset ++ + st_value + irel->r_addend); ++ } ++ else ++ { ++ /* External symbol. */ ++ bfd_boolean warned ATTRIBUTE_UNUSED; ++ bfd_boolean unresolved_reloc ATTRIBUTE_UNUSED; ++ asection *sym_sec; ++ ++ /* Maybe there is a better way to get h and relocation */ ++ RELOC_FOR_GLOBAL_SYMBOL (link_info, abfd, sec, irel, ++ r_symndx, symtab_hdr, sym_hashes, ++ h, sym_sec, relocation, ++ unresolved_reloc, warned); ++ relocation += irel->r_addend; ++ if ((h->root.type != bfd_link_hash_defined ++ && h->root.type != bfd_link_hash_defweak) ++ || strcmp (h->root.root.string, "_FP_BASE_") == 0) ++ { ++ off += 4; ++ continue; ++ } ++ } ++ ++ /* Check for gp relative instruction alignment. */ ++ if ((ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3 ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0) ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA) ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA) ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA)) ++ { ++ bfd_vma gp; ++ bfd *output_bfd = sec->output_section->owner; ++ bfd_reloc_status_type r; ++ ++ /* If the symbol is in the abs section, the out_bfd will be ++ null. This happens when the relocation has a ++ symbol@GOTOFF. */ ++ r = nds32_elf_final_sda_base (output_bfd, link_info, ++ &gp, FALSE); ++ if (r != bfd_reloc_ok) ++ { ++ off += 4; ++ continue; ++ } ++ ++ relocation -= gp; ++ ++ /* Make sure alignment is correct. */ ++ if (relocation & align) ++ { ++ /* Incorrect alignment. */ ++ (*_bfd_error_handler) ++ (_("%s: warning: unaligned small data access. " ++ "For entry: {%d, %d, %d}, addr = 0x%x, align = 0x%x."), ++ bfd_get_filename (abfd), irel->r_offset, ++ irel->r_info, irel->r_addend, relocation, align); ++ off += 4; ++ continue; ++ } ++ } ++ ++ insn = insn_with_reg ++ | ((relocation >> shift) & nds32_elf_irel_mask (irel)); ++ } ++ else ++ { ++ off += 4; ++ continue; ++ } ++ } ++ ++ snprintf (code, sizeof (code), "%08x", insn); ++ /* Copy "code". */ ++ entry = (struct elf_nds32_code_hash_entry*) ++ bfd_hash_lookup (&ex9_code_table, code, TRUE, TRUE); ++ if (entry == NULL) ++ { ++ (*_bfd_error_handler) ++ (_("%P%F: failed creating ex9.it %s hash table: %E\n"), code); ++ return FALSE; ++ } ++ if (h) ++ { ++ if (h->root.type == bfd_link_hash_undefined) ++ return TRUE; ++ /* Global symbol. */ ++ /* In order to do sethi with different symbol but same value. */ ++ if (entry->m_list == NULL) ++ { ++ struct elf_link_hash_entry_mul_list *m_list_new; ++ struct elf_link_hash_entry_list *h_list_new; ++ ++ m_list_new = (struct elf_link_hash_entry_mul_list *) ++ bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list)); ++ h_list_new = (struct elf_link_hash_entry_list *) ++ bfd_malloc (sizeof (struct elf_link_hash_entry_list)); ++ entry->m_list = m_list_new; ++ m_list_new->h_list = h_list_new; ++ m_list_new->rel_backup = rel_backup; ++ m_list_new->times = 1; ++ m_list_new->irel = jrel; ++ m_list_new->next = NULL; ++ h_list_new->h = h; ++ h_list_new->next = NULL; ++ } ++ else ++ { ++ struct elf_link_hash_entry_mul_list *m_list = entry->m_list; ++ struct elf_link_hash_entry_list *h_list; ++ ++ while (m_list) ++ { ++ /* Build the different symbols that point to the same address. */ ++ h_list = m_list->h_list; ++ if (h_list->h->root.u.def.value == h->root.u.def.value ++ && h_list->h->root.u.def.section->output_section->vma ++ == h->root.u.def.section->output_section->vma ++ && h_list->h->root.u.def.section->output_offset ++ == h->root.u.def.section->output_offset ++ && m_list->rel_backup.r_addend == rel_backup.r_addend) ++ { ++ m_list->times++; ++ m_list->irel = jrel; ++ while (h_list->h != h && h_list->next) ++ h_list = h_list->next; ++ if (h_list->h != h) ++ { ++ struct elf_link_hash_entry_list *h_list_new; ++ ++ h_list_new = (struct elf_link_hash_entry_list *) ++ bfd_malloc (sizeof (struct elf_link_hash_entry_list)); ++ h_list->next = h_list_new; ++ h_list_new->h = h; ++ h_list_new->next = NULL; ++ } ++ break; ++ } ++ /* The sethi case may have different address but the ++ hi20 is the same. */ ++ else if (ELF32_R_TYPE (jrel->r_info) == R_NDS32_HI20_RELA ++ && m_list->next == NULL) ++ { ++ struct elf_link_hash_entry_mul_list *m_list_new; ++ struct elf_link_hash_entry_list *h_list_new; ++ ++ m_list_new = (struct elf_link_hash_entry_mul_list *) ++ bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list)); ++ h_list_new = (struct elf_link_hash_entry_list *) ++ bfd_malloc (sizeof (struct elf_link_hash_entry_list)); ++ m_list->next = m_list_new; ++ m_list_new->h_list = h_list_new; ++ m_list_new->rel_backup = rel_backup; ++ m_list_new->times = 1; ++ m_list_new->irel = jrel; ++ m_list_new->next = NULL; ++ h_list_new->h = h; ++ h_list_new->next = NULL; ++ break; ++ } ++ m_list = m_list->next; ++ } ++ if (!m_list) ++ { ++ off += 4; ++ continue; ++ } ++ } ++ } ++ else ++ { ++ /* Local symbol and insn without relocation*/ ++ entry->times++; ++ entry->rel_backup = rel_backup; ++ } ++ ++ /* Use in sethi insn with constant and global symbol in same format. */ ++ if (!jrel) ++ entry->const_insn = 1; ++ else ++ entry->irel = jrel; ++ entry->sec = isec; ++ off += 4; ++ } ++ return TRUE; ++} ++ ++/* Set the _ITB_BASE_, and point it to ex9 table. */ ++ ++bfd_boolean ++nds32_elf_ex9_itb_base (struct bfd_link_info *link_info) ++{ ++ asection *sec; ++ bfd *output_bfd = NULL; ++ struct bfd_link_hash_entry *bh = NULL; ++ ++ if (is_ITB_BASE_set == 1) ++ return TRUE; ++ ++ is_ITB_BASE_set = 1; ++ ++ sec = nds32_elf_ex9_get_section (link_info->input_bfds); ++ if (sec != NULL) ++ output_bfd = sec->output_section->owner; ++ ++ if (output_bfd == NULL) ++ { ++ output_bfd = link_info->output_bfd; ++ if (output_bfd->sections == NULL) ++ return TRUE; ++ else ++ sec = bfd_abs_section_ptr; ++ } ++ ++ /* Do not define _ITB_BASE_ if it is not used. ++ And remain user to set it if needed. */ ++ ++ bh = bfd_link_hash_lookup (link_info->hash, "_ITB_BASE_", ++ FALSE, FALSE, TRUE); ++ if (!bh) ++ return TRUE; ++ ++ return (_bfd_generic_link_add_one_symbol ++ (link_info, output_bfd, "_ITB_BASE_", BSF_GLOBAL | BSF_WEAK, ++ sec, 0, (const char *) NULL, FALSE, ++ get_elf_backend_data (output_bfd)->collect, &bh)); ++} ++/* End EX9.IT */ ++ ++ ++/* Begining IFC. This is common code ifc optimization. */ ++ ++struct elf_nds32_ifc_code_hash_entry; ++struct elf_nds32_ifc_unit; ++ ++/* Save the offset and section. */ ++ ++struct elf_nds32_ifc_member ++{ ++ unsigned long int offset; ++ asection *sec; ++ ++ /* Link to its unit. */ ++ struct elf_nds32_ifc_unit *unit_p; ++ ++ /* Link to its previous entry. */ ++ struct elf_nds32_ifc_code_hash_entry *pre_entry; ++ ++ /* Save next insnstrution member to find group quickly. */ ++ struct elf_nds32_ifc_member *next_member; ++ struct elf_nds32_ifc_member *pre_member; ++ /* Save the jump target for the previous instruction. */ ++ struct bfd_link_hash_entry *bh; ++ bfd_boolean dead; ++ struct elf_nds32_ifc_member *next; ++}; ++ ++/* The unit of elf_nds32_ifc_code_hash_entry. */ ++ ++struct elf_nds32_ifc_unit ++{ ++ int times; ++ int done; ++ struct elf_nds32_ifc_member *member; ++ ++ /* Link to its entry. */ ++ struct elf_nds32_ifc_code_hash_entry *entry_p; ++ ++ /* Save next insnstruction entry. */ ++ struct elf_nds32_ifc_code_hash_entry *hash; ++ struct elf_nds32_ifc_unit *next; ++}; ++ ++/* Instruction hash table. */ ++ ++struct elf_nds32_ifc_code_hash_entry ++{ ++ struct bfd_hash_entry root; ++ int times; ++ int size; ++ struct elf_nds32_ifc_unit *unit; ++ struct elf_link_hash_entry *h; ++ ++ /* Save the max times unit in this entry. */ ++ struct elf_nds32_ifc_unit *max_unit; ++ struct elf_nds32_ifc_code_hash_entry *next; /* For sort times. */ ++ int round; /* Save round of nds32_elf_ifc_find_cse to avoid reentrance. */ ++ struct elf_nds32_ifc_code_hash_entry *max_next; ++ bfd_boolean end; /* This is instruction can break ifc block. */ ++ int max_times; ++}; ++ ++/* Structure for replace using. */ ++ ++struct elf_nds32_ifc_insn_member ++{ ++ struct elf_nds32_ifc_member *member; ++ struct elf_nds32_ifc_insn_member *next; ++}; ++ ++struct elf_nds32_ifc_insn_stack ++{ ++ int live; ++ int extend; ++ int choose; ++ struct elf_nds32_ifc_insn_member *imember; ++ struct elf_nds32_ifc_insn_stack *next; ++}; ++ ++/* Save members in the same section. */ ++ ++struct elf_nds32_ifc_sec_member ++{ ++ struct elf_nds32_ifc_member *member; ++ struct elf_nds32_ifc_sec_member *next; ++}; ++ ++struct elf_nds32_ifc_sec_block ++{ ++ asection *sec; ++ struct elf_nds32_ifc_sec_member *smember; ++ struct elf_nds32_ifc_sec_block *next; ++}; ++ ++struct elf_nds32_ifc_barrier ++{ ++ bfd_vma offset; ++ struct elf_nds32_ifc_barrier *next; ++}; ++ ++/* Ifc global symbol. */ ++struct bfd_hash_table ifc_code_table; ++struct elf_nds32_ifc_code_hash_entry *ifc_insn_head = NULL; ++struct elf_nds32_ifc_sec_block *ifc_block_head = NULL; ++ ++/* IFC hash function. */ ++ ++static struct bfd_hash_entry * ++nds32_elf_ifc_code_hash_newfunc (struct bfd_hash_entry *entry, ++ struct bfd_hash_table *table, ++ const char *string) ++{ ++ struct elf_nds32_ifc_code_hash_entry *ret; ++ ++ /* Allocate the structure if it has not already been allocated by a ++ subclass. */ ++ if (entry == NULL) ++ { ++ entry = (struct bfd_hash_entry *) ++ bfd_hash_allocate (table, sizeof (*ret)); ++ if (entry == NULL) ++ return entry; ++ } ++ ++ /* Call the allocation method of the superclass. */ ++ entry = bfd_hash_newfunc (entry, table, string); ++ if (entry == NULL) ++ return entry; ++ ++ ret = (struct elf_nds32_ifc_code_hash_entry*) entry; ++ ret->times = 0; ++ ret->unit = NULL; ++ ret->next = NULL; ++ ret->size = 0; ++ ret->h = NULL; ++ ret->max_unit = NULL; ++ ret->round = 0; ++ ret->max_next = NULL; ++ ret->max_times = 0; ++ ret->end = FALSE; ++ return &ret->root; ++} ++ ++/* Do TLS model conversion. */ ++ ++typedef struct relax_group_list_t ++{ ++ Elf_Internal_Rela *relo; ++ struct relax_group_list_t *next; ++ struct relax_group_list_t *next_sibling; ++ int id; ++} relax_group_list_t; ++ ++int ++list_insert (relax_group_list_t *pHead, Elf_Internal_Rela *pElem); ++ ++int ++list_insert_sibling (relax_group_list_t *pNode, Elf_Internal_Rela *pElem); ++ ++void ++dump_chain (relax_group_list_t *pHead); ++ ++int ++list_insert (relax_group_list_t *pHead, Elf_Internal_Rela *pElem) ++{ ++ relax_group_list_t *pNext = pHead; ++ ++ /* find place */ ++ while (pNext->next) ++ { ++ if (pNext->next->id > (int) pElem->r_addend) ++ break; ++ ++ pNext = pNext->next; ++ } ++ ++ /* insert node */ ++ relax_group_list_t *pNew = bfd_malloc (sizeof (relax_group_list_t)); ++ if (!pNew) ++ return FALSE; ++ ++ relax_group_list_t *tmp = pNext->next; ++ pNext->next = pNew; ++ ++ pNew->id = pElem->r_addend; ++ pNew->relo = pElem; ++ pNew->next = tmp; ++ pNew->next_sibling = NULL; ++ ++ return TRUE; ++} ++ ++int ++list_insert_sibling (relax_group_list_t *pNode, Elf_Internal_Rela *pElem) ++{ ++ relax_group_list_t *pNext = pNode; ++ ++ /* find place */ ++ while (pNext->next_sibling) ++ { ++ pNext = pNext->next_sibling; ++ } ++ ++ /* insert node */ ++ relax_group_list_t *pNew = bfd_malloc (sizeof (relax_group_list_t)); ++ if (!pNew) ++ return FALSE; ++ ++ relax_group_list_t *tmp = pNext->next_sibling; ++ pNext->next_sibling = pNew; ++ ++ pNew->id = -1; ++ pNew->relo = pElem; ++ pNew->next = NULL; ++ pNew->next_sibling = tmp; ++ ++ return TRUE; ++} ++ ++void ++dump_chain (relax_group_list_t *pHead) ++{ ++ relax_group_list_t *pNext = pHead->next; ++ while (pNext) ++ { ++ printf("group %d @ 0x%08x", pNext->id, (unsigned)pNext->relo->r_offset); ++ relax_group_list_t *pNextSib = pNext->next_sibling; ++ while (pNextSib) ++ { ++ printf(", %d", (unsigned) ELF32_R_TYPE (pNextSib->relo->r_info)); ++ pNextSib = pNextSib->next_sibling; ++ } ++ pNext = pNext->next; ++ printf("\n"); ++ } ++} ++ ++/* check R_NDS32_RELAX_GROUP of each section. ++ * there might be multiple sections in one object file. ++ */ ++int ++elf32_nds32_check_relax_group (bfd *abfd, asection *asec) ++{ ++ elf32_nds32_relax_group_t *relax_group_ptr = ++ elf32_nds32_relax_group_ptr (abfd); ++ ++ int min_id = relax_group_ptr->min_id; ++ int max_id = relax_group_ptr->max_id; ++ ++ Elf_Internal_Rela *rel; ++ Elf_Internal_Rela *relend; ++ Elf_Internal_Rela *relocs; ++ enum elf_nds32_reloc_type rtype; ++ ++ do ++ { ++ /* Relocations MUST be kept in memory, because relaxation adjust them. */ ++ relocs = _bfd_elf_link_read_relocs (abfd, asec, NULL, NULL, ++ TRUE /* keep_memory */); ++ if (relocs == NULL) ++ break; ++ ++ /* check R_NDS32_RELAX_GROUP */ ++ relend = relocs + asec->reloc_count; ++ for (rel = relocs; rel < relend; rel++) ++ { ++ int id; ++ rtype = ELF32_R_TYPE (rel->r_info); ++ if (rtype != R_NDS32_RELAX_GROUP) ++ continue; ++ ++ id = rel->r_addend; ++ if (id < min_id) ++ min_id = id; ++ else if (id > max_id) ++ max_id = id; ++ } ++ } ++ while (FALSE); ++ ++ if ((relocs != NULL) && (elf_section_data (asec)->relocs != relocs)) ++ free (relocs); ++ ++ if ((min_id != relax_group_ptr->min_id) ++ || (max_id != relax_group_ptr->max_id)) ++ { ++ relax_group_ptr->count = max_id - min_id + 1; ++ BFD_ASSERT(min_id <= relax_group_ptr->min_id); ++ relax_group_ptr->min_id = min_id; ++ BFD_ASSERT(max_id >= relax_group_ptr->max_id); ++ relax_group_ptr->max_id = max_id; ++ } ++ ++ return relax_group_ptr->count; ++} ++ ++/* reorder RELAX_GROUP ID when command line option '-r' is applied */ ++/* TODO: find a way to free me. */ ++struct section_id_list_t *relax_group_section_id_list = NULL; ++ ++struct section_id_list_t * ++elf32_nds32_lookup_section_id (int id, struct section_id_list_t **lst_ptr) ++{ ++ struct section_id_list_t *result = NULL; ++ struct section_id_list_t *lst = *lst_ptr; ++ ++ if (NULL == lst) ++ { ++ result = (struct section_id_list_t *) calloc ( ++ 1, sizeof (struct section_id_list_t)); ++ BFD_ASSERT (result); /* feed me */ ++ result->id = id; ++ *lst_ptr = result; ++ } ++ else ++ { ++ struct section_id_list_t *cur = lst; ++ struct section_id_list_t *prv = NULL; ++ struct section_id_list_t *sec = NULL; ++ while (cur) ++ { ++ if (cur->id < id) ++ { ++ prv = cur; ++ cur = cur->next; ++ continue; ++ } ++ ++ if (cur->id > id) ++ { ++ cur = NULL; /* to insert after prv */ ++ sec = cur; /* in case prv == NULL */ ++ } ++ ++ break; ++ } ++ ++ if (NULL == cur) ++ { ++ /* insert after prv */ ++ result = (struct section_id_list_t *) calloc ( ++ 1, sizeof (struct section_id_list_t)); ++ BFD_ASSERT (result); /* feed me */ ++ result->id = id; ++ if (NULL != prv) ++ { ++ result->next = prv->next; ++ prv->next = result; ++ } ++ else ++ { ++ *lst_ptr = result; ++ result->next = sec; ++ } ++ } ++ } ++ ++ return result; ++} ++ ++int ++elf32_nds32_unify_relax_group (bfd *abfd, asection *asec) ++{ ++ static int next_relax_group_bias = 0; ++ ++ elf32_nds32_relax_group_t *relax_group_ptr = ++ elf32_nds32_relax_group_ptr (abfd); ++ ++ bfd_boolean result = TRUE; ++ Elf_Internal_Rela *rel; ++ Elf_Internal_Rela *relend; ++ Elf_Internal_Rela *relocs = NULL; ++ enum elf_nds32_reloc_type rtype; ++ struct section_id_list_t *node = NULL; ++ int count = 0; ++ ++ do ++ { ++ if (0 == relax_group_ptr->count) ++ break; ++ ++ /* check if this section has handled */ ++ node = elf32_nds32_lookup_section_id (asec->id, &relax_group_section_id_list); ++ if (NULL == node) ++ break; /* hit, the section id has handled. */ ++ ++ /* Relocations MUST be kept in memory, because relaxation adjust them. */ ++ relocs = _bfd_elf_link_read_relocs (abfd, asec, NULL, NULL, ++ TRUE /* keep_memory */); ++ if (relocs == NULL) ++ { ++ BFD_ASSERT (0); /* feed me */ ++ break; ++ } ++ ++ /* allocate group id bias for this bfd! */ ++ if (0 == relax_group_ptr->init) ++ { ++ relax_group_ptr->bias = next_relax_group_bias; ++ next_relax_group_bias += relax_group_ptr->count; ++ relax_group_ptr->init = 1; ++ } ++ ++ /* reorder relax group groups */ ++ relend = relocs + asec->reloc_count; ++ for (rel = relocs; rel < relend; rel++) ++ { ++ rtype = ELF32_R_TYPE(rel->r_info); ++ if (rtype != R_NDS32_RELAX_GROUP) ++ continue; ++ ++ /* change it */ ++ rel->r_addend += relax_group_ptr->bias; ++ /* debugging count */ ++ count++; ++ } ++ } ++ while (FALSE); ++ ++ if (relocs != NULL && elf_section_data (asec)->relocs != relocs) ++ free (relocs); ++ ++ return result; ++} ++ ++int ++nds32_elf_unify_tls_model (bfd *inbfd, asection *insec, bfd_byte *incontents, ++ struct bfd_link_info *lnkinfo) ++{ ++ bfd_boolean result = TRUE; ++ Elf_Internal_Rela *irel; ++ Elf_Internal_Rela *irelend; ++ Elf_Internal_Rela *internal_relocs; ++ unsigned long r_symndx; ++ enum elf_nds32_reloc_type r_type; ++ ++ Elf_Internal_Sym *local_syms = NULL; ++ bfd_byte *contents = NULL; ++ ++ relax_group_list_t chain = { .id = -1, .next = NULL, .next_sibling = NULL }; ++ ++ Elf_Internal_Shdr *symtab_hdr = &elf_tdata (inbfd)->symtab_hdr; ++ struct elf_link_hash_entry **sym_hashes, **sym_hashes_end; ++ sym_hashes = elf_sym_hashes (inbfd); ++ sym_hashes_end = ++ sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym); ++ if (!elf_bad_symtab (inbfd)) ++ sym_hashes_end -= symtab_hdr->sh_info; ++ ++ /* reorder RELAX_GROUP when command line option '-r' is applied */ ++ if (lnkinfo->relocatable) ++ { ++ elf32_nds32_unify_relax_group (inbfd, insec); ++ /* goto finish; */ ++ return result; ++ } ++ ++ /* Relocations MUST be kept in memory, because relaxation adjust them. */ ++ internal_relocs = _bfd_elf_link_read_relocs (inbfd, insec, NULL, NULL, ++ TRUE /* keep_memory */); ++ if (internal_relocs == NULL) ++ goto error_return; ++ ++ irelend = internal_relocs + insec->reloc_count; ++ irel = find_relocs_at_address (internal_relocs, internal_relocs, ++ irelend, R_NDS32_RELAX_ENTRY); ++ if (irel == irelend) ++ goto finish; ++ ++ /* chain/remove groups */ ++ for (irel = internal_relocs; irel < irelend; irel++) ++ { ++ r_symndx = ELF32_R_SYM (irel->r_info); ++ r_type = ELF32_R_TYPE (irel->r_info); ++ if (r_type != R_NDS32_RELAX_GROUP) ++ continue; ++ ++ /* remove it */ ++ irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_NONE); ++ /* chain it now */ ++ if (!list_insert (&chain, irel)) ++ goto error_return; ++ } ++ ++ /* collect group relocations */ ++ /* presume relocations are sorted */ ++ relax_group_list_t *pNext = chain.next; ++ if (pNext) ++ { ++ for (irel = internal_relocs; irel < irelend; irel++) ++ { ++ if (irel->r_offset == pNext->relo->r_offset) ++ { ++ /* ignore Non-TLS relocation types */ ++ r_type = ELF32_R_TYPE (irel->r_info); ++ if ((R_NDS32_TLS_TPOFF > r_type) ++ || (R_NDS32_RELAX_ENTRY == r_type)) ++ continue; ++ ++ if (!list_insert_sibling (pNext, irel)) ++ goto error_return; ++ } ++ else if (irel->r_offset > pNext->relo->r_offset) ++ { ++ pNext = pNext->next; ++ if (!pNext) ++ break; ++ ++ bfd_vma current_offset = pNext->relo->r_offset; ++ if (irel->r_offset > current_offset) ++ irel = internal_relocs; /* restart from head */ ++ else ++ --irel; /* check current irel again */ ++ continue; ++ } ++ else ++ { ++ //printf("irel->off = 0x%08x, pNext->relo->off = 0x%08x (0x%08x)\n", (unsigned)irel->r_offset, (unsigned)pNext->relo->r_offset, (unsigned)first_offset); ++ } ++ } ++ } ++ ++#ifdef DUBUG_VERBOSE ++ dump_chain(&chain); ++#endif ++ ++ /* Get symbol table and section content. */ ++ if (incontents) ++ contents = incontents; ++ else if (!nds32_get_section_contents (inbfd, insec, &contents, TRUE) ++ || !nds32_get_local_syms (inbfd, insec, &local_syms)) ++ goto error_return; ++ ++ char *local_got_tls_type = elf32_nds32_local_got_tls_type (inbfd); ++ ++ /* convert TLS model each group if necessary */ ++ pNext = chain.next; ++ int cur_grp_id = -1; ++ int sethi_rt = -1; ++ int add_rt = -1; ++ enum elf_nds32_tls_type tls_type, org_tls_type, eff_tls_type; ++ tls_type = org_tls_type = eff_tls_type = 0; ++ while (pNext) ++ { ++ relax_group_list_t *pNextSig = pNext->next_sibling; ++ while (pNextSig) ++ { ++ struct elf_link_hash_entry *h = NULL; ++ irel = pNextSig->relo; ++ r_symndx = ELF32_R_SYM(irel->r_info); ++ r_type = ELF32_R_TYPE(irel->r_info); ++ ++ if (pNext->id != cur_grp_id) ++ { ++ cur_grp_id = pNext->id; ++ org_tls_type = get_tls_type (r_type, NULL); ++ if (r_symndx >= symtab_hdr->sh_info) ++ { ++ 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; ++ tls_type = ((struct elf_nds32_link_hash_entry *) h)->tls_type; ++ } ++ else ++ { ++ /* TODO: find local symbol hash if necessary? */ ++ tls_type = local_got_tls_type ? local_got_tls_type[r_symndx] : GOT_NORMAL; ++ } ++ ++ eff_tls_type = 1 << (fls (tls_type) - 1); ++ sethi_rt = N32_RT5(bfd_getb32 (contents + irel->r_offset)); ++ } ++ ++ if (eff_tls_type != org_tls_type) ++ { ++ switch (org_tls_type) ++ { ++ case GOT_TLS_DESC: ++ switch (eff_tls_type) ++ { ++ case GOT_TLS_IE: ++ switch (r_type) ++ { ++ case R_NDS32_TLS_DESC_HI20: ++ irel->r_info = ELF32_R_INFO(r_symndx, ++ R_NDS32_TLS_IE_HI20); ++ break; ++ case R_NDS32_TLS_DESC_LO12: ++ irel->r_info = ELF32_R_INFO(r_symndx, ++ R_NDS32_TLS_IE_LO12); ++ break; ++ case R_NDS32_TLS_DESC_ADD: ++ { ++ uint32_t insn = bfd_getb32 ( ++ contents + irel->r_offset); ++ add_rt = N32_RT5 (insn); ++ insn = N32_TYPE2 (LWI, add_rt, sethi_rt, 0); ++ bfd_putb32 (insn, contents + irel->r_offset); ++ ++ irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE); ++/* irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_IE_LW); ++*/ ++ } ++ break; ++ case R_NDS32_TLS_DESC_FUNC: ++ bfd_putb32 (INSN_NOP, contents + irel->r_offset); ++ irel->r_info = ELF32_R_INFO(r_symndx, ++ R_NDS32_RELAX_REMOVE); ++ break; ++ case R_NDS32_TLS_DESC_CALL: ++ { ++ uint32_t insn = N32_ALU1(ADD, REG_R0, add_rt, ++ REG_TP); ++ bfd_putb32 (insn, contents + irel->r_offset); ++ ++ irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE); ++ } ++ break; ++ case R_NDS32_LOADSTORE: ++ case R_NDS32_PTR: ++ case R_NDS32_PTR_RESOLVED: ++ case R_NDS32_NONE: ++ case R_NDS32_LABEL: ++ break; ++ default: ++ BFD_ASSERT(0); ++ break; ++ } ++ break; ++ case GOT_TLS_IEGP: ++ switch (r_type) ++ { ++ case R_NDS32_TLS_DESC_HI20: ++ irel->r_info = ELF32_R_INFO(r_symndx, ++ R_NDS32_TLS_IEGP_HI20); ++ break; ++ case R_NDS32_TLS_DESC_LO12: ++ irel->r_info = ELF32_R_INFO(r_symndx, ++ R_NDS32_TLS_IEGP_LO12); ++ break; ++ case R_NDS32_TLS_DESC_ADD: ++ { ++ uint32_t insn = bfd_getb32 ( ++ contents + irel->r_offset); ++ add_rt = N32_RT5 (insn); ++ insn = N32_MEM(LW, add_rt, sethi_rt, REG_GP, 0); ++ bfd_putb32 (insn, contents + irel->r_offset); ++ ++ irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE); ++/* irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_IEGP_LW); ++*/ ++ } ++ break; ++ case R_NDS32_TLS_DESC_FUNC: ++ bfd_putb32 (INSN_NOP, contents + irel->r_offset); ++ irel->r_info = ELF32_R_INFO(r_symndx, ++ R_NDS32_RELAX_REMOVE); ++ break; ++ case R_NDS32_TLS_DESC_CALL: ++ { ++ uint32_t insn = N32_ALU1(ADD, REG_R0, add_rt, ++ REG_TP); ++ bfd_putb32 (insn, contents + irel->r_offset); ++ ++ irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE); ++ } ++ break; ++ case R_NDS32_LOADSTORE: ++ case R_NDS32_PTR: ++ case R_NDS32_PTR_RESOLVED: ++ case R_NDS32_NONE: ++ case R_NDS32_LABEL: ++ break; ++ default: ++ BFD_ASSERT(0); ++ break; ++ } ++ break; ++ default: ++#ifdef DEBUG_VERBOSE ++ printf ( ++ "SKIP: %s: %s @ 0x%08x tls_type = 0x%08x, eff_tls_type = 0x%08x, org_tls_type = 0x%08x\n", ++ inbfd->filename, h ? h->root.root.string : "local", ++ (unsigned) irel->r_offset, tls_type, eff_tls_type, ++ org_tls_type); ++#endif ++ break; ++ } ++ break; ++ case GOT_TLS_IEGP: ++ switch (eff_tls_type) ++ { ++ case GOT_TLS_IE: ++ switch (r_type) ++ { ++ case R_NDS32_TLS_IEGP_HI20: ++ irel->r_info = ELF32_R_INFO(r_symndx, ++ R_NDS32_TLS_IE_HI20); ++ break; ++ case R_NDS32_TLS_IEGP_LO12: ++ irel->r_info = ELF32_R_INFO(r_symndx, ++ R_NDS32_TLS_IE_LO12); ++ break; ++ case R_NDS32_PTR_RESOLVED: ++ { ++ uint32_t insn = bfd_getb32 ( ++ contents + irel->r_offset); ++ add_rt = N32_RT5 (insn); ++ insn = N32_TYPE2 (LWI, add_rt, sethi_rt, 0); ++ bfd_putb32 (insn, contents + irel->r_offset); ++ } ++ break; ++ case R_NDS32_LOADSTORE: ++ case R_NDS32_PTR: ++ case R_NDS32_NONE: ++ case R_NDS32_LABEL: ++ break; ++ default: ++ BFD_ASSERT(0); ++ break; ++ } ++ break; ++ default: ++#ifdef DEBUG_VERBOSE ++ printf ( ++ "SKIP: %s: %s @ 0x%08x tls_type = 0x%08x, eff_tls_type = 0x%08x, org_tls_type = 0x%08x\n", ++ inbfd->filename, h ? h->root.root.string : "local", ++ (unsigned) irel->r_offset, tls_type, eff_tls_type, ++ org_tls_type); ++#endif ++ break; ++ } ++ break; ++ default: ++#ifdef DEBUG_VERBOSE ++ printf ( ++ "SKIP: %s: %s @ 0x%08x tls_type = 0x%08x, eff_tls_type = 0x%08x, org_tls_type = 0x%08x\n", ++ inbfd->filename, h ? h->root.root.string : "local", ++ (unsigned) irel->r_offset, tls_type, eff_tls_type, ++ org_tls_type); ++#endif ++ break; ++ } ++ } ++ pNextSig = pNextSig->next_sibling; ++ } ++ ++#if 1 ++ pNext = pNext->next; ++#else ++ while (pNext) ++ { ++ if (pNext->id != cur_grp_id) ++ break; ++ pNext = pNext->next; ++ } ++#endif ++ } ++ ++finish: ++ if (incontents) ++ contents = NULL; ++ ++ if (internal_relocs != NULL ++ && elf_section_data (insec)->relocs != internal_relocs) ++ free (internal_relocs); ++ ++ if (contents != NULL ++ && elf_section_data (insec)->this_hdr.contents != contents) ++ free (contents); ++ ++ if (local_syms != NULL && symtab_hdr->contents != (bfd_byte *) local_syms) ++ free (local_syms); ++ ++ if (chain.next) ++ { ++ pNext = chain.next; ++ relax_group_list_t *pDel; ++ while (pNext) ++ { ++ pDel = pNext; ++ pNext = pNext->next; ++ free (pDel); ++ } ++ } ++ ++ return result; ++ ++error_return: ++ result = FALSE; ++ goto finish; ++} ++ ++/* Initialize ifc hash table. */ ++ ++static int ++nds32_elf_ifc_init (void) ++{ ++ static bfd_boolean done = FALSE; ++ if (done) ++ return TRUE; ++ ++ done = TRUE; ++ if (!bfd_hash_table_init (&ifc_code_table, nds32_elf_ifc_code_hash_newfunc, ++ sizeof (struct elf_nds32_ifc_code_hash_entry))) ++ { ++ (*_bfd_error_handler) (_("Ld error: cannot init ifc hash table\n")); ++ return FALSE; ++ } ++ return TRUE; ++} ++ ++/* New a unit and insert ifc hash entry. */ ++ ++static void ++nds32_elf_ifc_new_ifc_unit (struct elf_nds32_ifc_code_hash_entry *entry, ++ struct elf_nds32_ifc_code_hash_entry *pre_entry, ++ struct elf_nds32_ifc_member *child, ++ struct elf_nds32_ifc_member *pre_child) ++{ ++ struct elf_nds32_ifc_unit *ptr_unit, *temp_unit; ++ struct elf_nds32_ifc_member *ptr_member; ++ ++ if (!pre_entry || !pre_child) ++ return; ++ ++ /* Find unit in entry. */ ++ ptr_unit = pre_entry->unit; ++ temp_unit = ptr_unit; ++ while (ptr_unit && ptr_unit->hash != entry) ++ { ++ temp_unit = ptr_unit; ++ ptr_unit = ptr_unit->next; ++ } ++ if (!ptr_unit) ++ { ++ ptr_unit = bfd_malloc (sizeof (struct elf_nds32_ifc_unit)); ++ if (!pre_entry->unit) ++ pre_entry->unit = ptr_unit; ++ else ++ temp_unit->next = ptr_unit; ++ ptr_unit->times = 0; ++ ptr_unit->member = NULL; ++ ptr_unit->hash = entry; ++ ptr_unit->next = NULL; ++ ptr_unit->entry_p = pre_entry; ++ ptr_unit->done = 0; ++ } ++ pre_child->next_member = child; ++ pre_child->unit_p = ptr_unit; ++ ptr_unit->times++; ++ if (!pre_entry->max_unit ++ || pre_entry->max_unit->times < ptr_unit->times) ++ pre_entry->max_unit = ptr_unit; ++ ++ /* Insert member into unit. */ ++ ptr_member = ptr_unit->member; ++ while (ptr_member && ptr_member->next) ++ ptr_member = ptr_member->next; ++ ++ if (!ptr_member) ++ ptr_unit->member = pre_child; ++ else ++ ptr_member->next = pre_child; ++} ++ ++/* Insert the symbol and relocation barrier list. */ ++ ++static void ++nds32_elf_ifc_insert_barrier (int offset, ++ struct elf_nds32_ifc_barrier ** barrier) ++{ ++ struct elf_nds32_ifc_barrier *new_barrier; ++ struct elf_nds32_ifc_barrier *last_barrier; ++ ++ /* The symbol is in this section. */ ++ new_barrier = malloc (sizeof (struct elf_nds32_ifc_barrier)); ++ new_barrier->offset = offset; ++ new_barrier->next = NULL; ++ if (*barrier == NULL) ++ *barrier = new_barrier; ++ else ++ { ++ if (new_barrier->offset < (*barrier)->offset) ++ { ++ new_barrier->next = *barrier; ++ *barrier = new_barrier; ++ } ++ else ++ { ++ last_barrier = *barrier; ++ while (last_barrier->next ++ && last_barrier->next->offset < new_barrier->offset) ++ last_barrier = last_barrier->next; ++ new_barrier->next = last_barrier->next; ++ last_barrier->next = new_barrier; ++ } ++ } ++} ++ ++/* Build barrier list. */ ++ ++static bfd_boolean ++nds32_elf_ifc_build_barrier (bfd *abfd, asection *sec, ++ struct elf_nds32_ifc_barrier **barrier) ++{ ++ const struct elf_backend_data *bed = get_elf_backend_data (abfd); ++ struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd); ++ Elf_Internal_Shdr *hdr; ++ bfd_size_type symcount; ++ bfd_size_type extsymcount; ++ struct bfd_link_hash_entry *bh; ++ Elf_Internal_Rela *internal_relocs, *irelend, *irel; ++ unsigned int sec_shndx; ++ Elf_Internal_Shdr *symtab_hdr; ++ Elf_Internal_Sym *isym = NULL; ++ unsigned int i; ++ ++ /* Scan global symbol. */ ++ if (sym_hashes) ++ { ++ if (!(abfd->flags & DYNAMIC) || elf_dynsymtab (abfd) == 0) ++ hdr = &elf_tdata (abfd)->symtab_hdr; ++ else ++ return FALSE; ++ ++ /* Check for the symbol existence. */ ++ symcount = hdr->sh_size / bed->s->sizeof_sym; ++ extsymcount = symcount - hdr->sh_info; ++ for (i = 0; i < extsymcount; i++) ++ { ++ bh = (struct bfd_link_hash_entry *) *(sym_hashes + i); ++ if (bh->u.def.section == sec) ++ nds32_elf_ifc_insert_barrier (bh->u.def.value, barrier); ++ } ++ } ++ ++ /* Scan relocations to get the local target. */ ++ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, ++ TRUE /* keep_memory */); ++ irelend = internal_relocs + sec->reloc_count; ++ sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ if (!nds32_get_local_syms (abfd, sec, &isym)) ++ return FALSE; ++ ++ for (i = 0; i < symtab_hdr->sh_info; i++) ++ { ++ if ((isym + i)->st_value > 0 ++ && (isym + i)->st_shndx == sec_shndx ++ && (isym + i)->st_value <= sec->size ++ && ELF32_ST_TYPE ((isym + i)->st_info) == STT_FUNC) ++ { ++ nds32_elf_ifc_insert_barrier ((isym + i)->st_value, barrier); ++ } ++ } ++ ++ for (irel = internal_relocs; irel < irelend; irel++) ++ { ++ if (ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY ++ && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL ++ && ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info ++ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx) ++ { ++ /* FIXME: DIFFxx relcoations have to be do something more. */ ++ nds32_elf_ifc_insert_barrier (irel->r_addend, barrier); ++ } ++ } ++ return TRUE; ++} ++ ++/* Trace all section and build the instruction list. */ ++/* We collect all instruction here, and put each same insntruction in ++ the same hash entry. Each entry has to save all appearance section ++ and offset. */ ++ ++static bfd_boolean ++nds32_elf_ifc_trace_code (struct bfd_link_info *link_info, ++ bfd *abfd, asection *sec) ++{ ++ Elf_Internal_Rela *internal_relocs, *irelend, *irel; ++ bfd_byte *contents = NULL; ++ unsigned int off = 0, insn_size; ++ unsigned long insn; ++ struct elf_nds32_ifc_code_hash_entry *entry, *pre_entry; ++ struct elf_nds32_ifc_member *pre_child, *child; ++ struct elf_nds32_ifc_sec_block *block; ++ struct elf_nds32_ifc_sec_member *smember, *cur_smember;; ++ char code[20]; ++ struct elf_nds32_ifc_barrier *barrier = NULL, *ptr_barrier; ++ bfd_boolean ignore, end; ++ struct elf_link_hash_entry **sym_hashes; ++ unsigned long r_symndx; ++ Elf_Internal_Shdr *symtab_hdr; ++ struct elf_link_hash_entry *h; ++ Elf_Internal_Sym *isymbuf = NULL; ++ ++ pre_entry = NULL; ++ pre_child = NULL; ++ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, ++ TRUE /* keep_memory */); ++ irelend = internal_relocs + sec->reloc_count; ++ ++ /* Check the object if enable ifc. */ ++ irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend, ++ R_NDS32_RELAX_ENTRY); ++ ++ /* Check this section trigger ifc relaxation. */ ++ if (irel == NULL ++ || irel >= irelend ++ || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY ++ || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY ++ && !(irel->r_addend & R_NDS32_RELAX_ENTRY_IFC_FLAG))) ++ return TRUE; ++ ++ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)) ++ return FALSE; ++ ++ elf_section_data (sec)->relocs = internal_relocs; ++ sym_hashes = elf_sym_hashes (abfd); ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ nds32_get_local_syms (abfd, sec, &isymbuf); ++ /* Backup header size and restore it after relocation because ifc ++ optimization may modify this value. */ ++ elf_nds32_tdata (abfd)->hdr_size = symtab_hdr->sh_size; ++ ++ /* Build barrier list. If there is any label or target in somewhere, ++ this instruction can not be delete. It has to traverse global symbol ++ hash table and relocations to get all possible label. */ ++ nds32_elf_ifc_build_barrier (abfd, sec, &barrier); ++ ++ /* Start to traverse content. */ ++ irel = internal_relocs; ++ ptr_barrier = barrier; ++ ++ block = malloc (sizeof (struct elf_nds32_ifc_sec_block)); ++ block->sec = sec; ++ block->smember = NULL; ++ block->next = ifc_block_head; ++ ifc_block_head = block; ++ cur_smember = NULL; ++ ++ while (off < sec->size) ++ { ++ h = NULL; ++ ignore = FALSE; ++ end = FALSE; ++ ++ while (irel != NULL && irel < irelend && irel->r_offset < off) ++ irel++; ++ while (ptr_barrier && ptr_barrier->offset < off) ++ ptr_barrier = ptr_barrier->next; ++ ++ /* Get binary code. */ ++ if (*(contents + off) & 0x80) ++ { ++ /* 16-bit instuction. */ ++ insn = bfd_getb16 (contents + off); ++ snprintf (code, sizeof (code), "%04lx", insn); ++ insn_size = 2; ++ ++ /* Clean insntruction regiter for jr5 and jral5. */ ++ switch (insn & 0xff00) ++ { ++ /* Because there is no relocation for jr5 and jral5 in case ++ longjump and longcall, it has to ignore it for ifc. */ ++ /* jr5 ret5 jral5 add5.pc ex9.it. */ ++ case INSN_JR5: ++ ignore = TRUE; ++ break; ++ default: ++ break; ++ } ++ } ++ else ++ { ++ /* 32-bit instuction. */ ++ insn = bfd_getb32 (contents + off); ++ snprintf (code, sizeof (code), "%08lx", insn); ++ insn_size = 4; ++ switch (N32_OP6 (insn)) ++ { ++ case N32_OP6_JREG: ++ /* jr and jral. */ ++ ignore = TRUE; ++ break; ++ case N32_OP6_MISC: ++ if (N32_SUB5 (insn) == N32_MISC_MTSR ++ || N32_SUB5 (insn) == N32_MISC_MFSR) ++ ignore = TRUE; ++ break; ++ case N32_OP6_ALU2: ++ if (N32_SUB6 (insn) == N32_ALU2_MTUSR ++ || N32_SUB6 (insn) == N32_ALU2_MFUSR) ++ ignore = TRUE; ++ break; ++ default: ++ break; ++ } ++ } ++ ++ /* Check the IFC ignored region. */ ++ if (irel && irel < irelend ++ && nds32_elf_ifc_check_region (&irel, irelend, link_info)) ++ { ++ if (irel == NULL || irel >= irelend) ++ return TRUE; ++ off = irel->r_offset; ++ off += ((*(contents + off) & 0x80) != 0 ? 2 : 4); ++ pre_entry = NULL; ++ pre_child = NULL; ++ continue; ++ } ++ /* Ignore instruction with relocation. */ ++ /* It can add instruction with relocation to ifc in the future. ++ I think only the global target can do. We may try to compare ++ post and link ifc to know what kinds of relocation are most needed ++ being done first. */ ++ else if (ignore == TRUE) ++ { ++ /* Set a new basic block. */ ++ off += insn_size; ++ pre_entry = NULL; ++ pre_child = NULL; ++ continue; ++ } ++ else if (irel < irelend && irel->r_offset == off ++ && (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3 ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0) ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA) ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA) ++ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))) ++ { ++ r_symndx = ELF32_R_SYM (irel->r_info); ++ if (r_symndx < symtab_hdr->sh_info) ++ { ++ /* Ignore local symbol, so set a new basic block. */ ++ off += insn_size; ++ pre_entry = NULL; ++ pre_child = NULL; ++ continue; ++ } ++ else ++ { ++ /* Global jump target, keep going. */ ++ bfd_boolean warned ATTRIBUTE_UNUSED; ++ bfd_boolean unresolved_reloc ATTRIBUTE_UNUSED; ++ bfd_vma relocation; ++ asection *sym_sec; ++ ++ RELOC_FOR_GLOBAL_SYMBOL (link_info, abfd, sec, irel, ++ r_symndx, symtab_hdr, sym_hashes, ++ h, sym_sec, relocation, ++ unresolved_reloc, warned); ++ relocation += irel->r_addend; ++ /* J and JAL has to shift one bit. Here, we use absolute addresss ++ to build hash entry. */ ++ snprintf (code, sizeof (code), "%08lx%08lx", relocation, insn); ++ } ++ ++ if ((ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA ++ && (insn == INSN_JAL || insn == INSN_J))) ++ end = TRUE; ++ } ++ else if (irel < irelend && irel->r_offset == off ++ && ELF32_R_TYPE (irel->r_info) >= R_NDS32_9_PCREL_RELA ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_17_PCREL_RELA) ++ { ++ r_symndx = ELF32_R_SYM (irel->r_info); ++ if (r_symndx < symtab_hdr->sh_info) ++ { ++ /* Local symbol. */ ++ bfd_vma relocation; ++ int shndx = isymbuf[r_symndx].st_shndx; ++ ++ bfd_vma st_value = (isymbuf + r_symndx)->st_value; ++ asection *isec = elf_elfsections (abfd)[shndx]->bfd_section; ++ relocation = isec->output_section->vma + isec->output_offset ++ + st_value + irel->r_addend; ++ snprintf (code, sizeof (code), "%08lx%08lx", relocation, ++ (insn_size == 4) ? insn : insn << 16); ++ } ++ else ++ { ++ /* Ignore global condition branch target. */ ++ off += insn_size; ++ pre_entry = NULL; ++ pre_child = NULL; ++ continue; ++ } ++ ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_9_PCREL_RELA ++ && (insn == INSN_J8)) ++ end = TRUE; ++ } ++ else if (irel < irelend && irel->r_offset == off) ++ { ++ while (irel < irelend && irel->r_offset == off) ++ { ++ switch (ELF32_R_TYPE (irel->r_info)) ++ { ++ case R_NDS32_32_RELA: ++ /* Data. */ ++ insn_size = 4; ++ break; ++ case R_NDS32_16_RELA: ++ /* Data. */ ++ insn_size = 2; ++ break; ++ case R_NDS32_DATA: ++ /* Data. */ ++ /* The least code alignment is 2. If the data is only one byte, ++ we have to shift one more byte. */ ++ if (irel->r_addend == 1) ++ insn_size = 2; ++ else ++ insn_size = irel->r_addend; ++ break; ++ default: ++ break; ++ } ++ irel++; ++ } ++ /* Set a new basic block. */ ++ off += insn_size; ++ pre_entry = NULL; ++ pre_child = NULL; ++ continue; ++ } ++ ++ if (ptr_barrier && ptr_barrier->offset == off) ++ { ++ /* If there is symbol at the instruction, this one only can be the ++ begining of basic block. We have to promise there is no jump ++ target or label in the common block, because if the block be ++ converted ifcall the label will disapear. */ ++ pre_entry = NULL; ++ pre_child = NULL; ++ } ++ ++ off += insn_size; ++ /* Hash and copy "code". */ ++ entry = (struct elf_nds32_ifc_code_hash_entry *) ++ bfd_hash_lookup (&ifc_code_table, code, TRUE, TRUE); ++ if (entry == NULL) ++ { ++ (*_bfd_error_handler) ++ (_("%P%F: failed creating ifc %s hash table: %E\n"), code); ++ return FALSE; ++ } ++ ++ entry->size = insn_size; ++ ++ /* It is hard to do ifc, when the sequence instructions are the same. */ ++ if (entry == pre_entry ++ || (h && entry->h && entry->h != h)) ++ { ++ pre_entry = NULL; ++ pre_child = NULL; ++ continue; ++ } ++ ++ entry->times++; ++ entry->h = h; ++ entry->end = end; ++ ++ /* Build list between current and previous instruction. ++ First round: generate entry A and member B. */ ++ /* List: code_hash_entry->unit->member. ++ Example: ABCAB ++ 12345 ++ {entry} [unit] (member) ++ {A} -> [B] -> (1) -> (4) */ ++ ++ child = bfd_malloc (sizeof (struct elf_nds32_ifc_member)); ++ child->offset = off; ++ child->sec = sec; ++ /* For B member, its pre_entry is null. ++ For C member, its pre_entry is A. */ ++ child->pre_entry = pre_entry; ++ child->unit_p = NULL; ++ child->next = NULL; ++ child->next_member = NULL; ++ child->pre_member = pre_child; ++ child->dead = FALSE; ++ child->bh = NULL; ++ ++ /* Build section instruction list to adjust offset ++ when increasing or decreasing later. */ ++ smember = malloc (sizeof (struct elf_nds32_ifc_sec_member)) ; ++ smember->member = child; ++ smember->next = NULL; ++ if (!cur_smember) ++ { ++ block->smember = smember; ++ cur_smember = smember; ++ } ++ else ++ { ++ cur_smember->next = smember; ++ cur_smember = smember; ++ } ++ ++ nds32_elf_ifc_new_ifc_unit (entry, pre_entry, child, pre_child); ++ if (end) ++ { ++ pre_child = NULL; ++ pre_entry = NULL; ++ } ++ else ++ { ++ pre_child = child; ++ pre_entry = entry; ++ } ++ } ++ return TRUE; ++} ++ ++/* Insert the entry in sort by its times. */ ++ ++static void ++nds32_elf_ifc_order_insn_times (struct elf_nds32_ifc_code_hash_entry *entry) ++{ ++ struct elf_nds32_ifc_code_hash_entry *ptr = ifc_insn_head; ++ ++ /* First entry. */ ++ if (!ifc_insn_head) ++ ifc_insn_head = entry; ++ else if (!entry->max_unit) ++ { ++ /* There is no max_unit in current list. */ ++ while (ptr->next) ++ ptr = ptr->next; ++ entry->next = ptr->next; ++ ptr->next = entry; ++ } ++ else ++ { ++ entry->max_times = entry->max_unit->times; ++ if (!ptr->max_unit ++ || ptr->max_unit->times < entry->max_unit->times) ++ { ++ /* The new one is the bigest one. */ ++ entry->next = ptr; ++ ifc_insn_head = entry; ++ return; ++ } ++ while (ptr->next && ptr->next->unit ++ && ptr->next->unit->times > entry->unit->times) ++ ptr = ptr->next; ++ entry->next = ptr->next; ++ ptr->next = entry; ++ } ++} ++ ++/* IFC hash table traverse function. */ ++ ++static void ++nds32_elf_ifc_code_hash_traverse (void (*func) (struct elf_nds32_ifc_code_hash_entry*)) ++{ ++ unsigned int i; ++ ++ ifc_code_table.frozen = 1; ++ for (i = 0; i < ifc_code_table.size; i++) ++ { ++ struct bfd_hash_entry *p; ++ ++ for (p = ifc_code_table.table[i]; p != NULL; p = p->next) ++ func ((struct elf_nds32_ifc_code_hash_entry *) p); ++ } ++ ifc_code_table.frozen = 0; ++} ++ ++/* Push common subexpression. */ ++ ++static void ++nds32_elf_ifc_push_stack (struct elf_nds32_ifc_insn_stack **stack, ++ struct elf_nds32_ifc_unit *unit) ++{ ++ struct elf_nds32_ifc_member *member; ++ struct elf_nds32_ifc_insn_stack *ptr; ++ struct elf_nds32_ifc_insn_member *imember, *ptr_imember; ++ ++ /* Get the first member in the same unit. */ ++ member = unit->member->unit_p->member; ++ ++ if (!*stack) ++ { ++ /* The first instruction in common subexpression. */ ++ while (member) ++ { ++ /* The newest one stack is as the head. */ ++ if (!member->dead) ++ { ++ ptr = bfd_malloc (sizeof (struct elf_nds32_ifc_insn_stack)); ++ imember = bfd_malloc (sizeof (struct elf_nds32_ifc_insn_member)); ++ imember->member = member; ++ imember->next = NULL; ++ ptr->imember = imember; ++ ptr->next = *stack; ++ ptr->live = 1; ++ ptr->extend = 0; ++ *stack = ptr; ++ } ++ member = member->next; ++ } ++ } ++ else ++ { ++ /* Initial stack state, because we have to trigger them after ++ matching new member. */ ++ ptr = *stack; ++ while (ptr) ++ { ++ ptr->choose = ptr->live; ++ ptr->live = 0; ++ ptr = ptr->next; ++ } ++ ++ while (member) ++ { ++ /* Find the same common subexpression stack and push. */ ++ ptr = *stack; ++ while (!member->dead && ptr) ++ { ++ if (ptr->live == 0 && ptr->choose == 1) ++ { ++ ptr_imember = ptr->imember; ++ /* Go to the final imember. */ ++ while (ptr_imember && ptr_imember->next) ++ ptr_imember = ptr_imember->next; ++ ++ if (ptr_imember->member->next_member == member) ++ { ++ /* When the final member next one match the new member, ++ insert it into list. */ ++ imember = bfd_malloc (sizeof (struct elf_nds32_ifc_insn_member)); ++ imember->member = member; ++ imember->next = NULL; ++ ptr->live = 1; ++ ptr_imember->next = imember; ++ break; ++ } ++ } ++ ptr = ptr->next; ++ } ++ member = member->next; ++ } ++ } ++} ++ ++/* Pop common subexpression. */ ++ ++static void ++nds32_elf_ifc_pop_stack (struct elf_nds32_ifc_insn_stack **stack, ++ struct elf_nds32_ifc_unit *unit) ++{ ++ if (!*stack) ++ return; ++ ++ struct elf_nds32_ifc_insn_stack *ptr; ++ struct elf_nds32_ifc_insn_member *imember, *temp_member; ++ struct elf_nds32_ifc_member *member; ++ ++ ptr = *stack; ++ while (ptr) ++ { ++ ptr->live = 0; ++ ptr = ptr->next; ++ } ++ ++ ptr = *stack; ++ while (ptr) ++ { ++ /* Get the first member in the same unit. */ ++ member = unit->member->unit_p->member; ++ while (member) ++ { ++ imember = ptr->imember; ++ while (imember) ++ { ++ if (imember->member == member) ++ { ++ ptr->live = 1; ++ temp_member = imember->next; ++ imember->next = NULL; ++ imember = temp_member; ++ break; ++ } ++ imember = imember->next; ++ } ++ while (imember) ++ { ++ temp_member = imember; ++ imember = imember->next; ++ free (temp_member); ++ } ++ if (ptr->live) ++ break; ++ member = member->next; ++ } ++ ptr = ptr->next; ++ } ++} ++ ++/* Find the common down. */ ++ ++static int ++nds32_elf_ifc_find_cse_recur (struct elf_nds32_ifc_unit *ptr, ++ struct elf_nds32_ifc_insn_stack **stack, ++ int total) ++{ ++ struct elf_nds32_ifc_member *member = ptr->member; ++ struct elf_nds32_ifc_unit *unit_head, *unit_current, *unit_pre = NULL; ++ struct elf_nds32_ifc_insn_stack *stack_ptr; ++ struct elf_nds32_ifc_insn_member *imember; ++ unit_head = NULL; ++ int gain, gc_size; ++ int abandon; ++ ++ /* Push current member into stack. */ ++ nds32_elf_ifc_push_stack (stack, ptr); ++ ++ if (!*stack) ++ return 0; ++ ++ /* The instruction will close ifc state. */ ++ if (ptr->hash->end) ++ return ptr->times * ptr->hash->size; ++ ++ /* Find the unit its max next instruction. */ ++ stack_ptr = *stack; ++ while (stack_ptr) ++ { ++ if (stack_ptr->live) ++ { ++ /* Get the final instruction. */ ++ imember = stack_ptr->imember; ++ while (imember->next) ++ imember = imember->next; ++ member = imember->member; ++ if (!member->next_member->dead) ++ { ++ unit_current = unit_head; ++ while (unit_current) ++ { ++ /* Check if the hash entry exist. */ ++ unit_pre = unit_current; ++ if (member->next_member->unit_p ++ && member->next_member->unit_p->hash ++ == unit_current->hash ++ && (!unit_current->hash->h ++ || unit_current->hash->h ++ == member->next_member->unit_p->hash->h)) ++ { ++ unit_current->times++; ++ break; ++ } ++ unit_current = unit_current->next; ++ } ++ /* New a unit group. */ ++ if (member->next_member->unit_p ++ && !member->next_member->unit_p->hash->round ++ && !unit_current) ++ { ++ unit_current = bfd_malloc (sizeof (struct elf_nds32_ifc_unit)); ++ unit_current->hash = member->next_member->unit_p->hash; ++ unit_current->times = 1; ++ unit_current->next = NULL; ++ unit_current->member = member->next_member; ++ unit_current->entry_p = member->next_member->unit_p->entry_p; ++ if (!unit_head) ++ unit_head = unit_current; ++ else ++ unit_pre->next = unit_current; ++ } ++ } ++ } ++ stack_ptr = stack_ptr->next; ++ } ++ ++ /* Find the max next instruction unit. */ ++ unit_current = unit_head; ++ unit_pre = unit_head; ++ while (unit_current) ++ { ++ if (unit_current->times > unit_pre->times) ++ unit_pre = unit_current; ++ unit_current = unit_current->next; ++ } ++ ++ if (!unit_pre || unit_pre->times < 2) ++ { ++ unit_current = unit_head; ++ while (unit_current) ++ { ++ unit_current = unit_current->next; ++ free (unit_head); ++ unit_head = unit_current; ++ } ++ return ptr->times * ptr->hash->size; ++ } ++ ++ /* Total code size and abandoned unit size. */ ++ total = total + ptr->hash->size; ++ abandon = unit_pre->times; ++ gc_size = total * (ptr->times - abandon); ++ ++ /* It have to estimate the longer common subexpression is profit. ++ Example: ABC ABC ABD. ++ We have to calculate ABC or AB is profit. */ ++ ++ ptr->hash->round = 1; ++ gain = nds32_elf_ifc_find_cse_recur (unit_pre, stack, total); ++ ptr->hash->round = 0; ++ ++ /* Free memory. */ ++ unit_current = unit_head; ++ while (unit_current) ++ { ++ unit_current = unit_current->next; ++ free (unit_head); ++ unit_head = unit_current; ++ } ++ ++ if (gain > gc_size ++ || gain == 0) ++ { ++ /* Return total gain if adapt this edge. */ ++ return (ptr->times - abandon) * ptr->hash->size + gain; ++ } ++ else ++ { ++ /* It is not more benifit to link deeper, and pop it. */ ++ nds32_elf_ifc_pop_stack (stack, ptr); ++ return 0; ++ } ++} ++ ++/* Reallocate section contents. */ ++ ++static void ++nds32_elf_ifc_reallocate_contents (asection *sec, int modify, ++ bfd_byte **contents) ++{ ++ /* This function is highly dangerous, but I have to implement it. */ ++ sec->size += modify; ++ bfd_byte *p = bfd_malloc (sec->size * sizeof (bfd_byte)); ++ memset (p, 0, sec->size * sizeof (bfd_byte)); ++ memcpy (p, *contents, sec->size - modify); ++ free (*contents); ++ *contents = p; ++ elf_section_data (sec)->this_hdr.contents = p; ++} ++ ++/* Insert a symbol in symbol table. */ ++ ++static int ++nds32_elf_ifc_insert_sym_hash (bfd *abfd, ++ struct bfd_link_hash_entry *bh) ++{ ++ const struct elf_backend_data *bed = get_elf_backend_data (abfd); ++ struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd); ++ struct elf_link_hash_entry **sym_hash; ++ bfd_size_type amt; ++ Elf_Internal_Shdr *hdr; ++ bfd_size_type symcount; ++ bfd_size_type extsymcount; ++ bfd_size_type i; ++ ++ /* No symbol hash exsitence. */ ++ if (!sym_hashes) ++ return -1; ++ ++ if (!(abfd->flags & DYNAMIC) || elf_dynsymtab (abfd) == 0) ++ hdr = &elf_tdata (abfd)->symtab_hdr; ++ else ++ return -1; ++ ++ /* Check for the symbol existance. */ ++ symcount = hdr->sh_size / bed->s->sizeof_sym; ++ extsymcount = symcount - hdr->sh_info; ++ for (i = 0; i < extsymcount; i++) ++ { ++ if ((struct bfd_link_hash_entry *) *(sym_hashes + i) == bh) ++ return i + hdr->sh_info; ++ } ++ ++ /* Add one more entry. */ ++ hdr->sh_size += bed->s->sizeof_sym; ++ ++ symcount = hdr->sh_size / bed->s->sizeof_sym; ++ if (elf_bad_symtab (abfd)) ++ extsymcount = symcount; ++ else ++ extsymcount = symcount - hdr->sh_info; ++ ++ sym_hash = NULL; ++ if (extsymcount != 0) ++ { ++ /* We store a pointer to the hash table entry for each external ++ symbol. */ ++ amt = extsymcount * sizeof (struct elf_link_hash_entry *); ++ sym_hash = bfd_malloc (amt); ++ memset (sym_hash, 0, amt); ++ if (sym_hash == NULL) ++ return -1; ++ memcpy (sym_hash, sym_hashes, ++ amt - sizeof (struct elf_link_hash_entry *)); ++ memcpy (sym_hash + extsymcount -1, &bh, ++ sizeof (struct elf_link_hash_entry *)); ++ elf_sym_hashes (abfd) = sym_hash; ++ /* TODO: Since sym_hashes is allocated by bfd_zalloc, it can not ++ be free directly. We have to record the memory allocated by ++ ourselves and free it. */ ++ return (symcount - 1); ++ } ++ else ++ return -1; ++} ++ ++/* Insert relocation. */ ++ ++static void ++nds32_elf_ifc_insert_relocation (struct bfd_link_info *info, ++ bfd *abfd, asection *sec, ++ struct bfd_link_hash_entry *bh, ++ bfd_vma offset, ++ bfd_boolean align, ++ bfd_vma clean_off) ++{ ++ /* Insert a new relocation into section rela, and this is very force ++ implementation. It may cause unknown problem. */ ++ ++ Elf_Internal_Rela *relocs, *internal_relocs, *irelend; ++ long unsigned int size, extsymcount; ++ const struct elf_backend_data *bed = get_elf_backend_data (abfd); ++ unsigned int count = 0; ++ int num = 2; ++ ++ /* If the reduction size is not 4 bytes aligment, it has to insert ++ one more relocation. */ ++ if (!align) ++ num = 3; ++ ++ /* Insert the jump target in symbol hash. */ ++ extsymcount = nds32_elf_ifc_insert_sym_hash (abfd, bh); ++ if (extsymcount <= 0) ++ return; ++ ++ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, ++ NULL, NULL, FALSE); ++ irelend = internal_relocs + sec->reloc_count; ++ ++ /* The common block including relocation, it has to been cleaned. */ ++ relocs = internal_relocs; ++ while (relocs && relocs < irelend) ++ { ++ if (relocs->r_offset >= offset && relocs->r_offset <= clean_off) ++ relocs->r_info = ELF32_R_INFO (ELF32_R_SYM (relocs->r_info), ++ R_NDS32_NONE); ++ relocs++; ++ } ++ ++ /* We have to insert two relocations; one for ifc and ++ another is for alignment.*/ ++ sec->reloc_count += num; ++ size = sec->reloc_count; ++ size *= bed->s->int_rels_per_ext_rel * sizeof (Elf_Internal_Rela); ++ relocs = (Elf_Internal_Rela *) bfd_malloc (size); ++ memset (relocs, 0, size); ++ elf_section_data (sec)->relocs = relocs; ++ while ((internal_relocs + count) < irelend ++ && (internal_relocs + count)->r_offset <= offset) ++ count++; ++ ++ /* Copy the front part where the offset is smaller. */ ++ memcpy (relocs, internal_relocs, ++ (bed->s->int_rels_per_ext_rel * sizeof (Elf_Internal_Rela) * count)); ++ ++ /* Insert new relocations. */ ++ irelend = relocs + count; ++ /* Set relocation. */ ++ irelend->r_offset = offset; ++ irelend->r_info = ++ ELF32_R_INFO (extsymcount, R_NDS32_17IFC_PCREL_RELA); ++ irelend->r_addend = 0; ++ ++ irelend++; ++ /* Set relocation. */ ++ irelend->r_offset = offset; ++ irelend->r_info = ELF32_R_INFO (0, R_NDS32_INSN16); ++ irelend->r_addend = 0; ++ ++ /* One more relocation for alignment. */ ++ if (!align) ++ { ++ irelend++; ++ irelend->r_offset = offset + 4; ++ irelend->r_info = ELF32_R_INFO (0, R_NDS32_INSN16); ++ irelend->r_addend = 1; ++ /* Put offset. */ ++ } ++ ++ /* Copy the rest part. */ ++ irelend++; ++ memcpy (irelend, internal_relocs + count, ++ size - (bed->s->int_rels_per_ext_rel * ++ sizeof (Elf_Internal_Rela) * (count + num))); ++ if (!info->keep_memory) ++ free (internal_relocs); ++} ++ ++/* Adjust insntruction map offset. Variable "adjust" is recorded the size ++ after relaxing. */ ++ ++static void ++nds32_elf_ifc_adjust_block (asection *sec, bfd_vma offset, int size, int adjust) ++{ ++ struct elf_nds32_ifc_sec_block *block; ++ struct elf_nds32_ifc_sec_member *smember; ++ ++ block = ifc_block_head; ++ while (block->sec != sec) ++ block = block->next; ++ ++ smember = block->smember; ++ while (smember->member->offset < offset) ++ smember = smember->next; ++ ++ while (size < 0 ++ && smember ++ && smember->member->offset < offset - size + adjust) ++ { ++ /* The offset result may smaller than zero, so we set its value as the ++ ifcall. */ ++ smember->member->offset = offset; ++ smember = smember->next; ++ } ++ while (smember) ++ { ++ smember->member->offset += size; ++ smember = smember->next; ++ } ++} ++ ++/* Adjust relocation and symbol. */ ++ ++static void ++nds32_elf_ifc_enlarge (bfd *abfd, asection *sec, bfd_vma off, int size) ++{ ++ unsigned int sec_shndx; /* The section the be relaxed. */ ++ Elf_Internal_Shdr *symtab_hdr; /* Symbol table header of this bfd. */ ++ Elf_Internal_Sym *isym; /* Symbol table of this bfd. */ ++ Elf_Internal_Sym *isymend; /* Symbol entry iterator. */ ++ Elf_Internal_Rela *internal_relocs; ++ Elf_Internal_Rela *irel; ++ Elf_Internal_Rela *irelend; ++ unsigned int symcount; ++ struct elf_link_hash_entry **sym_hashes; ++ struct elf_link_hash_entry **end_hashes; ++ asection *sect; ++ bfd_byte *contents; ++ ++ sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ isym = (Elf_Internal_Sym *) symtab_hdr->contents; ++ if (isym == NULL) ++ { ++ isym = bfd_elf_get_elf_syms (abfd, symtab_hdr, ++ symtab_hdr->sh_info, 0, NULL, NULL, NULL); ++ symtab_hdr->contents = (bfd_byte *) isym; ++ } ++ ++ if (isym == NULL || symtab_hdr->sh_info == 0) ++ return; ++ ++ for (sect = abfd->sections; sect != NULL; sect = sect->next) ++ { ++ /* Adjust all the relocs. */ ++ ++ if ((sect->flags & SEC_RELOC) == 0) ++ continue; ++ ++ /* Relocations MUST be kept in memory, because relaxation adjust them. */ ++ internal_relocs = _bfd_elf_link_read_relocs (abfd, sect, NULL, NULL, ++ TRUE /* keep_memory */); ++ irelend = internal_relocs + sect->reloc_count; ++ ++ if (!nds32_get_section_contents (abfd, sect, &contents, TRUE)) ++ continue; ++ ++ for (irel = internal_relocs; irel < irelend; irel++) ++ { ++ if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_DIFF8 ++ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_DIFF32 ++ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx) ++ { ++ unsigned long val, mask; ++ ++ switch (ELF32_R_TYPE (irel->r_info)) ++ { ++ case R_NDS32_DIFF8: ++ val = bfd_get_8 (abfd, contents + irel->r_offset); ++ break; ++ case R_NDS32_DIFF16: ++ val = bfd_get_16 (abfd, contents + irel->r_offset); ++ break; ++ case R_NDS32_DIFF32: ++ val = bfd_get_32 (abfd, contents + irel->r_offset); ++ mask = 0 - (val >> 31); ++ if (mask) ++ val = (val | (mask - 0xffffffff)); ++ break; ++ default: ++ BFD_ASSERT (0); ++ } ++ ++ if ((off > irel->r_addend && off <= irel->r_addend + val) ++ || (off <= irel->r_addend && off > irel->r_addend + val)) ++ { ++ /* The offset is incresed. */ ++ switch (ELF32_R_TYPE (irel->r_info)) ++ { ++ /* It may overflow. */ ++ case R_NDS32_DIFF8: ++ bfd_put_8 (abfd, val + size, contents + irel->r_offset); ++ break; ++ case R_NDS32_DIFF16: ++ bfd_put_16 (abfd, val + size, contents + irel->r_offset); ++ break; ++ case R_NDS32_DIFF32: ++ bfd_put_32 (abfd, val + size, contents + irel->r_offset); ++ break; ++ } ++ } ++ } ++ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_DIFF_ULEB128 ++ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx) ++ { ++ bfd_vma val = 0; ++ unsigned int len = 0; ++ bfd_byte *endp, *p; ++ ++ val = read_unsigned_leb128 (abfd, contents + irel->r_offset, &len); ++ ++ if (off >= irel->r_addend ++ && off < irel->r_addend + val) ++ { ++ /* The offset is incresed. */ ++ p = contents + irel->r_offset; ++ endp = p + len -1; ++ memset (p, 0x80, len); ++ *(endp) = 0; ++ /* It may overflow. */ ++ p = write_uleb128 (p, val + size) - 1; ++ if (p < endp) ++ *p |= 0x80; ++ } ++ } ++ ++ if (sec == sect) ++ { ++ if (irel->r_offset >= off) ++ irel->r_offset += size; ++ } ++ ++ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL ++ || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY) ++ continue; ++ ++ if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info ++ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx ++ && ELF_ST_TYPE (isym[ELF32_R_SYM (irel->r_info)].st_info) == STT_SECTION) ++ { ++ if (irel->r_addend <= sec->size ++ && irel->r_addend >= off) ++ irel->r_addend += size; ++ } ++ } ++ } ++ ++ /* Adjust the local symbols defined in this section. */ ++ for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++) ++ { ++ if (isym->st_shndx == sec_shndx) ++ { ++ if (isym->st_value <= sec->size) ++ { ++ if (isym->st_value >= off) ++ isym->st_value += size; ++ /* Adjust function size. */ ++ else if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC && isym->st_size > 0 ++ && (isym->st_value + isym->st_size) >= off) ++ isym->st_size += size; ++ } ++ } ++ } ++ /* Now adjust the global symbols defined in this section. */ ++ symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym) ++ - symtab_hdr->sh_info); ++ sym_hashes = elf_sym_hashes (abfd); ++ end_hashes = sym_hashes + symcount; ++ for (; sym_hashes < end_hashes; sym_hashes++) ++ { ++ struct elf_link_hash_entry *sym_hash = *sym_hashes; ++ ++ if ((sym_hash->root.type == bfd_link_hash_defined ++ || sym_hash->root.type == bfd_link_hash_defweak) ++ && sym_hash->root.u.def.section == sec) ++ { ++ if (sym_hash->root.u.def.value <= sec->size) ++ { ++ if (sym_hash->root.u.def.value >= off) ++ sym_hash->root.u.def.value += size; ++ ++ /* Adjust function size. */ ++ else if (sym_hash->type == STT_FUNC ++ && (sym_hash->root.u.def.value + sym_hash->size) >= off) ++ sym_hash->size += size; ++ ++ } ++ } ++ } ++ nds32_elf_ifc_adjust_block (sec, off, size, 0); ++} ++ ++/* Check distance between branch become farer if it ++ cause relocation overfolw. */ ++ ++static bfd_boolean ++nds32_elf_ifc_check_overflow (struct elf_nds32_ifc_insn_stack *ptr) ++{ ++ struct elf_nds32_ifc_insn_member *imember; ++ struct elf_nds32_ifc_member *member; ++ asection *sec; ++ bfd_vma offset; ++ Elf_Internal_Rela *irel, *internal_relocs, *irelend; ++ unsigned int sec_shndx; ++ bfd *abfd; ++ Elf_Internal_Sym *isym = NULL; /* Symbol table of this bfd. */ ++ Elf_Internal_Shdr *symtab_hdr; ++ ++ /* Get the common block final instruction address. */ ++ imember = ptr->imember; ++ while (imember->next) ++ imember = imember->next; ++ member = imember->member; ++ /* Add the final instruction and its instruction size to get ++ the address inserted the ifret16. */ ++ offset = member->offset + member->unit_p->hash->size; ++ ++ sec = member->sec; ++ abfd = sec->owner; ++ sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); ++ ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ ++ if (!nds32_get_local_syms (abfd, sec, &isym)) ++ return FALSE; ++ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, ++ TRUE /* keep_memory */); ++ irelend = internal_relocs + sec->reloc_count; ++ ++ for (irel = internal_relocs; irel < irelend; irel++) ++ { ++ if (ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY ++ && ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info ++ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx) ++ { ++ /* Get the distance between caller and callee. */ ++ unsigned int distance; ++ if (irel->r_offset < offset && irel->r_addend > offset) ++ distance = irel->r_addend - irel->r_offset; ++ else if (irel->r_offset > offset && irel->r_addend < offset) ++ distance = irel->r_offset - irel->r_addend; ++ else ++ continue; ++ ++ /* In current, just check pc relative jump here. It may has to ++ check more relocation in the feature. */ ++ switch (ELF32_R_TYPE (irel->r_info)) ++ { ++ /* It has to subtruct 5 since it has to ++ consider the 4 bytes for ifret. */ ++ case R_NDS32_9_PCREL_RELA: ++ if (distance > ((1 << 8) - 5)) ++ return FALSE; ++ break; ++ case R_NDS32_15_PCREL_RELA: ++ if (distance > ((1 << 14) - 5)) ++ return FALSE; ++ break; ++ default: ++ break; ++ } ++ } ++ } ++ return TRUE; ++} ++ ++ ++/* Insert a INSN16 relocation for relaxing ifret. */ ++ ++static void ++nds32_elf_ifc_insert_insn16_reloc (struct bfd_link_info *info, ++ bfd *abfd, asection *sec, ++ unsigned long int offset) ++{ ++ /* Insert a new relocation into section rela, and this is very force ++ implementation. It may cause unknown problem. */ ++ ++ Elf_Internal_Rela *relocs, *internal_relocs, *irelend; ++ long unsigned int size; ++ const struct elf_backend_data *bed = get_elf_backend_data (abfd); ++ unsigned int count = 0; ++ ++ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, ++ NULL, NULL, FALSE); ++ irelend = internal_relocs + sec->reloc_count; ++ ++ /* We have to insert two relocations; one for ifc and ++ another is for alignment.*/ ++ sec->reloc_count += 1; ++ size = sec->reloc_count; ++ size *= bed->s->int_rels_per_ext_rel * sizeof (Elf_Internal_Rela); ++ relocs = (Elf_Internal_Rela *) bfd_malloc (size); ++ memset (relocs, 0, size); ++ elf_section_data (sec)->relocs = relocs; ++ while ((internal_relocs + count) < irelend ++ && (internal_relocs + count)->r_offset <= offset) ++ count++; ++ ++ /* Copy the front part where the offset is smaller. */ ++ memcpy (relocs, internal_relocs, ++ (bed->s->int_rels_per_ext_rel * sizeof (Elf_Internal_Rela) * count)); ++ ++ /* Insert new relocations. */ ++ irelend = relocs + count; ++ ++ /* Set relocation. */ ++ irelend->r_offset = offset; ++ irelend->r_info = ELF32_R_INFO (0, R_NDS32_INSN16); ++ irelend->r_addend = 0; ++ ++ irelend++; ++ /* Copy the rest part. */ ++ memcpy (irelend, internal_relocs + count, ++ size - (bed->s->int_rels_per_ext_rel * ++ sizeof (Elf_Internal_Rela) * (count + 1))); ++ if (!info->keep_memory) ++ free (internal_relocs); ++} ++ ++/* Push new element into the head of stack. */ ++ ++static void ++nds32_elf_ifc_extend_stack (struct elf_nds32_ifc_insn_stack *stack, ++ struct elf_nds32_ifc_unit *unit) ++{ ++ struct elf_nds32_ifc_insn_stack *stackP = stack; ++ struct elf_nds32_ifc_member *pre_member; ++ struct elf_nds32_ifc_insn_member *imember; ++ struct elf_nds32_ifc_code_hash_entry *hash; ++ ++ while (stackP) ++ { ++ stackP->choose = stackP->extend; ++ stackP->extend = 0; ++ stackP= stackP->next; ++ } ++ ++ hash = unit->entry_p; ++ stackP = stack; ++ while (stackP) ++ { ++ if (stackP->choose && stackP->extend == 0) ++ { ++ pre_member = stackP->imember->member->pre_member; ++ if (pre_member && !pre_member->dead ++ && pre_member->unit_p->entry_p == hash) ++ { ++ stackP->extend = 1; ++ imember = malloc (sizeof (struct elf_nds32_ifc_insn_member)); ++ imember->member = pre_member; ++ imember->next = stackP->imember; ++ stackP->imember = imember; ++ } ++ } ++ stackP = stackP->next; ++ } ++} ++ ++/* Search stack extend up. */ ++ ++static bfd_boolean ++nds32_elf_ifc_extend_up (struct elf_nds32_ifc_insn_stack *stack) ++{ ++ struct elf_nds32_ifc_insn_stack *stackP = stack; ++ struct elf_nds32_ifc_member *memberP; ++ struct elf_nds32_ifc_insn_member *imember; ++ struct elf_nds32_ifc_unit *unitP, *unit_head = NULL, *unit_tail = NULL; ++ ++ while (stackP) ++ { ++ if (stackP->extend ++ && nds32_elf_ifc_check_overflow (stackP)) ++ { ++ /* Get previos member. */ ++ unitP = unit_head; ++ memberP = stackP->imember->member->pre_member; ++ if (memberP && !memberP->dead) ++ { ++ while (unitP) ++ { ++ unit_tail = unitP; ++ if (memberP && memberP->unit_p->entry_p == unitP->entry_p ++ && (!unitP->entry_p->h ++ || unitP->entry_p->h == memberP->unit_p->entry_p->h)) ++ { ++ unitP->times++; ++ break; ++ } ++ unitP = unitP->next; ++ } ++ ++ /* Can't find matched unit so new one. */ ++ if (!unitP) ++ { ++ /* Check this instruction is not in stack. I can't find a ++ better way currently. */ ++ imember = stackP->imember; ++ while (imember) ++ { ++ if (imember->member->unit_p->hash ++ == memberP->unit_p->entry_p) ++ break; ++ imember = imember->next; ++ } ++ if (!imember) ++ { ++ unitP = malloc (sizeof (struct elf_nds32_ifc_unit)); ++ unitP->times = 1; ++ unitP->member = memberP; ++ unitP->entry_p = memberP->unit_p->entry_p; ++ unitP->hash = memberP->unit_p->hash; ++ unitP->next = NULL; ++ if (!unit_head) ++ unit_head = unitP; ++ else ++ unit_tail->next = unitP; ++ } ++ } ++ } ++ } ++ stackP = stackP->next; ++ } ++ ++ /* Find a max one unit. */ ++ unitP = unit_head; ++ unit_tail = unit_head; ++ while (unitP) ++ { ++ if (unitP->times > unit_tail->times) ++ unit_tail = unitP; ++ unitP = unitP->next; ++ } ++ if (!unit_tail || unit_tail->times < 2) ++ return FALSE; ++ else ++ { ++ nds32_elf_ifc_extend_stack (stack, unit_tail); ++ unit_tail->hash->round = 1; ++ nds32_elf_ifc_extend_up (stack); ++ unit_tail->hash->round = 0; ++ return TRUE; ++ } ++} ++ ++/* Check this stack is worth to be used. */ ++ ++static bfd_boolean ++nds32_elf_ifc_check (struct elf_nds32_ifc_insn_stack *stack, ++ struct elf_nds32_ifc_insn_stack **base, ++ bfd_boolean extend) ++{ ++ struct elf_nds32_ifc_insn_stack *ptr; ++ struct elf_nds32_ifc_insn_member *imember; ++ bfd_vma insn_sz; ++ ++ ptr = stack; ++ while (ptr) ++ { ++ if ((extend && ptr->extend) ++ || (!extend && ptr->live ++ && nds32_elf_ifc_check_overflow (ptr))) ++ break; ++ ptr = ptr->next; ++ } ++ *base = ptr; ++ ++ if (!*base) ++ return FALSE; ++ ++ /* Conform the code size can be reduced. */ ++ ptr = stack; ++ while (ptr) ++ { ++ if (ptr->live && ptr != *base) ++ break; ++ ptr = ptr->next; ++ } ++ if (!ptr) ++ return FALSE; ++ ++ /* Get the end offset of common. */ ++ imember = (*base)->imember; ++ insn_sz = imember->member->unit_p->entry_p->size; ++ insn_sz += imember->member->unit_p->hash->size; ++ while (imember->next) ++ { ++ imember = imember->next; ++ insn_sz += imember->member->unit_p->hash->size; ++ } ++ /* The ifc does not trigger, clear all stack. */ ++ if (insn_sz < 8) ++ return FALSE; ++ ++ return TRUE; ++} ++ ++/* Insert a new ifc target symbol. */ ++ ++#define IFC_TARGET_NAME 10 ++static void ++nds32_elf_ifc_insert_target (struct elf_nds32_ifc_insn_stack *base, ++ bfd_vma off, ++ struct bfd_link_info *info, ++ struct bfd_link_hash_entry **bh) ++{ ++ static char name[45] = "$nds32ifc_a"; /* Is this enough? */ ++ int temp_num; ++ static int hash_num = IFC_TARGET_NAME; ++ asection *sec = base->imember->member->sec; ++ bfd *abfd = sec->owner; ++ ++ *bh = bfd_link_hash_lookup (info->hash, name, ++ FALSE, FALSE, TRUE); ++ /* Insert a global symbol for ifc target. */ ++ _bfd_generic_link_add_one_symbol ++ (info, info->output_bfd, name, BSF_GLOBAL, ++ sec, off, (const char *) NULL, TRUE, /* copy */ ++ get_elf_backend_data (info->output_bfd)->collect, ++ bh); ++ ++ ++ /* Adjust ifc target name for next time. */ ++ temp_num = hash_num; ++ while (name[temp_num] >= 'z' && temp_num >= IFC_TARGET_NAME) ++ { ++ temp_num--; ++ } ++ ++ if (temp_num < IFC_TARGET_NAME) ++ { ++ /* Add one more bit and reset all bits. */ ++ hash_num++; ++ temp_num = hash_num; ++ while (temp_num >= IFC_TARGET_NAME) ++ { ++ name[temp_num] = 'a'; ++ temp_num--; ++ } ++ name[hash_num + 1] = '\0'; ++ } ++ else if (temp_num == hash_num) ++ { ++ /* Add latest one bit. */ ++ name[temp_num]++; ++ } ++ else ++ { ++ /* Add carry bit and reset low significant bits. */ ++ name[temp_num]++; ++ while (temp_num < hash_num) ++ { ++ temp_num++; ++ name[temp_num] = 'a'; ++ } ++ } ++ /* Insert the global symbol into branch target bfd to adjust ++ when relaxing. */ ++ if (nds32_elf_ifc_insert_sym_hash (abfd, *bh) < 0) ++ return; ++} ++ ++/* Replace common code with ifc. In this functionm, it has to check ++ whether relocation is overflow after insert ifret16. If it is fine, ++ insert ifret16 into one common block, and replace other common with ++ ifcall and insert relocation for it. */ ++ ++static void ++nds32_elf_ifc_replace_common (struct elf_nds32_ifc_insn_stack *stack, ++ struct bfd_link_info *info) ++{ ++ struct elf_nds32_ifc_insn_stack *ptr, *base; ++ struct elf_nds32_ifc_insn_member *imember, *base_imember; ++ struct elf_nds32_ifc_member *member; ++ bfd_byte *contents = NULL; ++ bfd_vma off, insn_sz, relocation, clean_off, base_off; ++ nds32_elf_blank_t *relax_blank_list = NULL; ++ struct bfd_link_hash_entry *bh; ++ asection *sec; ++ bfd *abfd; ++ bfd_boolean align_mask, extend; ++ ++ if (!stack) ++ return; ++ ++ /* Set extend for all live stack. */ ++ ptr = stack; ++ while (ptr) ++ { ++ ptr->extend = ptr->live; ++ ptr = ptr->next; ++ } ++ extend = nds32_elf_ifc_extend_up (stack); ++ ++ if (!nds32_elf_ifc_check (stack, &base, extend)) ++ { ++ ptr = stack; ++ while (ptr) ++ { ++ ptr->live = 0; ++ ptr = ptr->next; ++ } ++ return; ++ } ++ ++ /* Get the total block size. */ ++ imember = base->imember; ++ while (imember->next) ++ { ++ imember = imember->next; ++ insn_sz += imember->member->unit_p->hash->size; ++ } ++ /* Find the base block. */ ++ member = imember->member; ++ /* Final instruction offset. */ ++ off = member->offset; ++ /* Final instruction size. */ ++ insn_sz = member->unit_p->hash->size; ++ sec = member->sec; ++ abfd = member->sec->owner; ++ ++ if (!member->unit_p->hash->end) ++ { ++ /* Stack is the ifc base. Insert ifret16 into the block. */ ++ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)) ++ return; ++ ++ /* Adjust contents. */ ++ nds32_elf_ifc_reallocate_contents (sec, 4, &contents); ++ memmove (contents + off + 4 + insn_sz, ++ contents + off + insn_sz, ++ sec->size - off - insn_sz - 4); ++ ++ /* Adjust relocation and symbols. */ ++ nds32_elf_ifc_enlarge (abfd, sec, off + insn_sz, 4); ++ ++ /* Put ifret. It insert 32-bits ret since it has to consider alignment ++ in the future. */ ++ bfd_putb32 (INSN_IFRET, contents + off + insn_sz); ++ ++ /* Insert relocation for convert to 16-bits if possible. */ ++ nds32_elf_ifc_insert_insn16_reloc (info, abfd, sec, off + insn_sz); ++ } ++ ++ ++ off = base->imember->member->offset ++ - base->imember->member->unit_p->entry_p->size; ++ ++ /* The common block address. */ ++ relocation = off + sec->output_offset + sec->output_section->vma; ++ ++ /* Others has to exchange to ifcall, and insert relocation. */ ++ ptr = stack; ++ while (ptr) ++ { ++ if (ptr->live && ptr != base) ++ { ++ insn_sz = 0; ++ imember = ptr->imember; ++ member = imember->member; ++ sec = member->sec; ++ abfd = member->sec->owner; ++ ++ /* Check the range enough for ifcall. */ ++ off = member->offset - member->unit_p->entry_p->size ++ + sec->output_offset + sec->output_section->vma; ++ /* The larget range 16s and right shift one bit. Do it conservatively, ++ so pick range 0xf000. */ ++ if ((off > relocation && (off - relocation) > 0xf000) ++ || (off < relocation && (relocation - off) > 0xf000)) ++ { ++ ptr = ptr->next; ++ continue; ++ } ++ ++ /* The first insntruction offset. */ ++ off = member->offset - member->unit_p->entry_p->size; ++ ++ /* Get the total insntruntion size of the common subexpression. */ ++ insn_sz += member->unit_p->entry_p->size; ++ while (imember && member->unit_p) ++ { ++ member = imember->member; ++ insn_sz += member->unit_p->hash->size; ++ imember = imember->next; ++ } ++ ++ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)) ++ { ++ (*_bfd_error_handler) ++ (_("Linker: relax for ifc get section contents error.\n")); ++ return; ++ } ++ ++ /* Check the total size of common if 4 bytes multiple or not. */ ++ align_mask = ((insn_sz % 4) == 0) ? TRUE : FALSE; ++ clean_off = off + insn_sz - 2; ++ ++ /* Find the member match to base block. */ ++ base_imember = base->imember; ++ imember = ptr->imember; ++ while (imember->member->unit_p != base_imember->member->unit_p) ++ base_imember = base_imember->next; ++ if (!imember) ++ { ++ (*_bfd_error_handler) ++ (_("Linker: relax for ifc error.\n")); ++ return; ++ } ++ bh = base_imember->member->bh; ++ if (!bh) ++ { ++ base_off = base_imember->member->offset ++ - base_imember->member->unit_p->entry_p->size; ++ /* Insert a global symbol for ifc target. */ ++ nds32_elf_ifc_insert_target (base, base_off, info, &bh); ++ base_imember->member->bh = bh; ++ } ++ ++ /* Insert two relocations IFCALL and INSN16. */ ++ nds32_elf_ifc_insert_relocation (info, abfd, sec, bh, off, ++ align_mask, clean_off); ++ ++ bfd_putb32 (INSN_IFCALL, contents + off); ++ ++ if (!align_mask) ++ bfd_putb16 (INSN_NOP16, contents + off + 4); ++ ++ if (align_mask && !insert_nds32_elf_blank_recalc_total ++ (&relax_blank_list, off + 4, insn_sz - 4)) ++ return; ++ else if (!align_mask && !insert_nds32_elf_blank_recalc_total ++ (&relax_blank_list, off + 6, insn_sz - 6)) ++ return; ++ if (relax_blank_list) ++ { ++ nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list); ++ relax_blank_list = NULL; ++ } ++ nds32_elf_ifc_adjust_block (sec, off, ((align_mask) ? 4 : 6) - insn_sz, ++ (align_mask) ? 4 : 6); ++ } ++ ptr = ptr->next; ++ } ++} ++ ++/* Free heap and set dead member. */ ++ ++static void ++nds32_elf_ifc_release_member (struct elf_nds32_ifc_insn_stack *stack) ++{ ++ struct elf_nds32_ifc_insn_stack *ptr, *temp_ptr; ++ struct elf_nds32_ifc_insn_member *imember, *temp; ++ ++ ptr = stack; ++ while (ptr) ++ { ++ if (ptr->live) ++ { ++ imember = ptr->imember; ++ while (imember) ++ { ++ /* Set edge dead. */ ++ imember->member->dead = TRUE; ++ imember->member->unit_p->times--; ++ /* Since the previous insntruction is used, ++ set the edge dead, too. */ ++ imember->member->next_member->dead = TRUE; ++ if (imember->member->pre_member) ++ imember->member->pre_member->dead = TRUE; ++ temp = imember; ++ imember = imember->next; ++ free (temp); ++ } ++ } ++ temp_ptr = ptr; ++ ptr = ptr->next; ++ free (temp_ptr); ++ } ++} ++ ++/* Get the new max_unit for entry. */ ++ ++static bfd_boolean ++nds32_elf_ifc_next_max (struct elf_nds32_ifc_code_hash_entry *entry) ++{ ++ struct elf_nds32_ifc_unit *unitP, *max_unit; ++ ++ unitP = entry->unit; ++ max_unit = entry->unit; ++ while (unitP) ++ { ++ if (unitP->times > max_unit->times ++ && !unitP->done) ++ max_unit = unitP; ++ unitP = unitP->next; ++ } ++ if (!max_unit->done && max_unit->times >= 2) ++ { ++ entry->max_unit = max_unit; ++ entry->max_times = max_unit->times; ++ return TRUE; ++ } ++ return FALSE; ++} ++ ++/* Find cse block here. */ ++ ++static void ++nds32_elf_ifc_find_cse (struct bfd_link_info *info) ++{ ++ /* Example: insntruction ABCABCB. In the first round we will choose B, ++ and find its next possible insntruction. In the end of this round, ++ we will know the max appearance times is 2, and the insntruction is C. */ ++ struct elf_nds32_ifc_code_hash_entry *ptr = ifc_insn_head; ++ struct elf_nds32_ifc_insn_stack *stack; ++ ++ while (ptr) ++ { ++ stack = NULL; ++ if (ptr->max_unit && ptr->max_times >= 2) ++ { ++ /* We save some infomation for ifc search back, but not ++ implement yet. It may can be done hear. */ ++ ptr->max_unit->done = 1; ++ ptr->round = 1; ++ nds32_elf_ifc_find_cse_recur (ptr->max_unit, &stack, ptr->size); ++ nds32_elf_ifc_replace_common (stack, info); ++ ptr->round = 0; ++ nds32_elf_ifc_release_member (stack); ++ if (nds32_elf_ifc_next_max (ptr)) ++ continue; ++ } ++ ptr = ptr->next; ++ } ++} ++ ++/* To find the cse and relax it. */ ++ ++static void ++nds32_elf_ifc_cse_algo (struct bfd_link_info *info) ++{ ++ /* Order the insntruction by max_unit times. */ ++ nds32_elf_ifc_code_hash_traverse (nds32_elf_ifc_order_insn_times); ++ ++ /* Find common subexpression. */ ++ nds32_elf_ifc_find_cse (info); ++} ++/* End IFC. */ ++ ++ ++/* Rom-patch table hash function. */ ++ ++static struct bfd_hash_entry * ++nds32_elf_ict_hash_newfunc (struct bfd_hash_entry *entry, ++ struct bfd_hash_table *table, ++ const char *string) ++{ ++ struct elf_nds32_ict_hash_entry *ret; ++ ++ /* Allocate the structure if it has not already been allocated by a ++ subclass. */ ++ if (entry == NULL) ++ { ++ entry = (struct bfd_hash_entry *) ++ bfd_hash_allocate (table, sizeof (*ret)); ++ if (entry == NULL) ++ return entry; ++ } ++ ++ /* Call the allocation method of the superclass. */ ++ entry = bfd_hash_newfunc (entry, table, string); ++ if (entry == NULL) ++ return entry; ++ ++ ret = (struct elf_nds32_ict_hash_entry*) entry; ++ ret->order = 0; ++ return &ret->root; ++} ++ ++static void ++nds32_elf_ict_hash_init (void) ++{ ++ if (!bfd_hash_table_init_n (&indirect_call_table, nds32_elf_ict_hash_newfunc, ++ sizeof (struct elf_nds32_ict_hash_entry), ++ 1023)) ++ (*_bfd_error_handler) (_("ld error: cannot init rom patch hash table\n")); ++ return; ++} ++ ++/* Relocate for NDS32_ICT_SECTION. */ ++static void ++nds32_elf_ict_relocate (struct bfd_link_info *info) ++{ ++ static bfd_boolean done = FALSE; ++ asection *sec; ++ bfd_byte *contents = NULL; ++ uint32_t insn; ++ unsigned int i; ++ struct elf_link_hash_entry *h; ++ struct bfd_link_hash_entry *h2; ++ bfd_vma relocation, base; ++ ++ if (done) ++ return; ++ ++ done = TRUE; ++ ++ sec = nds32_elf_get_target_section (info, NDS32_ICT_SECTION); ++ h2 = bfd_link_hash_lookup (info->hash, "_INDIRECT_CALL_TABLE_BASE_", ++ FALSE, FALSE, FALSE); ++ base = ((h2->u.def.value ++ + h2->u.def.section->output_section->vma ++ + h2->u.def.section->output_offset)); ++ ++ if (!nds32_get_section_contents (sec->owner, sec, &contents, TRUE)) ++ return; ++ ++ indirect_call_table.frozen = 1; ++ for (i = 0; i < indirect_call_table.size; i++) ++ { ++ struct bfd_hash_entry *p; ++ struct elf_nds32_ict_hash_entry *entry; ++ ++ for (p = indirect_call_table.table[i]; p != NULL; p = p->next) ++ { ++ entry = (struct elf_nds32_ict_hash_entry *) p; ++ insn = INSN_J; ++ h = entry->h; ++ if ((h->root.type == bfd_link_hash_defined ++ || h->root.type == bfd_link_hash_defweak) ++ && h->root.u.def.section != NULL ++ && h->root.u.def.section->output_section != NULL) ++ { ++ ++ relocation = h->root.u.def.value + ++ h->root.u.def.section->output_section->vma + ++ h->root.u.def.section->output_offset; ++ insn |= ((relocation - base - entry->order * 4) >> 1) & 0xffffff; ++ } ++ else ++ relocation = 0; ++ ++ bfd_putb32 (insn, contents + (entry->order) * 4); ++ } ++ } ++ indirect_call_table.frozen = 0; ++} ++ ++static asection* ++nds32_elf_get_target_section (struct bfd_link_info *info, char *name) ++{ ++ asection *sec = NULL; ++ bfd *abfd; ++ ++ for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next) ++ { ++ sec = bfd_get_section_by_name (abfd, name); ++ if (sec != NULL) ++ break; ++ } ++ ++ return sec; ++} ++ ++ ++#define ELF_ARCH bfd_arch_nds32 ++#define ELF_MACHINE_CODE EM_NDS32 ++#define ELF_MAXPAGESIZE 0x1000 ++#define ELF_TARGET_ID NDS32_ELF_DATA ++ ++#define TARGET_BIG_SYM bfd_elf32_nds32be_vec ++#define TARGET_BIG_NAME "elf32-nds32be" ++#define TARGET_LITTLE_SYM bfd_elf32_nds32le_vec ++#define TARGET_LITTLE_NAME "elf32-nds32le" ++ ++#define elf_info_to_howto nds32_info_to_howto ++#define elf_info_to_howto_rel nds32_info_to_howto_rel ++ ++#define bfd_elf32_bfd_link_hash_table_create nds32_elf_link_hash_table_create ++#define bfd_elf32_bfd_merge_private_bfd_data nds32_elf_merge_private_bfd_data ++#define bfd_elf32_bfd_print_private_bfd_data nds32_elf_print_private_bfd_data ++#define bfd_elf32_bfd_relax_section nds32_elf_relax_section ++#define bfd_elf32_bfd_set_private_flags nds32_elf_set_private_flags ++ ++#define bfd_elf32_mkobject nds32_elf_mkobject ++#define elf_backend_action_discarded nds32_elf_action_discarded ++#define elf_backend_add_symbol_hook nds32_elf_add_symbol_hook ++#define elf_backend_check_relocs nds32_elf_check_relocs ++#define elf_backend_adjust_dynamic_symbol nds32_elf_adjust_dynamic_symbol ++#define elf_backend_create_dynamic_sections nds32_elf_create_dynamic_sections ++#define elf_backend_finish_dynamic_sections nds32_elf_finish_dynamic_sections ++#define elf_backend_finish_dynamic_symbol nds32_elf_finish_dynamic_symbol ++#define elf_backend_size_dynamic_sections nds32_elf_size_dynamic_sections ++#define elf_backend_relocate_section nds32_elf_relocate_section ++#define elf_backend_gc_mark_hook nds32_elf_gc_mark_hook ++#define elf_backend_gc_sweep_hook nds32_elf_gc_sweep_hook ++#define elf_backend_grok_prstatus nds32_elf_grok_prstatus ++#define elf_backend_grok_psinfo nds32_elf_grok_psinfo ++#define elf_backend_reloc_type_class nds32_elf_reloc_type_class ++#define elf_backend_copy_indirect_symbol nds32_elf_copy_indirect_symbol ++#define elf_backend_link_output_symbol_hook nds32_elf_output_symbol_hook ++#define elf_backend_output_arch_syms nds32_elf_output_arch_syms ++#define elf_backend_object_p nds32_elf_object_p ++#define elf_backend_final_write_processing nds32_elf_final_write_processing ++#define elf_backend_special_sections nds32_elf_special_sections ++#define bfd_elf32_bfd_get_relocated_section_contents \ ++ nds32_elf_get_relocated_section_contents ++#define bfd_elf32_bfd_is_target_special_symbol nds32_elf_is_target_special_symbol ++#define elf_backend_maybe_function_sym nds32_elf_maybe_function_sym ++ ++#define elf_backend_can_gc_sections 1 ++#define elf_backend_can_refcount 1 ++#define elf_backend_want_got_plt 1 ++#define elf_backend_plt_readonly 1 ++#define elf_backend_want_plt_sym 0 ++#define elf_backend_got_header_size 12 ++#define elf_backend_may_use_rel_p 1 ++#define elf_backend_default_use_rela_p 1 ++#define elf_backend_may_use_rela_p 1 ++ ++#include "elf32-target.h" ++ ++#undef ELF_MAXPAGESIZE ++#define ELF_MAXPAGESIZE 0x2000 ++ ++#undef TARGET_BIG_SYM ++#define TARGET_BIG_SYM bfd_elf32_nds32belin_vec ++#undef TARGET_BIG_NAME ++#define TARGET_BIG_NAME "elf32-nds32be-linux" ++#undef TARGET_LITTLE_SYM ++#define TARGET_LITTLE_SYM bfd_elf32_nds32lelin_vec ++#undef TARGET_LITTLE_NAME ++#define TARGET_LITTLE_NAME "elf32-nds32le-linux" ++#undef elf32_bed ++#define elf32_bed elf32_nds32_lin_bed ++ ++#include "elf32-target.h" +diff -Nur binutils-2.24.orig/bfd/elf32-nds32.h binutils-2.24/bfd/elf32-nds32.h +--- binutils-2.24.orig/bfd/elf32-nds32.h 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-2.24/bfd/elf32-nds32.h 2016-04-10 20:30:46.000000000 +0200 +@@ -0,0 +1,215 @@ ++/* NDS32-specific support for 32-bit ELF. ++ Copyright (C) 2012-2013 Free Software Foundation, Inc. ++ Contributed by Andes Technology Corporation. ++ ++ 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 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA.*/ ++ ++#ifndef ELF32_NDS32_H ++#define ELF32_NDS32_H ++ ++/* ++ * Relocation flags encoded in r_addend. ++ */ ++ ++/* Relocation flags for R_NDS32_ERLAX_ENTRY. */ ++ ++/* Set if relax on this section is done or disabled. */ ++#define R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG (1 << 31) ++/* Optimize for performance. */ ++#define R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG (1 << 30) ++/* Optimize for size. Branch destination 4-byte adjustment ++ may be disabled. */ ++#define R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG (1 << 29) ++/* To distinguish the assembly code generated by compiler ++ or written manually. */ ++#define R_NDS32_RELAX_ENTRY_VERBATIM_FLAG (1 << 28) ++/* EX9 and link-time IFC must be explicitly enabled, so we ++ won't mess up handcraft assembly code. */ ++/* Enable EX9 optimization for this section. */ ++#define R_NDS32_RELAX_ENTRY_EX9_FLAG (1 << 2) ++/* Enable IFC optimization for this section. */ ++#define R_NDS32_RELAX_ENTRY_IFC_FLAG (1 << 3) ++ ++ ++/* Relocation flags for R_NDS32_INSN16. */ ++ ++/* Tag the nop16 can be removed. */ ++#define R_NDS32_INSN16_CONVERT_FLAG (1 << 0) ++/* Convert a gp-relative access (e.g., lwi.gp) ++ to fp-as-gp access (lwi37.fp). ++ This value is used by linker internally only. ++ It's fine to change the vlaue. */ ++#define R_NDS32_INSN16_FP7U2_FLAG (1 << 1) ++ ++/* Relocation flags for R_NDS32_RELAX_REGION_OMIT_FP_START/END. */ ++ ++/* OMIT_FP_FLAG marks the region for applying fp-as-gp ++ optimization. */ ++#define R_NDS32_RELAX_REGION_OMIT_FP_FLAG (1 << 0) ++/* NOT_OMIT_FP_FLAG is set if this region is not worth ++ for fp-as-gp. */ ++#define R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG (1 << 1) ++/* Suppress EX9 optimization in the region. */ ++#define R_NDS32_RELAX_REGION_NO_EX9_FLAG (1 << 2) ++/* A Innermost loop region. Some optimizations is suppressed ++ in this region due to performance drop. */ ++#define R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG (1 << 4) ++/* Suppress IFC optimization in the region. */ ++#define R_NDS32_RELAX_REGION_NO_IFC_FLAG (1 << 5) ++ ++/* Tag range for LOADSTORE relocation. */ ++enum ++{ ++ NDS32_LOADSTORE_NONE = 0x0, ++ NDS32_LOADSTORE_BYTE = 0x1, ++ NDS32_LOADSTORE_HALF = 0x2, ++ NDS32_LOADSTORE_WORD = 0x4, ++ NDS32_LOADSTORE_FLOAT_S = 0x8, ++ NDS32_LOADSTORE_FLOAT_D = 0x10, ++ NDS32_LOADSTORE_IMM = 0x20 ++}; ++ ++/* Relax tag for nds32_elf_relax_section, we have to specify which ++ optimization do in this round. */ ++enum ++{ ++ NDS32_RELAX_NONE_ROUND = 0, ++ NDS32_RELAX_NORMAL_ROUND, ++ NDS32_RELAX_JUMP_IFC_ROUND, ++ NDS32_RELAX_IFC_ROUND, ++ NDS32_RELAX_EX9_BUILD_ROUND, ++ NDS32_RELAX_EX9_REPLACE_ROUND, ++ NDS32_RELAX_EMPTY_ROUND ++}; ++ ++/* Security tag. */ ++enum ++{ ++ NDS32_SECURITY_NONE = 0, ++ NDS32_SECURITY_START, ++ NDS32_SECURITY_RESTART, ++ NDS32_SECURITY_END ++}; ++ ++/* There are two state in IFC optimization including general ifc (post-opt) ++ and jump ifc (j and jal). Therefore, we have to use two different mask to ++ distinguish them. */ ++/* Optimization status mask. */ ++#define NDS32_RELAX_JUMP_IFC_DONE (1 << 0) ++#define NDS32_RELAX_EX9_DONE (1 << 1) ++#define NDS32_RELAX_IFC_DONE (1 << 2) ++ ++/* Optimization turn on mask. */ ++#define NDS32_RELAX_IFC_ON (1 << 0) ++#define NDS32_RELAX_EX9_ON (1 << 1) ++ ++void nds32_insertion_sort ++ (void *base, size_t nmemb, size_t size, ++ int (*compar) (const void *lhs, const void *rhs)); ++ ++struct section_id_list_t ++{ ++ int id; ++ struct section_id_list_t *next; ++}; ++ ++struct section_id_list_t * ++ elf32_nds32_lookup_section_id (int id, struct section_id_list_t **lst_ptr); ++int elf32_nds32_check_relax_group (bfd *bfd, asection *sec); ++int elf32_nds32_unify_relax_group (bfd *abfd, asection *asec); ++int nds32_elf_unify_tls_model (bfd *inbfd, asection *insec, ++ bfd_byte *incontents, ++ struct bfd_link_info *lnkinfo); ++ ++void bfd_elf32_nds32_set_target_option (struct bfd_link_info *, int, int, ++ FILE *, int, int, int, int, FILE *, ++ FILE *, int, int, bfd_boolean, ++ bfd_boolean, bfd_boolean); ++void bfd_elf32_nds32_append_section (struct bfd_link_info*, bfd *, int); ++int nds32_convert_32_to_16 ++ (bfd *abfd, uint32_t insn, uint16_t *pinsn16, int *pinsn_type); ++int nds32_convert_16_to_32 (bfd *abfd, uint16_t insn16, uint32_t *pinsn); ++ ++#define nds32_elf_hash_table(info) \ ++ (elf_hash_table_id ((struct elf_link_hash_table *) ((info)->hash)) \ ++ == NDS32_ELF_DATA ? ((struct elf_nds32_link_hash_table *) ((info)->hash)) : NULL) ++ ++#define elf32_nds32_compute_jump_table_size(htab) \ ++ ((htab)->next_tls_desc_index * 4) ++ ++#define elf32_nds32_local_tlsdesc_gotent(bfd) \ ++ (elf_nds32_tdata (bfd)->local_tlsdesc_gotent) ++ ++/* Hash table structure for target nds32. There are some members to ++ save target options passed from nds32elf.em to bfd. */ ++ ++struct elf_nds32_link_hash_table ++{ ++ struct elf_link_hash_table root; ++ ++ /* ?? Short-cuts to get to dynamic linker sections. */ ++ asection *sdynbss; ++ asection *srelbss; ++ ++ /* Small local sym to section mapping cache. */ ++ struct sym_cache sym_cache; ++ ++ /* Target dependent options. */ ++ int relax_fp_as_gp; /* --mrelax-omit-fp */ ++ int eliminate_gc_relocs; /* --meliminate-gc-relocs */ ++ FILE *sym_ld_script; /* --mgen-symbol-ld-script= */ ++ /* Disable if linking a dynamically linked executable. */ ++ int load_store_relax; ++ int target_optimize; /* Switch optimization. */ ++ int relax_status; /* Finished optimization. */ ++ int relax_round; /* Going optimization. */ ++ FILE *ex9_export_file; /* --mexport-ex9= */ ++ FILE *ex9_import_file; /* --mimport-ex9= */ ++ int update_ex9_table; /* --mupdate-ex9. */ ++ int ex9_limit; ++ bfd_boolean ex9_loop_aware; /* Ignore ex9 if inside a loop. */ ++ bfd_boolean ifc_loop_aware; /* Ignore ifc if inside a loop. */ ++ bfd_boolean hyper_relax; /* Relax for symbol not in RW sections. */ ++ ++ /* The offset into splt of the PLT entry for the TLS descriptor ++ resolver. Special values are 0, if not necessary (or not found ++ to be necessary yet), and -1 if needed but not determined ++ yet. */ ++ bfd_vma dt_tlsdesc_plt; ++ ++ /* The offset into sgot of the GOT entry used by the PLT entry ++ above. */ ++ bfd_vma dt_tlsdesc_got; ++ ++ /* Offset in .plt section of tls_nds32_trampoline. */ ++ bfd_vma tls_trampoline; ++ ++ /* The index of the next unused R_NDS32_TLS_DESC slot in .rel.plt. */ ++ bfd_vma next_tls_desc_index; ++ ++ /* How many R_NDS32_TLS_DESC relocations were generated so far. */ ++ bfd_vma num_tls_desc; ++ ++ /* The amount of space used by the reserved portion of the sgotplt ++ section, plus whatever space is used by the jump slots. */ ++ bfd_vma sgotplt_jump_table_size; ++ ++ /* True if the target uses REL relocations. */ ++ int use_rel; ++}; ++#endif +diff -Nur binutils-2.24.orig/bfd/libbfd.c binutils-2.24/bfd/libbfd.c +--- binutils-2.24.orig/bfd/libbfd.c 2013-11-04 16:33:37.000000000 +0100 ++++ binutils-2.24/bfd/libbfd.c 2016-04-10 20:30:46.000000000 +0200 +@@ -550,11 +550,10 @@ + .*/ + + /* 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_int64_t) 1 << 63) ++#define COERCE16(x) (((bfd_vma) (x) ^ 0x8000) - 0x8000) ++#define COERCE32(x) (((bfd_vma) (x) ^ 0x80000000) - 0x80000000) + #define COERCE64(x) \ +- (((bfd_int64_t) (x) ^ EIGHT_GAZILLION) - EIGHT_GAZILLION) ++ (((bfd_uint64_t) (x) ^ ((bfd_uint64_t) 1 << 63)) - ((bfd_uint64_t) 1 << 63)) + + bfd_vma + bfd_getb16 (const void *p) +diff -Nur binutils-2.24.orig/bfd/libbfd.h binutils-2.24/bfd/libbfd.h +--- binutils-2.24.orig/bfd/libbfd.h 2013-11-18 09:40:15.000000000 +0100 ++++ binutils-2.24/bfd/libbfd.h 2016-04-10 20:30:46.000000000 +0200 +@@ -1746,6 +1746,141 @@ + "BFD_RELOC_M32R_GOTPC_HI_ULO", + "BFD_RELOC_M32R_GOTPC_HI_SLO", + "BFD_RELOC_M32R_GOTPC_LO", ++ "BFD_RELOC_NDS32_20", ++ "BFD_RELOC_NDS32_9_PCREL", ++ "BFD_RELOC_NDS32_WORD_9_PCREL", ++ "BFD_RELOC_NDS32_15_PCREL", ++ "BFD_RELOC_NDS32_17_PCREL", ++ "BFD_RELOC_NDS32_25_PCREL", ++ "BFD_RELOC_NDS32_HI20", ++ "BFD_RELOC_NDS32_LO12S3", ++ "BFD_RELOC_NDS32_LO12S2", ++ "BFD_RELOC_NDS32_LO12S1", ++ "BFD_RELOC_NDS32_LO12S0", ++ "BFD_RELOC_NDS32_LO12S0_ORI", ++ "BFD_RELOC_NDS32_SDA15S3", ++ "BFD_RELOC_NDS32_SDA15S2", ++ "BFD_RELOC_NDS32_SDA15S1", ++ "BFD_RELOC_NDS32_SDA15S0", ++ "BFD_RELOC_NDS32_SDA16S3", ++ "BFD_RELOC_NDS32_SDA17S2", ++ "BFD_RELOC_NDS32_SDA18S1", ++ "BFD_RELOC_NDS32_SDA19S0", ++ "BFD_RELOC_NDS32_SECURITY_16", ++ "BFD_RELOC_NDS32_GOT20", ++ "BFD_RELOC_NDS32_9_PLTREL", ++ "BFD_RELOC_NDS32_25_PLTREL", ++ "BFD_RELOC_NDS32_COPY", ++ "BFD_RELOC_NDS32_GLOB_DAT", ++ "BFD_RELOC_NDS32_JMP_SLOT", ++ "BFD_RELOC_NDS32_RELATIVE", ++ "BFD_RELOC_NDS32_GOTOFF", ++ "BFD_RELOC_NDS32_GOTOFF_HI20", ++ "BFD_RELOC_NDS32_GOTOFF_LO12", ++ "BFD_RELOC_NDS32_GOTPC20", ++ "BFD_RELOC_NDS32_GOT_HI20", ++ "BFD_RELOC_NDS32_GOT_LO12", ++ "BFD_RELOC_NDS32_GOTPC_HI20", ++ "BFD_RELOC_NDS32_GOTPC_LO12", ++ "BFD_RELOC_NDS32_INSN16", ++ "BFD_RELOC_NDS32_LABEL", ++ "BFD_RELOC_NDS32_LONGCALL1", ++ "BFD_RELOC_NDS32_LONGCALL2", ++ "BFD_RELOC_NDS32_LONGCALL3", ++ "BFD_RELOC_NDS32_LONGJUMP1", ++ "BFD_RELOC_NDS32_LONGJUMP2", ++ "BFD_RELOC_NDS32_LONGJUMP3", ++ "BFD_RELOC_NDS32_LOADSTORE", ++ "BFD_RELOC_NDS32_9_FIXED", ++ "BFD_RELOC_NDS32_15_FIXED", ++ "BFD_RELOC_NDS32_17_FIXED", ++ "BFD_RELOC_NDS32_25_FIXED", ++ "BFD_RELOC_NDS32_LONGCALL4", ++ "BFD_RELOC_NDS32_LONGCALL5", ++ "BFD_RELOC_NDS32_LONGCALL6", ++ "BFD_RELOC_NDS32_LONGJUMP4", ++ "BFD_RELOC_NDS32_LONGJUMP5", ++ "BFD_RELOC_NDS32_LONGJUMP6", ++ "BFD_RELOC_NDS32_LONGJUMP7", ++ "BFD_RELOC_NDS32_PLTREL_HI20", ++ "BFD_RELOC_NDS32_PLTREL_LO12", ++ "BFD_RELOC_NDS32_PLT_GOTREL_HI20", ++ "BFD_RELOC_NDS32_PLT_GOTREL_LO12", ++ "BFD_RELOC_NDS32_SDA12S2_DP", ++ "BFD_RELOC_NDS32_SDA12S2_SP", ++ "BFD_RELOC_NDS32_LO12S2_DP", ++ "BFD_RELOC_NDS32_LO12S2_SP", ++ "BFD_RELOC_NDS32_DWARF2_OP1", ++ "BFD_RELOC_NDS32_DWARF2_OP2", ++ "BFD_RELOC_NDS32_DWARF2_LEB", ++ "BFD_RELOC_NDS32_UPDATE_TA", ++ "BFD_RELOC_NDS32_PLT_GOTREL_LO20", ++ "BFD_RELOC_NDS32_PLT_GOTREL_LO15", ++ "BFD_RELOC_NDS32_PLT_GOTREL_LO19", ++ "BFD_RELOC_NDS32_GOT_LO15", ++ "BFD_RELOC_NDS32_GOT_LO19", ++ "BFD_RELOC_NDS32_GOTOFF_LO15", ++ "BFD_RELOC_NDS32_GOTOFF_LO19", ++ "BFD_RELOC_NDS32_GOT15S2", ++ "BFD_RELOC_NDS32_GOT17S2", ++ "BFD_RELOC_NDS32_5", ++ "BFD_RELOC_NDS32_10_UPCREL", ++ "BFD_RELOC_NDS32_SDA_FP7U2_RELA", ++ "BFD_RELOC_NDS32_RELAX_ENTRY", ++ "BFD_RELOC_NDS32_GOT_SUFF", ++ "BFD_RELOC_NDS32_GOTOFF_SUFF", ++ "BFD_RELOC_NDS32_PLT_GOT_SUFF", ++ "BFD_RELOC_NDS32_MULCALL_SUFF", ++ "BFD_RELOC_NDS32_PTR", ++ "BFD_RELOC_NDS32_PTR_COUNT", ++ "BFD_RELOC_NDS32_PTR_RESOLVED", ++ "BFD_RELOC_NDS32_PLTBLOCK", ++ "BFD_RELOC_NDS32_RELAX_REGION_BEGIN", ++ "BFD_RELOC_NDS32_RELAX_REGION_END", ++ "BFD_RELOC_NDS32_MINUEND", ++ "BFD_RELOC_NDS32_SUBTRAHEND", ++ "BFD_RELOC_NDS32_DIFF8", ++ "BFD_RELOC_NDS32_DIFF16", ++ "BFD_RELOC_NDS32_DIFF32", ++ "BFD_RELOC_NDS32_DIFF_ULEB128", ++ "BFD_RELOC_NDS32_EMPTY", ++ "BFD_RELOC_NDS32_25_ABS", ++ "BFD_RELOC_NDS32_DATA", ++ "BFD_RELOC_NDS32_TRAN", ++ "BFD_RELOC_NDS32_17IFC_PCREL", ++ "BFD_RELOC_NDS32_10IFCU_PCREL", ++ "BFD_RELOC_NDS32_TPOFF", ++ "BFD_RELOC_NDS32_GOTTPOFF", ++ "BFD_RELOC_NDS32_TLS_LE_HI20", ++ "BFD_RELOC_NDS32_TLS_LE_LO12", ++ "BFD_RELOC_NDS32_TLS_LE_20", ++ "BFD_RELOC_NDS32_TLS_LE_15S0", ++ "BFD_RELOC_NDS32_TLS_LE_15S1", ++ "BFD_RELOC_NDS32_TLS_LE_15S2", ++ "BFD_RELOC_NDS32_TLS_LE_ADD", ++ "BFD_RELOC_NDS32_TLS_LE_LS", ++ "BFD_RELOC_NDS32_TLS_IE_HI20", ++ "BFD_RELOC_NDS32_TLS_IE_LO12", ++ "BFD_RELOC_NDS32_TLS_IE_LO12S2", ++ "BFD_RELOC_NDS32_TLS_IEGP_HI20", ++ "BFD_RELOC_NDS32_TLS_IEGP_LO12", ++ "BFD_RELOC_NDS32_TLS_IEGP_LO12S2", ++ "BFD_RELOC_NDS32_TLS_IEGP_LW", ++ "BFD_RELOC_NDS32_TLS_DESC", ++ "BFD_RELOC_NDS32_TLS_DESC_HI20", ++ "BFD_RELOC_NDS32_TLS_DESC_LO12", ++ "BFD_RELOC_NDS32_TLS_DESC_20", ++ "BFD_RELOC_NDS32_TLS_DESC_SDA17S2", ++ "BFD_RELOC_NDS32_TLS_DESC_ADD", ++ "BFD_RELOC_NDS32_TLS_DESC_FUNC", ++ "BFD_RELOC_NDS32_TLS_DESC_CALL", ++ "BFD_RELOC_NDS32_TLS_DESC_MEM", ++ "BFD_RELOC_NDS32_REMOVE", ++ "BFD_RELOC_NDS32_GROUP", ++ "BFD_RELOC_NDS32_ICT", ++ "BFD_RELOC_NDS32_ICT_HI20", ++ "BFD_RELOC_NDS32_ICT_LO12", ++ "BFD_RELOC_NDS32_ICT_25PC", + "BFD_RELOC_V850_9_PCREL", + "BFD_RELOC_V850_22_PCREL", + "BFD_RELOC_V850_SDA_16_16_OFFSET", +diff -Nur binutils-2.24.orig/bfd/po/.cvsignore binutils-2.24/bfd/po/.cvsignore +--- binutils-2.24.orig/bfd/po/.cvsignore 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-2.24/bfd/po/.cvsignore 2016-04-10 20:30:46.000000000 +0200 +@@ -0,0 +1 @@ ++*.gmo +diff -Nur binutils-2.24.orig/bfd/reloc.c binutils-2.24/bfd/reloc.c +--- binutils-2.24.orig/bfd/reloc.c 2013-11-18 09:40:15.000000000 +0100 ++++ binutils-2.24/bfd/reloc.c 2016-04-10 20:30:46.000000000 +0200 +@@ -3839,6 +3839,366 @@ + + + ENUM ++ BFD_RELOC_NDS32_20 ++ENUMDOC ++ NDS32 relocs. ++ This is a 20 bit absolute address. ++ENUM ++ BFD_RELOC_NDS32_9_PCREL ++ENUMDOC ++ This is a 9-bit pc-relative reloc with the right 1 bit assumed to be 0. ++ENUM ++ BFD_RELOC_NDS32_WORD_9_PCREL ++ENUMDOC ++ This is a 9-bit pc-relative reloc with the right 1 bit assumed to be 0. ++ENUM ++ BFD_RELOC_NDS32_15_PCREL ++ENUMDOC ++ This is an 15-bit reloc with the right 1 bit assumed to be 0. ++ENUM ++ BFD_RELOC_NDS32_17_PCREL ++ENUMDOC ++ This is an 17-bit reloc with the right 1 bit assumed to be 0. ++ENUM ++ BFD_RELOC_NDS32_25_PCREL ++ENUMDOC ++ This is a 25-bit reloc with the right 1 bit assumed to be 0. ++ENUM ++ BFD_RELOC_NDS32_HI20 ++ENUMDOC ++ This is a 20-bit reloc containing the high 20 bits of an address ++ used with the lower 12 bits ++ENUM ++ BFD_RELOC_NDS32_LO12S3 ++ENUMDOC ++ This is a 12-bit reloc containing the lower 12 bits of an address ++ then shift right by 3. This is used with ldi,sdi... ++ENUM ++ BFD_RELOC_NDS32_LO12S2 ++ENUMDOC ++ This is a 12-bit reloc containing the lower 12 bits of an address ++ then shift left by 2. This is used with lwi,swi... ++ENUM ++ BFD_RELOC_NDS32_LO12S1 ++ENUMDOC ++ This is a 12-bit reloc containing the lower 12 bits of an address ++ then shift left by 1. This is used with lhi,shi... ++ENUM ++ BFD_RELOC_NDS32_LO12S0 ++ENUMDOC ++ This is a 12-bit reloc containing the lower 12 bits of an address ++ then shift left by 0. This is used with lbisbi... ++ENUM ++ BFD_RELOC_NDS32_LO12S0_ORI ++ENUMDOC ++ This is a 12-bit reloc containing the lower 12 bits of an address ++ then shift left by 0. This is only used with branch relaxations ++ENUM ++ BFD_RELOC_NDS32_SDA15S3 ++ENUMDOC ++ This is a 15-bit reloc containing the small data area 18-bit signed offset ++ and shift left by 3 for use in ldi, sdi... ++ENUM ++ BFD_RELOC_NDS32_SDA15S2 ++ENUMDOC ++ This is a 15-bit reloc containing the small data area 17-bit signed offset ++ and shift left by 2 for use in lwi, swi... ++ENUM ++ BFD_RELOC_NDS32_SDA15S1 ++ENUMDOC ++ This is a 15-bit reloc containing the small data area 16-bit signed offset ++ and shift left by 1 for use in lhi, shi... ++ENUM ++ BFD_RELOC_NDS32_SDA15S0 ++ENUMDOC ++ This is a 15-bit reloc containing the small data area 15-bit signed offset ++ and shift left by 0 for use in lbi, sbi... ++ENUM ++ BFD_RELOC_NDS32_SDA16S3 ++ENUMDOC ++ This is a 16-bit reloc containing the small data area 16-bit signed offset ++ and shift left by 3 ++ENUM ++ BFD_RELOC_NDS32_SDA17S2 ++ENUMDOC ++ This is a 17-bit reloc containing the small data area 17-bit signed offset ++ and shift left by 2 for use in lwi.gp, swi.gp... ++ENUM ++ BFD_RELOC_NDS32_SDA18S1 ++ENUMDOC ++ This is a 18-bit reloc containing the small data area 18-bit signed offset ++ and shift left by 1 for use in lhi.gp, shi.gp... ++ENUM ++ BFD_RELOC_NDS32_SDA19S0 ++ENUMDOC ++ This is a 19-bit reloc containing the small data area 19-bit signed offset ++ and shift left by 0 for use in lbi.gp, sbi.gp... ++ENUM ++ BFD_RELOC_NDS32_SECURITY_16 ++ENUMDOC ++ This is a 24-bit reloc for security check sum. ++ENUM ++ BFD_RELOC_NDS32_GOT20 ++ENUMX ++ BFD_RELOC_NDS32_9_PLTREL ++ENUMX ++ BFD_RELOC_NDS32_25_PLTREL ++ENUMX ++ BFD_RELOC_NDS32_COPY ++ENUMX ++ BFD_RELOC_NDS32_GLOB_DAT ++ENUMX ++ BFD_RELOC_NDS32_JMP_SLOT ++ENUMX ++ BFD_RELOC_NDS32_RELATIVE ++ENUMX ++ BFD_RELOC_NDS32_GOTOFF ++ENUMX ++ BFD_RELOC_NDS32_GOTOFF_HI20 ++ENUMX ++ BFD_RELOC_NDS32_GOTOFF_LO12 ++ENUMX ++ BFD_RELOC_NDS32_GOTPC20 ++ENUMX ++ BFD_RELOC_NDS32_GOT_HI20 ++ENUMX ++ BFD_RELOC_NDS32_GOT_LO12 ++ENUMX ++ BFD_RELOC_NDS32_GOTPC_HI20 ++ENUMX ++ BFD_RELOC_NDS32_GOTPC_LO12 ++ENUMDOC ++ for PIC ++ENUM ++ BFD_RELOC_NDS32_INSN16 ++ENUMX ++ BFD_RELOC_NDS32_LABEL ++ENUMX ++ BFD_RELOC_NDS32_LONGCALL1 ++ENUMX ++ BFD_RELOC_NDS32_LONGCALL2 ++ENUMX ++ BFD_RELOC_NDS32_LONGCALL3 ++ENUMX ++ BFD_RELOC_NDS32_LONGJUMP1 ++ENUMX ++ BFD_RELOC_NDS32_LONGJUMP2 ++ENUMX ++ BFD_RELOC_NDS32_LONGJUMP3 ++ENUMX ++ BFD_RELOC_NDS32_LOADSTORE ++ENUMX ++ BFD_RELOC_NDS32_9_FIXED ++ENUMX ++ BFD_RELOC_NDS32_15_FIXED ++ENUMX ++ BFD_RELOC_NDS32_17_FIXED ++ENUMX ++ BFD_RELOC_NDS32_25_FIXED ++ENUMX ++ BFD_RELOC_NDS32_LONGCALL4 ++ENUMX ++ BFD_RELOC_NDS32_LONGCALL5 ++ENUMX ++ BFD_RELOC_NDS32_LONGCALL6 ++ENUMX ++ BFD_RELOC_NDS32_LONGJUMP4 ++ENUMX ++ BFD_RELOC_NDS32_LONGJUMP5 ++ENUMX ++ BFD_RELOC_NDS32_LONGJUMP6 ++ENUMX ++ BFD_RELOC_NDS32_LONGJUMP7 ++ENUMDOC ++ for relax ++ENUM ++ BFD_RELOC_NDS32_PLTREL_HI20 ++ENUMX ++ BFD_RELOC_NDS32_PLTREL_LO12 ++ENUMX ++ BFD_RELOC_NDS32_PLT_GOTREL_HI20 ++ENUMX ++ BFD_RELOC_NDS32_PLT_GOTREL_LO12 ++ENUMDOC ++ for PIC ++ENUM ++ BFD_RELOC_NDS32_SDA12S2_DP ++ENUMX ++ BFD_RELOC_NDS32_SDA12S2_SP ++ENUMX ++ BFD_RELOC_NDS32_LO12S2_DP ++ENUMX ++ BFD_RELOC_NDS32_LO12S2_SP ++ENUMDOC ++ for floating point ++ENUM ++ BFD_RELOC_NDS32_DWARF2_OP1 ++ENUMX ++ BFD_RELOC_NDS32_DWARF2_OP2 ++ENUMX ++ BFD_RELOC_NDS32_DWARF2_LEB ++ENUMDOC ++ for dwarf2 debug_line. ++ENUM ++ BFD_RELOC_NDS32_UPDATE_TA ++ENUMDOC ++ for eliminate 16-bit instructions ++ENUM ++ BFD_RELOC_NDS32_PLT_GOTREL_LO20 ++ENUMX ++ BFD_RELOC_NDS32_PLT_GOTREL_LO15 ++ENUMX ++ BFD_RELOC_NDS32_PLT_GOTREL_LO19 ++ENUMX ++ BFD_RELOC_NDS32_GOT_LO15 ++ENUMX ++ BFD_RELOC_NDS32_GOT_LO19 ++ENUMX ++ BFD_RELOC_NDS32_GOTOFF_LO15 ++ENUMX ++ BFD_RELOC_NDS32_GOTOFF_LO19 ++ENUMX ++ BFD_RELOC_NDS32_GOT15S2 ++ENUMX ++ BFD_RELOC_NDS32_GOT17S2 ++ENUMDOC ++ for PIC object relaxation ++ENUM ++ BFD_RELOC_NDS32_5 ++ENUMDOC ++ NDS32 relocs. ++ This is a 5 bit absolute address. ++ENUM ++ BFD_RELOC_NDS32_10_UPCREL ++ENUMDOC ++ This is a 10-bit unsigned pc-relative reloc with the right 1 bit assumed to be 0. ++ENUM ++ BFD_RELOC_NDS32_SDA_FP7U2_RELA ++ENUMDOC ++ If fp were omitted, fp can used as another gp. ++ENUM ++ BFD_RELOC_NDS32_RELAX_ENTRY ++ENUMX ++ BFD_RELOC_NDS32_GOT_SUFF ++ENUMX ++ BFD_RELOC_NDS32_GOTOFF_SUFF ++ENUMX ++ BFD_RELOC_NDS32_PLT_GOT_SUFF ++ENUMX ++ BFD_RELOC_NDS32_MULCALL_SUFF ++ENUMX ++ BFD_RELOC_NDS32_PTR ++ENUMX ++ BFD_RELOC_NDS32_PTR_COUNT ++ENUMX ++ BFD_RELOC_NDS32_PTR_RESOLVED ++ENUMX ++ BFD_RELOC_NDS32_PLTBLOCK ++ENUMX ++ BFD_RELOC_NDS32_RELAX_REGION_BEGIN ++ENUMX ++ BFD_RELOC_NDS32_RELAX_REGION_END ++ENUMX ++ BFD_RELOC_NDS32_MINUEND ++ENUMX ++ BFD_RELOC_NDS32_SUBTRAHEND ++ENUMX ++ BFD_RELOC_NDS32_DIFF8 ++ENUMX ++ BFD_RELOC_NDS32_DIFF16 ++ENUMX ++ BFD_RELOC_NDS32_DIFF32 ++ENUMX ++ BFD_RELOC_NDS32_DIFF_ULEB128 ++ENUMX ++ BFD_RELOC_NDS32_EMPTY ++ENUMDOC ++ relaxation relative relocation types ++ENUM ++ BFD_RELOC_NDS32_25_ABS ++ENUMDOC ++ This is a 25 bit absolute address. ++ENUM ++ BFD_RELOC_NDS32_DATA ++ENUMX ++ BFD_RELOC_NDS32_TRAN ++ENUMX ++ BFD_RELOC_NDS32_17IFC_PCREL ++ENUMX ++ BFD_RELOC_NDS32_10IFCU_PCREL ++ENUMDOC ++ For ex9 and ifc using. ++ENUM ++ BFD_RELOC_NDS32_TPOFF ++ENUMX ++ BFD_RELOC_NDS32_GOTTPOFF ++ENUMX ++ BFD_RELOC_NDS32_TLS_LE_HI20 ++ENUMX ++ BFD_RELOC_NDS32_TLS_LE_LO12 ++ENUMX ++ BFD_RELOC_NDS32_TLS_LE_20 ++ENUMX ++ BFD_RELOC_NDS32_TLS_LE_15S0 ++ENUMX ++ BFD_RELOC_NDS32_TLS_LE_15S1 ++ENUMX ++ BFD_RELOC_NDS32_TLS_LE_15S2 ++ENUMX ++ BFD_RELOC_NDS32_TLS_LE_ADD ++ENUMX ++ BFD_RELOC_NDS32_TLS_LE_LS ++ENUMX ++ BFD_RELOC_NDS32_TLS_IE_HI20 ++ENUMX ++ BFD_RELOC_NDS32_TLS_IE_LO12 ++ENUMX ++ BFD_RELOC_NDS32_TLS_IE_LO12S2 ++ENUMX ++ BFD_RELOC_NDS32_TLS_IEGP_HI20 ++ENUMX ++ BFD_RELOC_NDS32_TLS_IEGP_LO12 ++ENUMX ++ BFD_RELOC_NDS32_TLS_IEGP_LO12S2 ++ENUMX ++ BFD_RELOC_NDS32_TLS_IEGP_LW ++ENUMX ++ BFD_RELOC_NDS32_TLS_DESC ++ENUMX ++ BFD_RELOC_NDS32_TLS_DESC_HI20 ++ENUMX ++ BFD_RELOC_NDS32_TLS_DESC_LO12 ++ENUMX ++ BFD_RELOC_NDS32_TLS_DESC_20 ++ENUMX ++ BFD_RELOC_NDS32_TLS_DESC_SDA17S2 ++ENUMX ++ BFD_RELOC_NDS32_TLS_DESC_ADD ++ENUMX ++ BFD_RELOC_NDS32_TLS_DESC_FUNC ++ENUMX ++ BFD_RELOC_NDS32_TLS_DESC_CALL ++ENUMX ++ BFD_RELOC_NDS32_TLS_DESC_MEM ++ENUMX ++ BFD_RELOC_NDS32_REMOVE ++ENUMX ++ BFD_RELOC_NDS32_GROUP ++ENUMDOC ++ For TLS. ++ ++ENUM ++ BFD_RELOC_NDS32_ICT ++ENUMX ++ BFD_RELOC_NDS32_ICT_HI20 ++ENUMX ++ BFD_RELOC_NDS32_ICT_LO12 ++ENUMX ++ BFD_RELOC_NDS32_ICT_25PC ++ENUMDOC ++ Jump-patch table relative relocations. ++ ++ENUM + BFD_RELOC_V850_9_PCREL + ENUMDOC + This is a 9-bit reloc +diff -Nur binutils-2.24.orig/bfd/section.c binutils-2.24/bfd/section.c +--- binutils-2.24.orig/bfd/section.c 2013-11-04 16:33:37.000000000 +0100 ++++ binutils-2.24/bfd/section.c 2016-04-10 20:30:46.000000000 +0200 +@@ -542,6 +542,32 @@ + . int size; + .}; + . ++.{* Note: the following are provided as inline functions rather than macros ++. because not all callers use the return value. A macro implementation ++. would use a comma expression, eg: "((ptr)->foo = val, TRUE)" and some ++. compilers will complain about comma expressions that have no effect. *} ++.static inline bfd_boolean ++.bfd_set_section_userdata (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, void * val) ++.{ ++. ptr->userdata = val; ++. return TRUE; ++.} ++. ++.static inline bfd_boolean ++.bfd_set_section_vma (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, bfd_vma val) ++.{ ++. ptr->vma = ptr->lma = val; ++. ptr->user_set_vma = TRUE; ++. return TRUE; ++.} ++. ++.static inline bfd_boolean ++.bfd_set_section_alignment (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, unsigned int val) ++.{ ++. ptr->alignment_power = val; ++. return TRUE; ++.} ++. + .{* 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. *} +diff -Nur binutils-2.24.orig/bfd/targets.c binutils-2.24/bfd/targets.c +--- binutils-2.24.orig/bfd/targets.c 2013-11-04 16:33:37.000000000 +0100 ++++ binutils-2.24/bfd/targets.c 2016-04-10 20:30:46.000000000 +0200 +@@ -673,6 +673,10 @@ + extern const bfd_target bfd_elf32_ntradlittlemips_vec; + extern const bfd_target bfd_elf32_ntradbigmips_freebsd_vec; + extern const bfd_target bfd_elf32_ntradlittlemips_freebsd_vec; ++extern const bfd_target bfd_elf32_nds32be_vec; ++extern const bfd_target bfd_elf32_nds32le_vec; ++extern const bfd_target bfd_elf32_nds32belin_vec; ++extern const bfd_target bfd_elf32_nds32lelin_vec; + extern const bfd_target bfd_elf32_openrisc_vec; + extern const bfd_target bfd_elf32_or32_big_vec; + extern const bfd_target bfd_elf32_pj_vec; +@@ -1061,6 +1065,10 @@ + &bfd_elf32_ntradbigmips_freebsd_vec, + &bfd_elf32_ntradlittlemips_freebsd_vec, + #endif ++ &bfd_elf32_nds32be_vec, ++ &bfd_elf32_nds32le_vec, ++ &bfd_elf32_nds32belin_vec, ++ &bfd_elf32_nds32lelin_vec, + &bfd_elf32_openrisc_vec, + &bfd_elf32_or32_big_vec, + &bfd_elf32_pj_vec, +diff -Nur binutils-2.24.orig/binutils/MAINTAINERS binutils-2.24/binutils/MAINTAINERS +--- binutils-2.24.orig/binutils/MAINTAINERS 2013-11-08 11:13:48.000000000 +0100 ++++ binutils-2.24/binutils/MAINTAINERS 2016-04-10 20:30:46.000000000 +0200 +@@ -109,6 +109,8 @@ + MN10300 Alexandre Oliva + Moxie Anthony Green + MSP430 Dmitry Diky ++ NDS32 Kuan-Lin Chen ++ NDS32 Wei-Cheng Wang + NetBSD support Matt Thomas + Nios II Sandra Loosemore + Nios II Andrew Jenner +diff -Nur binutils-2.24.orig/binutils/Makefile.am binutils-2.24/binutils/Makefile.am +--- binutils-2.24.orig/binutils/Makefile.am 2013-11-04 16:33:37.000000000 +0100 ++++ binutils-2.24/binutils/Makefile.am 2016-04-10 20:30:46.000000000 +0200 +@@ -241,7 +241,7 @@ + + objdump_SOURCES = objdump.c dwarf.c prdbg.c $(DEBUG_SRCS) $(BULIBS) $(ELFLIBS) + EXTRA_objdump_SOURCES = od-xcoff.c +-objdump_LDADD = $(OBJDUMP_PRIVATE_OFILES) $(OPCODES) $(BFDLIB) $(LIBIBERTY) $(LIBINTL) ++objdump_LDADD = $(OBJDUMP_PRIVATE_OFILES) $(OPCODES) $(BFDLIB) $(LIBIBERTY) $(LIBINTL) -ldl + + objdump.@OBJEXT@:objdump.c + if am__fastdepCC +diff -Nur binutils-2.24.orig/binutils/Makefile.in binutils-2.24/binutils/Makefile.in +--- binutils-2.24.orig/binutils/Makefile.in 2013-11-04 16:33:37.000000000 +0100 ++++ binutils-2.24/binutils/Makefile.in 2016-04-10 20:30:46.000000000 +0200 +@@ -581,7 +581,7 @@ + nm_new_SOURCES = nm.c $(BULIBS) + objdump_SOURCES = objdump.c dwarf.c prdbg.c $(DEBUG_SRCS) $(BULIBS) $(ELFLIBS) + EXTRA_objdump_SOURCES = od-xcoff.c +-objdump_LDADD = $(OBJDUMP_PRIVATE_OFILES) $(OPCODES) $(BFDLIB) $(LIBIBERTY) $(LIBINTL) ++objdump_LDADD = $(OBJDUMP_PRIVATE_OFILES) $(OPCODES) $(BFDLIB) $(LIBIBERTY) $(LIBINTL) -ldl + cxxfilt_SOURCES = cxxfilt.c $(BULIBS) + ar_SOURCES = arparse.y arlex.l ar.c not-ranlib.c arsup.c rename.c binemul.c \ + emul_$(EMULATION).c $(BULIBS) +diff -Nur binutils-2.24.orig/binutils/NEWS binutils-2.24/binutils/NEWS +--- binutils-2.24.orig/binutils/NEWS 2013-11-04 16:33:37.000000000 +0100 ++++ binutils-2.24/binutils/NEWS 2016-04-10 20:30:46.000000000 +0200 +@@ -1,5 +1,7 @@ + -*- text -*- + ++* Add support for the Andes NDS32. ++ + Changes in 2.24: + + * Objcopy now supports wildcard characters in command line options that take +diff -Nur binutils-2.24.orig/binutils/arlex.c binutils-2.24/binutils/arlex.c +--- binutils-2.24.orig/binutils/arlex.c 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/arlex.c 1970-01-01 01:00:00.000000000 +0100 +@@ -1,2036 +0,0 @@ +- +-#line 3 "arlex.c" +- +-#define YY_INT_ALIGNED short int +- +-/* A lexical scanner generated by flex */ +- +-#define FLEX_SCANNER +-#define YY_FLEX_MAJOR_VERSION 2 +-#define YY_FLEX_MINOR_VERSION 5 +-#define YY_FLEX_SUBMINOR_VERSION 35 +-#if YY_FLEX_SUBMINOR_VERSION > 0 +-#define FLEX_BETA +-#endif +- +-/* First, we deal with platform-specific or compiler-specific issues. */ +- +-/* begin standard C headers. */ +-#include +-#include +-#include +-#include +- +-/* end standard C headers. */ +- +-/* flex integer type definitions */ +- +-#ifndef FLEXINT_H +-#define FLEXINT_H +- +-/* C99 systems have . Non-C99 systems may or may not. */ +- +-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +- +-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, +- * if you want the limit (max/min) macros for int types. +- */ +-#ifndef __STDC_LIMIT_MACROS +-#define __STDC_LIMIT_MACROS 1 +-#endif +- +-#include +-typedef int8_t flex_int8_t; +-typedef uint8_t flex_uint8_t; +-typedef int16_t flex_int16_t; +-typedef uint16_t flex_uint16_t; +-typedef int32_t flex_int32_t; +-typedef uint32_t flex_uint32_t; +-typedef uint64_t flex_uint64_t; +-#else +-typedef signed char flex_int8_t; +-typedef short int flex_int16_t; +-typedef int flex_int32_t; +-typedef unsigned char flex_uint8_t; +-typedef unsigned short int flex_uint16_t; +-typedef unsigned int flex_uint32_t; +-#endif /* ! C99 */ +- +-/* Limits of integral types. */ +-#ifndef INT8_MIN +-#define INT8_MIN (-128) +-#endif +-#ifndef INT16_MIN +-#define INT16_MIN (-32767-1) +-#endif +-#ifndef INT32_MIN +-#define INT32_MIN (-2147483647-1) +-#endif +-#ifndef INT8_MAX +-#define INT8_MAX (127) +-#endif +-#ifndef INT16_MAX +-#define INT16_MAX (32767) +-#endif +-#ifndef INT32_MAX +-#define INT32_MAX (2147483647) +-#endif +-#ifndef UINT8_MAX +-#define UINT8_MAX (255U) +-#endif +-#ifndef UINT16_MAX +-#define UINT16_MAX (65535U) +-#endif +-#ifndef UINT32_MAX +-#define UINT32_MAX (4294967295U) +-#endif +- +-#endif /* ! FLEXINT_H */ +- +-#ifdef __cplusplus +- +-/* The "const" storage-class-modifier is valid. */ +-#define YY_USE_CONST +- +-#else /* ! __cplusplus */ +- +-/* C99 requires __STDC__ to be defined as 1. */ +-#if defined (__STDC__) +- +-#define YY_USE_CONST +- +-#endif /* defined (__STDC__) */ +-#endif /* ! __cplusplus */ +- +-#ifdef YY_USE_CONST +-#define yyconst const +-#else +-#define yyconst +-#endif +- +-/* Returned upon end-of-file. */ +-#define YY_NULL 0 +- +-/* Promotes a possibly negative, possibly signed char to an unsigned +- * integer for use as an array index. If the signed char is negative, +- * we want to instead treat it as an 8-bit unsigned char, hence the +- * double cast. +- */ +-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) +- +-/* Enter a start condition. This macro really ought to take a parameter, +- * but we do it the disgusting crufty way forced on us by the ()-less +- * definition of BEGIN. +- */ +-#define BEGIN (yy_start) = 1 + 2 * +- +-/* Translate the current start state into a value that can be later handed +- * to BEGIN to return to the state. The YYSTATE alias is for lex +- * compatibility. +- */ +-#define YY_START (((yy_start) - 1) / 2) +-#define YYSTATE YY_START +- +-/* Action number for EOF rule of a given start state. */ +-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +- +-/* Special action meaning "start processing a new file". */ +-#define YY_NEW_FILE yyrestart(yyin ) +- +-#define YY_END_OF_BUFFER_CHAR 0 +- +-/* Size of default input buffer. */ +-#ifndef YY_BUF_SIZE +-#define YY_BUF_SIZE 16384 +-#endif +- +-/* The state buf must be large enough to hold one state per character in the main buffer. +- */ +-#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) +- +-#ifndef YY_TYPEDEF_YY_BUFFER_STATE +-#define YY_TYPEDEF_YY_BUFFER_STATE +-typedef struct yy_buffer_state *YY_BUFFER_STATE; +-#endif +- +-#ifndef YY_TYPEDEF_YY_SIZE_T +-#define YY_TYPEDEF_YY_SIZE_T +-typedef size_t yy_size_t; +-#endif +- +-extern yy_size_t yyleng; +- +-extern FILE *yyin, *yyout; +- +-#define EOB_ACT_CONTINUE_SCAN 0 +-#define EOB_ACT_END_OF_FILE 1 +-#define EOB_ACT_LAST_MATCH 2 +- +- #define YY_LESS_LINENO(n) +- +-/* Return all but the first "n" matched characters back to the input stream. */ +-#define yyless(n) \ +- do \ +- { \ +- /* Undo effects of setting up yytext. */ \ +- int yyless_macro_arg = (n); \ +- YY_LESS_LINENO(yyless_macro_arg);\ +- *yy_cp = (yy_hold_char); \ +- YY_RESTORE_YY_MORE_OFFSET \ +- (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ +- YY_DO_BEFORE_ACTION; /* set up yytext again */ \ +- } \ +- while ( 0 ) +- +-#define unput(c) yyunput( c, (yytext_ptr) ) +- +-#ifndef YY_STRUCT_YY_BUFFER_STATE +-#define YY_STRUCT_YY_BUFFER_STATE +-struct yy_buffer_state +- { +- FILE *yy_input_file; +- +- char *yy_ch_buf; /* input buffer */ +- char *yy_buf_pos; /* current position in input buffer */ +- +- /* Size of input buffer in bytes, not including room for EOB +- * characters. +- */ +- yy_size_t yy_buf_size; +- +- /* Number of characters read into yy_ch_buf, not including EOB +- * characters. +- */ +- yy_size_t yy_n_chars; +- +- /* Whether we "own" the buffer - i.e., we know we created it, +- * and can realloc() it to grow it, and should free() it to +- * delete it. +- */ +- int yy_is_our_buffer; +- +- /* Whether this is an "interactive" input source; if so, and +- * if we're using stdio for input, then we want to use getc() +- * instead of fread(), to make sure we stop fetching input after +- * each newline. +- */ +- int yy_is_interactive; +- +- /* Whether we're considered to be at the beginning of a line. +- * If so, '^' rules will be active on the next match, otherwise +- * not. +- */ +- int yy_at_bol; +- +- int yy_bs_lineno; /**< The line count. */ +- int yy_bs_column; /**< The column count. */ +- +- /* Whether to try to fill the input buffer when we reach the +- * end of it. +- */ +- int yy_fill_buffer; +- +- int yy_buffer_status; +- +-#define YY_BUFFER_NEW 0 +-#define YY_BUFFER_NORMAL 1 +- /* When an EOF's been seen but there's still some text to process +- * then we mark the buffer as YY_EOF_PENDING, to indicate that we +- * shouldn't try reading from the input source any more. We might +- * still have a bunch of tokens to match, though, because of +- * possible backing-up. +- * +- * When we actually see the EOF, we change the status to "new" +- * (via yyrestart()), so that the user can continue scanning by +- * just pointing yyin at a new input file. +- */ +-#define YY_BUFFER_EOF_PENDING 2 +- +- }; +-#endif /* !YY_STRUCT_YY_BUFFER_STATE */ +- +-/* Stack of input buffers. */ +-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ +- +-/* We provide macros for accessing buffer states in case in the +- * future we want to put the buffer states in a more general +- * "scanner state". +- * +- * Returns the top of the stack, or NULL. +- */ +-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ +- ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ +- : NULL) +- +-/* Same as previous macro, but useful when we know that the buffer stack is not +- * NULL or when we need an lvalue. For internal use only. +- */ +-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] +- +-/* yy_hold_char holds the character lost when yytext is formed. */ +-static char yy_hold_char; +-static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ +-yy_size_t yyleng; +- +-/* Points to current character in buffer. */ +-static char *yy_c_buf_p = (char *) 0; +-static int yy_init = 0; /* whether we need to initialize */ +-static int yy_start = 0; /* start state number */ +- +-/* Flag which is used to allow yywrap()'s to do buffer switches +- * instead of setting up a fresh yyin. A bit of a hack ... +- */ +-static int yy_did_buffer_switch_on_eof; +- +-void yyrestart (FILE *input_file ); +-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +-void yy_delete_buffer (YY_BUFFER_STATE b ); +-void yy_flush_buffer (YY_BUFFER_STATE b ); +-void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +-void yypop_buffer_state (void ); +- +-static void yyensure_buffer_stack (void ); +-static void yy_load_buffer_state (void ); +-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); +- +-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) +- +-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); +- +-void *yyalloc (yy_size_t ); +-void *yyrealloc (void *,yy_size_t ); +-void yyfree (void * ); +- +-#define yy_new_buffer yy_create_buffer +- +-#define yy_set_interactive(is_interactive) \ +- { \ +- if ( ! YY_CURRENT_BUFFER ){ \ +- yyensure_buffer_stack (); \ +- YY_CURRENT_BUFFER_LVALUE = \ +- yy_create_buffer(yyin,YY_BUF_SIZE ); \ +- } \ +- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ +- } +- +-#define yy_set_bol(at_bol) \ +- { \ +- if ( ! YY_CURRENT_BUFFER ){\ +- yyensure_buffer_stack (); \ +- YY_CURRENT_BUFFER_LVALUE = \ +- yy_create_buffer(yyin,YY_BUF_SIZE ); \ +- } \ +- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ +- } +- +-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) +- +-/* Begin user sect3 */ +- +-typedef unsigned char YY_CHAR; +- +-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +- +-typedef int yy_state_type; +- +-extern int yylineno; +- +-int yylineno = 1; +- +-extern char *yytext; +-#define yytext_ptr yytext +- +-static yy_state_type yy_get_previous_state (void ); +-static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +-static int yy_get_next_buffer (void ); +-static void yy_fatal_error (yyconst char msg[] ); +- +-/* Done after the current pattern has been matched and before the +- * corresponding action - sets up yytext. +- */ +-#define YY_DO_BEFORE_ACTION \ +- (yytext_ptr) = yy_bp; \ +- yyleng = (yy_size_t) (yy_cp - yy_bp); \ +- (yy_hold_char) = *yy_cp; \ +- *yy_cp = '\0'; \ +- (yy_c_buf_p) = yy_cp; +- +-#define YY_NUM_RULES 40 +-#define YY_END_OF_BUFFER 41 +-/* This struct is not used in this scanner, +- but its presence is necessary. */ +-struct yy_trans_info +- { +- flex_int32_t yy_verify; +- flex_int32_t yy_nxt; +- }; +-static yyconst flex_int16_t yy_accept[177] = +- { 0, +- 0, 0, 41, 40, 39, 38, 35, 32, 33, 36, +- 40, 34, 37, 35, 35, 35, 35, 35, 35, 35, +- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +- 35, 35, 35, 35, 35, 35, 36, 31, 37, 35, +- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +- 35, 35, 7, 35, 35, 35, 35, 35, 35, 35, +- 35, 35, 35, 35, 35, 35, 22, 35, 35, 35, +- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +- +- 35, 35, 35, 10, 11, 12, 35, 15, 35, 35, +- 35, 35, 35, 35, 35, 35, 35, 25, 26, 27, +- 35, 30, 35, 35, 35, 3, 35, 35, 35, 35, +- 35, 35, 35, 35, 35, 18, 35, 35, 35, 35, +- 35, 35, 35, 1, 2, 4, 5, 35, 35, 35, +- 35, 35, 16, 17, 19, 20, 35, 35, 35, 35, +- 35, 35, 8, 9, 13, 14, 35, 23, 24, 28, +- 29, 35, 35, 6, 21, 0 +- } ; +- +-static yyconst flex_int32_t yy_ec[256] = +- { 0, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 3, 1, 1, 1, 4, 1, 1, 1, 5, +- 6, 7, 8, 9, 4, 4, 4, 4, 4, 4, +- 4, 4, 4, 4, 4, 4, 4, 4, 10, 1, +- 1, 1, 1, 1, 11, 12, 13, 14, 15, 16, +- 4, 17, 18, 4, 4, 19, 20, 21, 22, 23, +- 4, 24, 25, 26, 27, 28, 4, 29, 30, 4, +- 1, 4, 1, 1, 4, 1, 31, 32, 33, 34, +- +- 35, 36, 4, 37, 38, 4, 4, 39, 40, 41, +- 42, 43, 4, 44, 45, 46, 47, 48, 4, 49, +- 50, 4, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1 +- } ; +- +-static yyconst flex_int32_t yy_meta[51] = +- { 0, +- 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 +- } ; +- +-static yyconst flex_int16_t yy_base[180] = +- { 0, +- 0, 0, 193, 194, 194, 194, 0, 194, 194, 0, +- 190, 194, 0, 177, 32, 37, 32, 163, 174, 170, +- 164, 171, 174, 169, 149, 15, 22, 17, 135, 146, +- 142, 136, 143, 146, 141, 0, 0, 194, 0, 161, +- 159, 158, 153, 147, 156, 143, 149, 148, 141, 150, +- 141, 135, 138, 127, 125, 124, 119, 113, 122, 109, +- 115, 114, 107, 116, 107, 101, 104, 43, 136, 135, +- 130, 129, 0, 119, 123, 118, 114, 118, 119, 122, +- 124, 25, 104, 103, 98, 97, 0, 87, 91, 86, +- 82, 86, 87, 90, 92, 105, 100, 97, 94, 93, +- +- 105, 106, 102, 0, 0, 0, 104, 0, 92, 75, +- 70, 67, 64, 63, 75, 76, 72, 0, 0, 0, +- 74, 0, 62, 91, 88, 0, 86, 85, 73, 85, +- 79, 83, 70, 62, 59, 0, 57, 56, 44, 56, +- 50, 54, 41, 0, 0, 0, 0, 63, 58, 59, +- 67, 66, 0, 0, 0, 0, 38, 33, 34, 42, +- 41, 51, 0, 0, 0, 0, 30, 0, 0, 0, +- 0, 43, 21, 0, 0, 194, 65, 66, 69 +- } ; +- +-static yyconst flex_int16_t yy_def[180] = +- { 0, +- 176, 1, 176, 176, 176, 176, 177, 176, 176, 178, +- 176, 176, 179, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 177, 178, 176, 179, 177, +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +- 177, 177, 177, 177, 177, 0, 176, 176, 176 +- } ; +- +-static yyconst flex_int16_t yy_nxt[245] = +- { 0, +- 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, +- 14, 7, 15, 16, 17, 18, 19, 7, 20, 7, +- 7, 21, 7, 22, 23, 7, 7, 24, 7, 7, +- 25, 7, 26, 27, 28, 29, 30, 7, 31, 7, +- 7, 32, 7, 33, 34, 7, 7, 35, 7, 7, +- 41, 43, 45, 55, 44, 42, 57, 59, 56, 58, +- 46, 96, 97, 110, 111, 60, 37, 36, 37, 39, +- 175, 39, 174, 173, 172, 171, 170, 169, 168, 167, +- 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, +- 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, +- +- 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, +- 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, +- 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, +- 116, 115, 114, 113, 112, 109, 108, 107, 106, 105, +- 104, 103, 102, 101, 100, 99, 98, 95, 94, 93, +- 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, +- 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, +- 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, +- 62, 61, 54, 53, 52, 51, 50, 49, 48, 47, +- 40, 38, 176, 3, 176, 176, 176, 176, 176, 176, +- +- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +- 176, 176, 176, 176 +- } ; +- +-static yyconst flex_int16_t yy_chk[245] = +- { 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, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 15, 16, 17, 26, 16, 15, 27, 28, 26, 27, +- 17, 68, 68, 82, 82, 28, 178, 177, 178, 179, +- 173, 179, 172, 167, 162, 161, 160, 159, 158, 157, +- 152, 151, 150, 149, 148, 143, 142, 141, 140, 139, +- 138, 137, 135, 134, 133, 132, 131, 130, 129, 128, +- +- 127, 125, 124, 123, 121, 117, 116, 115, 114, 113, +- 112, 111, 110, 109, 107, 103, 102, 101, 100, 99, +- 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, +- 88, 86, 85, 84, 83, 81, 80, 79, 78, 77, +- 76, 75, 74, 72, 71, 70, 69, 67, 66, 65, +- 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, +- 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, +- 44, 43, 42, 41, 40, 35, 34, 33, 32, 31, +- 30, 29, 25, 24, 23, 22, 21, 20, 19, 18, +- 14, 11, 3, 176, 176, 176, 176, 176, 176, 176, +- +- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +- 176, 176, 176, 176 +- } ; +- +-static yy_state_type yy_last_accepting_state; +-static char *yy_last_accepting_cpos; +- +-extern int yy_flex_debug; +-int yy_flex_debug = 0; +- +-/* The intent behind this definition is that it'll catch +- * any uses of REJECT which flex missed. +- */ +-#define REJECT reject_used_but_not_detected +-#define yymore() yymore_used_but_not_detected +-#define YY_MORE_ADJ 0 +-#define YY_RESTORE_YY_MORE_OFFSET +-char *yytext; +-#line 1 "arlex.l" +-#define YY_NO_INPUT 1 +-#line 4 "arlex.l" +-/* arlex.l - Strange script language lexer */ +- +-/* Copyright 1992, 1997, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2011 +- Free Software Foundation, Inc. +- +- 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 3 of the License, or +- (at your option) any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +- MA 02110-1301, USA. */ +- +- +-/* Contributed by Steve Chamberlain . */ +- +-#define DONTDECLARE_MALLOC +-#include "ansidecl.h" +-#include "libiberty.h" +-#include "arparse.h" +- +-#ifndef YY_NO_UNPUT +-#define YY_NO_UNPUT +-#endif +- +-extern int yylex (void); +- +-int linenumber; +-#line 599 "arlex.c" +- +-#define INITIAL 0 +- +-#ifndef YY_NO_UNISTD_H +-/* Special case for "unistd.h", since it is non-ANSI. We include it way +- * down here because we want the user's section 1 to have been scanned first. +- * The user has a chance to override it with an option. +- */ +-#include +-#endif +- +-#ifndef YY_EXTRA_TYPE +-#define YY_EXTRA_TYPE void * +-#endif +- +-static int yy_init_globals (void ); +- +-/* Accessor methods to globals. +- These are made visible to non-reentrant scanners for convenience. */ +- +-int yylex_destroy (void ); +- +-int yyget_debug (void ); +- +-void yyset_debug (int debug_flag ); +- +-YY_EXTRA_TYPE yyget_extra (void ); +- +-void yyset_extra (YY_EXTRA_TYPE user_defined ); +- +-FILE *yyget_in (void ); +- +-void yyset_in (FILE * in_str ); +- +-FILE *yyget_out (void ); +- +-void yyset_out (FILE * out_str ); +- +-yy_size_t yyget_leng (void ); +- +-char *yyget_text (void ); +- +-int yyget_lineno (void ); +- +-void yyset_lineno (int line_number ); +- +-/* Macros after this point can all be overridden by user definitions in +- * section 1. +- */ +- +-#ifndef YY_SKIP_YYWRAP +-#ifdef __cplusplus +-extern "C" int yywrap (void ); +-#else +-extern int yywrap (void ); +-#endif +-#endif +- +-#ifndef yytext_ptr +-static void yy_flex_strncpy (char *,yyconst char *,int ); +-#endif +- +-#ifdef YY_NEED_STRLEN +-static int yy_flex_strlen (yyconst char * ); +-#endif +- +-#ifndef YY_NO_INPUT +- +-#ifdef __cplusplus +-static int yyinput (void ); +-#else +-static int input (void ); +-#endif +- +-#endif +- +-/* Amount of stuff to slurp up with each read. */ +-#ifndef YY_READ_BUF_SIZE +-#define YY_READ_BUF_SIZE 8192 +-#endif +- +-/* Copy whatever the last rule matched to the standard output. */ +-#ifndef ECHO +-/* This used to be an fputs(), but since the string might contain NUL's, +- * we now use fwrite(). +- */ +-#define ECHO fwrite( yytext, yyleng, 1, yyout ) +-#endif +- +-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, +- * is returned in "result". +- */ +-#ifndef YY_INPUT +-#define YY_INPUT(buf,result,max_size) \ +- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ +- { \ +- int c = '*'; \ +- yy_size_t n; \ +- for ( n = 0; n < max_size && \ +- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ +- buf[n] = (char) c; \ +- if ( c == '\n' ) \ +- buf[n++] = (char) c; \ +- if ( c == EOF && ferror( yyin ) ) \ +- YY_FATAL_ERROR( "input in flex scanner failed" ); \ +- result = n; \ +- } \ +- else \ +- { \ +- errno=0; \ +- while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ +- { \ +- if( errno != EINTR) \ +- { \ +- YY_FATAL_ERROR( "input in flex scanner failed" ); \ +- break; \ +- } \ +- errno=0; \ +- clearerr(yyin); \ +- } \ +- }\ +-\ +- +-#endif +- +-/* No semi-colon after return; correct usage is to write "yyterminate();" - +- * we don't want an extra ';' after the "return" because that will cause +- * some compilers to complain about unreachable statements. +- */ +-#ifndef yyterminate +-#define yyterminate() return YY_NULL +-#endif +- +-/* Number of entries by which start-condition stack grows. */ +-#ifndef YY_START_STACK_INCR +-#define YY_START_STACK_INCR 25 +-#endif +- +-/* Report a fatal error. */ +-#ifndef YY_FATAL_ERROR +-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +-#endif +- +-/* end tables serialization structures and prototypes */ +- +-/* Default declaration of generated scanner - a define so the user can +- * easily add parameters. +- */ +-#ifndef YY_DECL +-#define YY_DECL_IS_OURS 1 +- +-extern int yylex (void); +- +-#define YY_DECL int yylex (void) +-#endif /* !YY_DECL */ +- +-/* Code executed at the beginning of each rule, after yytext and yyleng +- * have been set up. +- */ +-#ifndef YY_USER_ACTION +-#define YY_USER_ACTION +-#endif +- +-/* Code executed at the end of each rule. */ +-#ifndef YY_BREAK +-#define YY_BREAK break; +-#endif +- +-#define YY_RULE_SETUP \ +- YY_USER_ACTION +- +-/** The main scanner function which does all the work. +- */ +-YY_DECL +-{ +- register yy_state_type yy_current_state; +- register char *yy_cp, *yy_bp; +- register int yy_act; +- +-#line 46 "arlex.l" +- +- +-#line 782 "arlex.c" +- +- if ( !(yy_init) ) +- { +- (yy_init) = 1; +- +-#ifdef YY_USER_INIT +- YY_USER_INIT; +-#endif +- +- if ( ! (yy_start) ) +- (yy_start) = 1; /* first start state */ +- +- if ( ! yyin ) +- yyin = stdin; +- +- if ( ! yyout ) +- yyout = stdout; +- +- if ( ! YY_CURRENT_BUFFER ) { +- yyensure_buffer_stack (); +- YY_CURRENT_BUFFER_LVALUE = +- yy_create_buffer(yyin,YY_BUF_SIZE ); +- } +- +- yy_load_buffer_state( ); +- } +- +- while ( 1 ) /* loops until end-of-file is reached */ +- { +- yy_cp = (yy_c_buf_p); +- +- /* Support of yytext. */ +- *yy_cp = (yy_hold_char); +- +- /* yy_bp points to the position in yy_ch_buf of the start of +- * the current run. +- */ +- yy_bp = yy_cp; +- +- yy_current_state = (yy_start); +-yy_match: +- do +- { +- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; +- if ( yy_accept[yy_current_state] ) +- { +- (yy_last_accepting_state) = yy_current_state; +- (yy_last_accepting_cpos) = yy_cp; +- } +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 177 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- ++yy_cp; +- } +- while ( yy_base[yy_current_state] != 194 ); +- +-yy_find_action: +- yy_act = yy_accept[yy_current_state]; +- if ( yy_act == 0 ) +- { /* have to back up */ +- yy_cp = (yy_last_accepting_cpos); +- yy_current_state = (yy_last_accepting_state); +- yy_act = yy_accept[yy_current_state]; +- } +- +- YY_DO_BEFORE_ACTION; +- +-do_action: /* This label is used only to access EOF actions. */ +- +- switch ( yy_act ) +- { /* beginning of action switch */ +- case 0: /* must back up */ +- /* undo the effects of YY_DO_BEFORE_ACTION */ +- *yy_cp = (yy_hold_char); +- yy_cp = (yy_last_accepting_cpos); +- yy_current_state = (yy_last_accepting_state); +- goto yy_find_action; +- +-case 1: +-YY_RULE_SETUP +-#line 48 "arlex.l" +-{ return ADDLIB; } +- YY_BREAK +-case 2: +-YY_RULE_SETUP +-#line 49 "arlex.l" +-{ return ADDMOD; } +- YY_BREAK +-case 3: +-YY_RULE_SETUP +-#line 50 "arlex.l" +-{ return CLEAR; } +- YY_BREAK +-case 4: +-YY_RULE_SETUP +-#line 51 "arlex.l" +-{ return CREATE; } +- YY_BREAK +-case 5: +-YY_RULE_SETUP +-#line 52 "arlex.l" +-{ return DELETE; } +- YY_BREAK +-case 6: +-YY_RULE_SETUP +-#line 53 "arlex.l" +-{ return DIRECTORY; } +- YY_BREAK +-case 7: +-YY_RULE_SETUP +-#line 54 "arlex.l" +-{ return END; } +- YY_BREAK +-case 8: +-YY_RULE_SETUP +-#line 55 "arlex.l" +-{ return EXTRACT; } +- YY_BREAK +-case 9: +-YY_RULE_SETUP +-#line 56 "arlex.l" +-{ return FULLDIR; } +- YY_BREAK +-case 10: +-YY_RULE_SETUP +-#line 57 "arlex.l" +-{ return HELP; } +- YY_BREAK +-case 11: +-YY_RULE_SETUP +-#line 58 "arlex.l" +-{ return LIST; } +- YY_BREAK +-case 12: +-YY_RULE_SETUP +-#line 59 "arlex.l" +-{ return OPEN; } +- YY_BREAK +-case 13: +-YY_RULE_SETUP +-#line 60 "arlex.l" +-{ return REPLACE; } +- YY_BREAK +-case 14: +-YY_RULE_SETUP +-#line 61 "arlex.l" +-{ return VERBOSE; } +- YY_BREAK +-case 15: +-YY_RULE_SETUP +-#line 62 "arlex.l" +-{ return SAVE; } +- YY_BREAK +-case 16: +-YY_RULE_SETUP +-#line 63 "arlex.l" +-{ return ADDLIB; } +- YY_BREAK +-case 17: +-YY_RULE_SETUP +-#line 64 "arlex.l" +-{ return ADDMOD; } +- YY_BREAK +-case 18: +-YY_RULE_SETUP +-#line 65 "arlex.l" +-{ return CLEAR; } +- YY_BREAK +-case 19: +-YY_RULE_SETUP +-#line 66 "arlex.l" +-{ return CREATE; } +- YY_BREAK +-case 20: +-YY_RULE_SETUP +-#line 67 "arlex.l" +-{ return DELETE; } +- YY_BREAK +-case 21: +-YY_RULE_SETUP +-#line 68 "arlex.l" +-{ return DIRECTORY; } +- YY_BREAK +-case 22: +-YY_RULE_SETUP +-#line 69 "arlex.l" +-{ return END; } +- YY_BREAK +-case 23: +-YY_RULE_SETUP +-#line 70 "arlex.l" +-{ return EXTRACT; } +- YY_BREAK +-case 24: +-YY_RULE_SETUP +-#line 71 "arlex.l" +-{ return FULLDIR; } +- YY_BREAK +-case 25: +-YY_RULE_SETUP +-#line 72 "arlex.l" +-{ return HELP; } +- YY_BREAK +-case 26: +-YY_RULE_SETUP +-#line 73 "arlex.l" +-{ return LIST; } +- YY_BREAK +-case 27: +-YY_RULE_SETUP +-#line 74 "arlex.l" +-{ return OPEN; } +- YY_BREAK +-case 28: +-YY_RULE_SETUP +-#line 75 "arlex.l" +-{ return REPLACE; } +- YY_BREAK +-case 29: +-YY_RULE_SETUP +-#line 76 "arlex.l" +-{ return VERBOSE; } +- YY_BREAK +-case 30: +-YY_RULE_SETUP +-#line 77 "arlex.l" +-{ return SAVE; } +- YY_BREAK +-case 31: +-/* rule 31 can match eol */ +-YY_RULE_SETUP +-#line 78 "arlex.l" +-{ linenumber ++; } +- YY_BREAK +-case 32: +-YY_RULE_SETUP +-#line 79 "arlex.l" +-{ return '('; } +- YY_BREAK +-case 33: +-YY_RULE_SETUP +-#line 80 "arlex.l" +-{ return ')'; } +- YY_BREAK +-case 34: +-YY_RULE_SETUP +-#line 81 "arlex.l" +-{ return ','; } +- YY_BREAK +-case 35: +-YY_RULE_SETUP +-#line 82 "arlex.l" +-{ +- yylval.name = xstrdup (yytext); +- return FILENAME; +- } +- YY_BREAK +-case 36: +-YY_RULE_SETUP +-#line 86 "arlex.l" +-{ } +- YY_BREAK +-case 37: +-YY_RULE_SETUP +-#line 87 "arlex.l" +-{ } +- YY_BREAK +-case 38: +-YY_RULE_SETUP +-#line 88 "arlex.l" +-{ } +- YY_BREAK +-case 39: +-/* rule 39 can match eol */ +-YY_RULE_SETUP +-#line 89 "arlex.l" +-{ linenumber ++; return NEWLINE; } +- YY_BREAK +-case 40: +-YY_RULE_SETUP +-#line 91 "arlex.l" +-ECHO; +- YY_BREAK +-#line 1070 "arlex.c" +-case YY_STATE_EOF(INITIAL): +- yyterminate(); +- +- case YY_END_OF_BUFFER: +- { +- /* Amount of text matched not including the EOB char. */ +- int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; +- +- /* Undo the effects of YY_DO_BEFORE_ACTION. */ +- *yy_cp = (yy_hold_char); +- YY_RESTORE_YY_MORE_OFFSET +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) +- { +- /* We're scanning a new file or input source. It's +- * possible that this happened because the user +- * just pointed yyin at a new source and called +- * yylex(). If so, then we have to assure +- * consistency between YY_CURRENT_BUFFER and our +- * globals. Here is the right place to do so, because +- * this is the first action (other than possibly a +- * back-up) that will match for the new input source. +- */ +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; +- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; +- } +- +- /* Note that here we test for yy_c_buf_p "<=" to the position +- * of the first EOB in the buffer, since yy_c_buf_p will +- * already have been incremented past the NUL character +- * (since all states make transitions on EOB to the +- * end-of-buffer state). Contrast this with the test +- * in input(). +- */ +- if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) +- { /* This was really a NUL. */ +- yy_state_type yy_next_state; +- +- (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; +- +- yy_current_state = yy_get_previous_state( ); +- +- /* Okay, we're now positioned to make the NUL +- * transition. We couldn't have +- * yy_get_previous_state() go ahead and do it +- * for us because it doesn't know how to deal +- * with the possibility of jamming (and we don't +- * want to build jamming into it because then it +- * will run more slowly). +- */ +- +- yy_next_state = yy_try_NUL_trans( yy_current_state ); +- +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- +- if ( yy_next_state ) +- { +- /* Consume the NUL. */ +- yy_cp = ++(yy_c_buf_p); +- yy_current_state = yy_next_state; +- goto yy_match; +- } +- +- else +- { +- yy_cp = (yy_c_buf_p); +- goto yy_find_action; +- } +- } +- +- else switch ( yy_get_next_buffer( ) ) +- { +- case EOB_ACT_END_OF_FILE: +- { +- (yy_did_buffer_switch_on_eof) = 0; +- +- if ( yywrap( ) ) +- { +- /* Note: because we've taken care in +- * yy_get_next_buffer() to have set up +- * yytext, we can now set up +- * yy_c_buf_p so that if some total +- * hoser (like flex itself) wants to +- * call the scanner after we return the +- * YY_NULL, it'll still work - another +- * YY_NULL will get returned. +- */ +- (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; +- +- yy_act = YY_STATE_EOF(YY_START); +- goto do_action; +- } +- +- else +- { +- if ( ! (yy_did_buffer_switch_on_eof) ) +- YY_NEW_FILE; +- } +- break; +- } +- +- case EOB_ACT_CONTINUE_SCAN: +- (yy_c_buf_p) = +- (yytext_ptr) + yy_amount_of_matched_text; +- +- yy_current_state = yy_get_previous_state( ); +- +- yy_cp = (yy_c_buf_p); +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- goto yy_match; +- +- case EOB_ACT_LAST_MATCH: +- (yy_c_buf_p) = +- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; +- +- yy_current_state = yy_get_previous_state( ); +- +- yy_cp = (yy_c_buf_p); +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- goto yy_find_action; +- } +- break; +- } +- +- default: +- YY_FATAL_ERROR( +- "fatal flex scanner internal error--no action found" ); +- } /* end of action switch */ +- } /* end of scanning one token */ +-} /* end of yylex */ +- +-/* yy_get_next_buffer - try to read in a new buffer +- * +- * Returns a code representing an action: +- * EOB_ACT_LAST_MATCH - +- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position +- * EOB_ACT_END_OF_FILE - end of file +- */ +-static int yy_get_next_buffer (void) +-{ +- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; +- register char *source = (yytext_ptr); +- register int number_to_move, i; +- int ret_val; +- +- if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) +- YY_FATAL_ERROR( +- "fatal flex scanner internal error--end of buffer missed" ); +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) +- { /* Don't try to fill the buffer, so this is an EOF. */ +- if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) +- { +- /* We matched a single character, the EOB, so +- * treat this as a final EOF. +- */ +- return EOB_ACT_END_OF_FILE; +- } +- +- else +- { +- /* We matched some text prior to the EOB, first +- * process it. +- */ +- return EOB_ACT_LAST_MATCH; +- } +- } +- +- /* Try to read more data. */ +- +- /* First move last chars to start of buffer. */ +- number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; +- +- for ( i = 0; i < number_to_move; ++i ) +- *(dest++) = *(source++); +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) +- /* don't do the read, it's not guaranteed to return an EOF, +- * just force an EOF +- */ +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; +- +- else +- { +- yy_size_t num_to_read = +- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; +- +- while ( num_to_read <= 0 ) +- { /* Not enough room in the buffer - grow it. */ +- +- /* just a shorter name for the current buffer */ +- YY_BUFFER_STATE b = YY_CURRENT_BUFFER; +- +- int yy_c_buf_p_offset = +- (int) ((yy_c_buf_p) - b->yy_ch_buf); +- +- if ( b->yy_is_our_buffer ) +- { +- yy_size_t new_size = b->yy_buf_size * 2; +- +- if ( new_size <= 0 ) +- b->yy_buf_size += b->yy_buf_size / 8; +- else +- b->yy_buf_size *= 2; +- +- b->yy_ch_buf = (char *) +- /* Include room in for 2 EOB chars. */ +- yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); +- } +- else +- /* Can't grow it, we don't own it. */ +- b->yy_ch_buf = 0; +- +- if ( ! b->yy_ch_buf ) +- YY_FATAL_ERROR( +- "fatal error - scanner input buffer overflow" ); +- +- (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; +- +- num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - +- number_to_move - 1; +- +- } +- +- if ( num_to_read > YY_READ_BUF_SIZE ) +- num_to_read = YY_READ_BUF_SIZE; +- +- /* Read in more data. */ +- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), +- (yy_n_chars), num_to_read ); +- +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- if ( (yy_n_chars) == 0 ) +- { +- if ( number_to_move == YY_MORE_ADJ ) +- { +- ret_val = EOB_ACT_END_OF_FILE; +- yyrestart(yyin ); +- } +- +- else +- { +- ret_val = EOB_ACT_LAST_MATCH; +- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = +- YY_BUFFER_EOF_PENDING; +- } +- } +- +- else +- ret_val = EOB_ACT_CONTINUE_SCAN; +- +- if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { +- /* Extend the array by 50%, plus the number we really need. */ +- yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); +- if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); +- } +- +- (yy_n_chars) += number_to_move; +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; +- +- (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; +- +- return ret_val; +-} +- +-/* yy_get_previous_state - get the state just before the EOB char was reached */ +- +- static yy_state_type yy_get_previous_state (void) +-{ +- register yy_state_type yy_current_state; +- register char *yy_cp; +- +- yy_current_state = (yy_start); +- +- for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) +- { +- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); +- if ( yy_accept[yy_current_state] ) +- { +- (yy_last_accepting_state) = yy_current_state; +- (yy_last_accepting_cpos) = yy_cp; +- } +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 177 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- } +- +- return yy_current_state; +-} +- +-/* yy_try_NUL_trans - try to make a transition on the NUL character +- * +- * synopsis +- * next_state = yy_try_NUL_trans( current_state ); +- */ +- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +-{ +- register int yy_is_jam; +- register char *yy_cp = (yy_c_buf_p); +- +- register YY_CHAR yy_c = 1; +- if ( yy_accept[yy_current_state] ) +- { +- (yy_last_accepting_state) = yy_current_state; +- (yy_last_accepting_cpos) = yy_cp; +- } +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 177 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- yy_is_jam = (yy_current_state == 176); +- +- return yy_is_jam ? 0 : yy_current_state; +-} +- +-#ifndef YY_NO_INPUT +-#ifdef __cplusplus +- static int yyinput (void) +-#else +- static int input (void) +-#endif +- +-{ +- int c; +- +- *(yy_c_buf_p) = (yy_hold_char); +- +- if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) +- { +- /* yy_c_buf_p now points to the character we want to return. +- * If this occurs *before* the EOB characters, then it's a +- * valid NUL; if not, then we've hit the end of the buffer. +- */ +- if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) +- /* This was really a NUL. */ +- *(yy_c_buf_p) = '\0'; +- +- else +- { /* need more input */ +- yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); +- ++(yy_c_buf_p); +- +- switch ( yy_get_next_buffer( ) ) +- { +- case EOB_ACT_LAST_MATCH: +- /* This happens because yy_g_n_b() +- * sees that we've accumulated a +- * token and flags that we need to +- * try matching the token before +- * proceeding. But for input(), +- * there's no matching to consider. +- * So convert the EOB_ACT_LAST_MATCH +- * to EOB_ACT_END_OF_FILE. +- */ +- +- /* Reset buffer status. */ +- yyrestart(yyin ); +- +- /*FALLTHROUGH*/ +- +- case EOB_ACT_END_OF_FILE: +- { +- if ( yywrap( ) ) +- return 0; +- +- if ( ! (yy_did_buffer_switch_on_eof) ) +- YY_NEW_FILE; +-#ifdef __cplusplus +- return yyinput(); +-#else +- return input(); +-#endif +- } +- +- case EOB_ACT_CONTINUE_SCAN: +- (yy_c_buf_p) = (yytext_ptr) + offset; +- break; +- } +- } +- } +- +- c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ +- *(yy_c_buf_p) = '\0'; /* preserve yytext */ +- (yy_hold_char) = *++(yy_c_buf_p); +- +- return c; +-} +-#endif /* ifndef YY_NO_INPUT */ +- +-/** Immediately switch to a different input stream. +- * @param input_file A readable stream. +- * +- * @note This function does not reset the start condition to @c INITIAL . +- */ +- void yyrestart (FILE * input_file ) +-{ +- +- if ( ! YY_CURRENT_BUFFER ){ +- yyensure_buffer_stack (); +- YY_CURRENT_BUFFER_LVALUE = +- yy_create_buffer(yyin,YY_BUF_SIZE ); +- } +- +- yy_init_buffer(YY_CURRENT_BUFFER,input_file ); +- yy_load_buffer_state( ); +-} +- +-/** Switch to a different input buffer. +- * @param new_buffer The new input buffer. +- * +- */ +- void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +-{ +- +- /* TODO. We should be able to replace this entire function body +- * with +- * yypop_buffer_state(); +- * yypush_buffer_state(new_buffer); +- */ +- yyensure_buffer_stack (); +- if ( YY_CURRENT_BUFFER == new_buffer ) +- return; +- +- if ( YY_CURRENT_BUFFER ) +- { +- /* Flush out information for old buffer. */ +- *(yy_c_buf_p) = (yy_hold_char); +- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- YY_CURRENT_BUFFER_LVALUE = new_buffer; +- yy_load_buffer_state( ); +- +- /* We don't actually know whether we did this switch during +- * EOF (yywrap()) processing, but the only time this flag +- * is looked at is after yywrap() is called, so it's safe +- * to go ahead and always set it. +- */ +- (yy_did_buffer_switch_on_eof) = 1; +-} +- +-static void yy_load_buffer_state (void) +-{ +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +- (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; +- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; +- (yy_hold_char) = *(yy_c_buf_p); +-} +- +-/** Allocate and initialize an input buffer state. +- * @param file A readable stream. +- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. +- * +- * @return the allocated buffer state. +- */ +- YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +-{ +- YY_BUFFER_STATE b; +- +- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); +- if ( ! b ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); +- +- b->yy_buf_size = size; +- +- /* yy_ch_buf has to be 2 characters longer than the size given because +- * we need to put in 2 end-of-buffer characters. +- */ +- b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); +- if ( ! b->yy_ch_buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); +- +- b->yy_is_our_buffer = 1; +- +- yy_init_buffer(b,file ); +- +- return b; +-} +- +-/** Destroy the buffer. +- * @param b a buffer created with yy_create_buffer() +- * +- */ +- void yy_delete_buffer (YY_BUFFER_STATE b ) +-{ +- +- if ( ! b ) +- return; +- +- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ +- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; +- +- if ( b->yy_is_our_buffer ) +- yyfree((void *) b->yy_ch_buf ); +- +- yyfree((void *) b ); +-} +- +-#ifndef __cplusplus +-extern int isatty (int ); +-#endif /* __cplusplus */ +- +-/* Initializes or reinitializes a buffer. +- * This function is sometimes called more than once on the same buffer, +- * such as during a yyrestart() or at EOF. +- */ +- static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) +- +-{ +- int oerrno = errno; +- +- yy_flush_buffer(b ); +- +- b->yy_input_file = file; +- b->yy_fill_buffer = 1; +- +- /* If b is the current buffer, then yy_init_buffer was _probably_ +- * called from yyrestart() or through yy_get_next_buffer. +- * In that case, we don't want to reset the lineno or column. +- */ +- if (b != YY_CURRENT_BUFFER){ +- b->yy_bs_lineno = 1; +- b->yy_bs_column = 0; +- } +- +- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +- +- errno = oerrno; +-} +- +-/** Discard all buffered characters. On the next scan, YY_INPUT will be called. +- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. +- * +- */ +- void yy_flush_buffer (YY_BUFFER_STATE b ) +-{ +- if ( ! b ) +- return; +- +- b->yy_n_chars = 0; +- +- /* We always need two end-of-buffer characters. The first causes +- * a transition to the end-of-buffer state. The second causes +- * a jam in that state. +- */ +- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; +- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; +- +- b->yy_buf_pos = &b->yy_ch_buf[0]; +- +- b->yy_at_bol = 1; +- b->yy_buffer_status = YY_BUFFER_NEW; +- +- if ( b == YY_CURRENT_BUFFER ) +- yy_load_buffer_state( ); +-} +- +-/** Pushes the new state onto the stack. The new state becomes +- * the current state. This function will allocate the stack +- * if necessary. +- * @param new_buffer The new state. +- * +- */ +-void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +-{ +- if (new_buffer == NULL) +- return; +- +- yyensure_buffer_stack(); +- +- /* This block is copied from yy_switch_to_buffer. */ +- if ( YY_CURRENT_BUFFER ) +- { +- /* Flush out information for old buffer. */ +- *(yy_c_buf_p) = (yy_hold_char); +- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- /* Only push if top exists. Otherwise, replace top. */ +- if (YY_CURRENT_BUFFER) +- (yy_buffer_stack_top)++; +- YY_CURRENT_BUFFER_LVALUE = new_buffer; +- +- /* copied from yy_switch_to_buffer. */ +- yy_load_buffer_state( ); +- (yy_did_buffer_switch_on_eof) = 1; +-} +- +-/** Removes and deletes the top of the stack, if present. +- * The next element becomes the new top. +- * +- */ +-void yypop_buffer_state (void) +-{ +- if (!YY_CURRENT_BUFFER) +- return; +- +- yy_delete_buffer(YY_CURRENT_BUFFER ); +- YY_CURRENT_BUFFER_LVALUE = NULL; +- if ((yy_buffer_stack_top) > 0) +- --(yy_buffer_stack_top); +- +- if (YY_CURRENT_BUFFER) { +- yy_load_buffer_state( ); +- (yy_did_buffer_switch_on_eof) = 1; +- } +-} +- +-/* Allocates the stack if it does not exist. +- * Guarantees space for at least one push. +- */ +-static void yyensure_buffer_stack (void) +-{ +- yy_size_t num_to_alloc; +- +- if (!(yy_buffer_stack)) { +- +- /* First allocation is just for 2 elements, since we don't know if this +- * scanner will even need a stack. We use 2 instead of 1 to avoid an +- * immediate realloc on the next call. +- */ +- num_to_alloc = 1; +- (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc +- (num_to_alloc * sizeof(struct yy_buffer_state*) +- ); +- if ( ! (yy_buffer_stack) ) +- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); +- +- memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); +- +- (yy_buffer_stack_max) = num_to_alloc; +- (yy_buffer_stack_top) = 0; +- return; +- } +- +- if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ +- +- /* Increase the buffer to prepare for a possible push. */ +- int grow_size = 8 /* arbitrary grow size */; +- +- num_to_alloc = (yy_buffer_stack_max) + grow_size; +- (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc +- ((yy_buffer_stack), +- num_to_alloc * sizeof(struct yy_buffer_state*) +- ); +- if ( ! (yy_buffer_stack) ) +- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); +- +- /* zero only the new slots.*/ +- memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); +- (yy_buffer_stack_max) = num_to_alloc; +- } +-} +- +-/** Setup the input buffer state to scan directly from a user-specified character buffer. +- * @param base the character buffer +- * @param size the size in bytes of the character buffer +- * +- * @return the newly allocated buffer state object. +- */ +-YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +-{ +- YY_BUFFER_STATE b; +- +- if ( size < 2 || +- base[size-2] != YY_END_OF_BUFFER_CHAR || +- base[size-1] != YY_END_OF_BUFFER_CHAR ) +- /* They forgot to leave room for the EOB's. */ +- return 0; +- +- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); +- if ( ! b ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); +- +- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ +- b->yy_buf_pos = b->yy_ch_buf = base; +- b->yy_is_our_buffer = 0; +- b->yy_input_file = 0; +- b->yy_n_chars = b->yy_buf_size; +- b->yy_is_interactive = 0; +- b->yy_at_bol = 1; +- b->yy_fill_buffer = 0; +- b->yy_buffer_status = YY_BUFFER_NEW; +- +- yy_switch_to_buffer(b ); +- +- return b; +-} +- +-/** Setup the input buffer state to scan a string. The next call to yylex() will +- * scan from a @e copy of @a str. +- * @param yystr a NUL-terminated string to scan +- * +- * @return the newly allocated buffer state object. +- * @note If you want to scan bytes that may contain NUL values, then use +- * yy_scan_bytes() instead. +- */ +-YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) +-{ +- +- return yy_scan_bytes(yystr,strlen(yystr) ); +-} +- +-/** Setup the input buffer state to scan the given bytes. The next call to yylex() will +- * scan from a @e copy of @a bytes. +- * @param bytes the byte buffer to scan +- * @param len the number of bytes in the buffer pointed to by @a bytes. +- * +- * @return the newly allocated buffer state object. +- */ +-YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) +-{ +- YY_BUFFER_STATE b; +- char *buf; +- yy_size_t n, i; +- +- /* Get memory for full buffer, including space for trailing EOB's. */ +- n = _yybytes_len + 2; +- buf = (char *) yyalloc(n ); +- if ( ! buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); +- +- for ( i = 0; i < _yybytes_len; ++i ) +- buf[i] = yybytes[i]; +- +- buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; +- +- b = yy_scan_buffer(buf,n ); +- if ( ! b ) +- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); +- +- /* It's okay to grow etc. this buffer, and we should throw it +- * away when we're done. +- */ +- b->yy_is_our_buffer = 1; +- +- return b; +-} +- +-#ifndef YY_EXIT_FAILURE +-#define YY_EXIT_FAILURE 2 +-#endif +- +-static void yy_fatal_error (yyconst char* msg ) +-{ +- (void) fprintf( stderr, "%s\n", msg ); +- exit( YY_EXIT_FAILURE ); +-} +- +-/* Redefine yyless() so it works in section 3 code. */ +- +-#undef yyless +-#define yyless(n) \ +- do \ +- { \ +- /* Undo effects of setting up yytext. */ \ +- int yyless_macro_arg = (n); \ +- YY_LESS_LINENO(yyless_macro_arg);\ +- yytext[yyleng] = (yy_hold_char); \ +- (yy_c_buf_p) = yytext + yyless_macro_arg; \ +- (yy_hold_char) = *(yy_c_buf_p); \ +- *(yy_c_buf_p) = '\0'; \ +- yyleng = yyless_macro_arg; \ +- } \ +- while ( 0 ) +- +-/* Accessor methods (get/set functions) to struct members. */ +- +-/** Get the current line number. +- * +- */ +-int yyget_lineno (void) +-{ +- +- return yylineno; +-} +- +-/** Get the input stream. +- * +- */ +-FILE *yyget_in (void) +-{ +- return yyin; +-} +- +-/** Get the output stream. +- * +- */ +-FILE *yyget_out (void) +-{ +- return yyout; +-} +- +-/** Get the length of the current token. +- * +- */ +-yy_size_t yyget_leng (void) +-{ +- return yyleng; +-} +- +-/** Get the current token. +- * +- */ +- +-char *yyget_text (void) +-{ +- return yytext; +-} +- +-/** Set the current line number. +- * @param line_number +- * +- */ +-void yyset_lineno (int line_number ) +-{ +- +- yylineno = line_number; +-} +- +-/** Set the input stream. This does not discard the current +- * input buffer. +- * @param in_str A readable stream. +- * +- * @see yy_switch_to_buffer +- */ +-void yyset_in (FILE * in_str ) +-{ +- yyin = in_str ; +-} +- +-void yyset_out (FILE * out_str ) +-{ +- yyout = out_str ; +-} +- +-int yyget_debug (void) +-{ +- return yy_flex_debug; +-} +- +-void yyset_debug (int bdebug ) +-{ +- yy_flex_debug = bdebug ; +-} +- +-static int yy_init_globals (void) +-{ +- /* Initialization is the same as for the non-reentrant scanner. +- * This function is called from yylex_destroy(), so don't allocate here. +- */ +- +- (yy_buffer_stack) = 0; +- (yy_buffer_stack_top) = 0; +- (yy_buffer_stack_max) = 0; +- (yy_c_buf_p) = (char *) 0; +- (yy_init) = 0; +- (yy_start) = 0; +- +-/* Defined in main.c */ +-#ifdef YY_STDINIT +- yyin = stdin; +- yyout = stdout; +-#else +- yyin = (FILE *) 0; +- yyout = (FILE *) 0; +-#endif +- +- /* For future reference: Set errno on error, since we are called by +- * yylex_init() +- */ +- return 0; +-} +- +-/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +-int yylex_destroy (void) +-{ +- +- /* Pop the buffer stack, destroying each element. */ +- while(YY_CURRENT_BUFFER){ +- yy_delete_buffer(YY_CURRENT_BUFFER ); +- YY_CURRENT_BUFFER_LVALUE = NULL; +- yypop_buffer_state(); +- } +- +- /* Destroy the stack itself. */ +- yyfree((yy_buffer_stack) ); +- (yy_buffer_stack) = NULL; +- +- /* Reset the globals. This is important in a non-reentrant scanner so the next time +- * yylex() is called, initialization will occur. */ +- yy_init_globals( ); +- +- return 0; +-} +- +-/* +- * Internal utility routines. +- */ +- +-#ifndef yytext_ptr +-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +-{ +- register int i; +- for ( i = 0; i < n; ++i ) +- s1[i] = s2[i]; +-} +-#endif +- +-#ifdef YY_NEED_STRLEN +-static int yy_flex_strlen (yyconst char * s ) +-{ +- register int n; +- for ( n = 0; s[n]; ++n ) +- ; +- +- return n; +-} +-#endif +- +-void *yyalloc (yy_size_t size ) +-{ +- return (void *) malloc( size ); +-} +- +-void *yyrealloc (void * ptr, yy_size_t size ) +-{ +- /* The cast to (char *) in the following accommodates both +- * implementations that use char* generic pointers, and those +- * that use void* generic pointers. It works with the latter +- * because both ANSI C and C++ allow castless assignment from +- * any pointer type to void*, and deal with argument conversions +- * as though doing an assignment. +- */ +- return (void *) realloc( (char *) ptr, size ); +-} +- +-void yyfree (void * ptr ) +-{ +- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +-} +- +-#define YYTABLES_NAME "yytables" +- +-#line 91 "arlex.l" +- +- +-#ifndef yywrap +-/* Needed for lex, though not flex. */ +-int yywrap(void) { return 1; } +-#endif +- +diff -Nur binutils-2.24.orig/binutils/arparse.c binutils-2.24/binutils/arparse.c +--- binutils-2.24.orig/binutils/arparse.c 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/arparse.c 1970-01-01 01:00:00.000000000 +0100 +@@ -1,1770 +0,0 @@ +-/* A Bison parser, made by GNU Bison 2.3. */ +- +-/* Skeleton implementation for Bison's Yacc-like parsers in C +- +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +- 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., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. */ +- +-/* As a special exception, you may create a larger work that contains +- part or all of the Bison parser skeleton and distribute that work +- under terms of your choice, so long as that work isn't itself a +- parser generator using the skeleton or a modified version thereof +- as a parser skeleton. Alternatively, if you modify or redistribute +- the parser skeleton itself, you may (at your option) remove this +- special exception, which will cause the skeleton and the resulting +- Bison output files to be licensed under the GNU General Public +- License without this special exception. +- +- This special exception was added by the Free Software Foundation in +- version 2.2 of Bison. */ +- +-/* C LALR(1) parser skeleton written by Richard Stallman, by +- simplifying the original so-called "semantic" parser. */ +- +-/* All symbols defined below should begin with yy or YY, to avoid +- infringing on user name space. This should be done even for local +- variables, as they might otherwise be expanded by user macros. +- There are some unavoidable exceptions within include files to +- define necessary library symbols; they are noted "INFRINGES ON +- USER NAME SPACE" below. */ +- +-/* Identify Bison output. */ +-#define YYBISON 1 +- +-/* Bison version. */ +-#define YYBISON_VERSION "2.3" +- +-/* Skeleton name. */ +-#define YYSKELETON_NAME "yacc.c" +- +-/* Pure parsers. */ +-#define YYPURE 0 +- +-/* Using locations. */ +-#define YYLSP_NEEDED 0 +- +- +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- NEWLINE = 258, +- VERBOSE = 259, +- FILENAME = 260, +- ADDLIB = 261, +- LIST = 262, +- ADDMOD = 263, +- CLEAR = 264, +- CREATE = 265, +- DELETE = 266, +- DIRECTORY = 267, +- END = 268, +- EXTRACT = 269, +- FULLDIR = 270, +- HELP = 271, +- QUIT = 272, +- REPLACE = 273, +- SAVE = 274, +- OPEN = 275 +- }; +-#endif +-/* Tokens. */ +-#define NEWLINE 258 +-#define VERBOSE 259 +-#define FILENAME 260 +-#define ADDLIB 261 +-#define LIST 262 +-#define ADDMOD 263 +-#define CLEAR 264 +-#define CREATE 265 +-#define DELETE 266 +-#define DIRECTORY 267 +-#define END 268 +-#define EXTRACT 269 +-#define FULLDIR 270 +-#define HELP 271 +-#define QUIT 272 +-#define REPLACE 273 +-#define SAVE 274 +-#define OPEN 275 +- +- +- +- +-/* Copy the first part of user declarations. */ +-#line 1 "arparse.y" +- +-/* arparse.y - Stange script language parser */ +- +-/* Copyright 1992, 1993, 1995, 1997, 1999, 2002, 2003, 2005, 2007 +- Free Software Foundation, Inc. +- +- 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 3 of the License, or +- (at your option) any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +- MA 02110-1301, USA. */ +- +- +-/* Contributed by Steve Chamberlain +- sac@cygnus.com +- +-*/ +-#define DONTDECLARE_MALLOC +-#include "sysdep.h" +-#include "bfd.h" +-#include "arsup.h" +-extern int verbose; +-extern int yylex (void); +-static int yyerror (const char *); +- +- +-/* Enabling traces. */ +-#ifndef YYDEBUG +-# define YYDEBUG 0 +-#endif +- +-/* Enabling verbose error messages. */ +-#ifdef YYERROR_VERBOSE +-# undef YYERROR_VERBOSE +-# define YYERROR_VERBOSE 1 +-#else +-# define YYERROR_VERBOSE 0 +-#endif +- +-/* Enabling the token table. */ +-#ifndef YYTOKEN_TABLE +-# define YYTOKEN_TABLE 0 +-#endif +- +-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +-typedef union YYSTYPE +-#line 38 "arparse.y" +-{ +- char *name; +-struct list *list ; +- +-} +-/* Line 193 of yacc.c. */ +-#line 179 "arparse.c" +- YYSTYPE; +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +- +- +-/* Copy the second part of user declarations. */ +- +- +-/* Line 216 of yacc.c. */ +-#line 192 "arparse.c" +- +-#ifdef short +-# undef short +-#endif +- +-#ifdef YYTYPE_UINT8 +-typedef YYTYPE_UINT8 yytype_uint8; +-#else +-typedef unsigned char yytype_uint8; +-#endif +- +-#ifdef YYTYPE_INT8 +-typedef YYTYPE_INT8 yytype_int8; +-#elif (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-typedef signed char yytype_int8; +-#else +-typedef short int yytype_int8; +-#endif +- +-#ifdef YYTYPE_UINT16 +-typedef YYTYPE_UINT16 yytype_uint16; +-#else +-typedef unsigned short int yytype_uint16; +-#endif +- +-#ifdef YYTYPE_INT16 +-typedef YYTYPE_INT16 yytype_int16; +-#else +-typedef short int yytype_int16; +-#endif +- +-#ifndef YYSIZE_T +-# ifdef __SIZE_TYPE__ +-# define YYSIZE_T __SIZE_TYPE__ +-# elif defined size_t +-# define YYSIZE_T size_t +-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYSIZE_T size_t +-# else +-# define YYSIZE_T unsigned int +-# endif +-#endif +- +-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) +- +-#ifndef YY_ +-# if defined YYENABLE_NLS && YYENABLE_NLS +-# if ENABLE_NLS +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YY_(msgid) dgettext ("bison-runtime", msgid) +-# endif +-# endif +-# ifndef YY_ +-# define YY_(msgid) msgid +-# endif +-#endif +- +-/* Suppress unused-variable warnings by "using" E. */ +-#if ! defined lint || defined __GNUC__ +-# define YYUSE(e) ((void) (e)) +-#else +-# define YYUSE(e) /* empty */ +-#endif +- +-/* Identity function, used to suppress warnings about constant conditions. */ +-#ifndef lint +-# define YYID(n) (n) +-#else +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static int +-YYID (int i) +-#else +-static int +-YYID (i) +- int i; +-#endif +-{ +- return i; +-} +-#endif +- +-#if ! defined yyoverflow || YYERROR_VERBOSE +- +-/* The parser invokes alloca or malloc; define the necessary symbols. */ +- +-# ifdef YYSTACK_USE_ALLOCA +-# if YYSTACK_USE_ALLOCA +-# ifdef __GNUC__ +-# define YYSTACK_ALLOC __builtin_alloca +-# elif defined __BUILTIN_VA_ARG_INCR +-# include /* INFRINGES ON USER NAME SPACE */ +-# elif defined _AIX +-# define YYSTACK_ALLOC __alloca +-# elif defined _MSC_VER +-# include /* INFRINGES ON USER NAME SPACE */ +-# define alloca _alloca +-# else +-# define YYSTACK_ALLOC alloca +-# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-# include /* INFRINGES ON USER NAME SPACE */ +-# ifndef _STDLIB_H +-# define _STDLIB_H 1 +-# endif +-# endif +-# endif +-# endif +-# endif +- +-# ifdef YYSTACK_ALLOC +- /* Pacify GCC's `empty if-body' warning. */ +-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +-# ifndef YYSTACK_ALLOC_MAXIMUM +- /* The OS might guarantee only one guard page at the bottom of the stack, +- and a page size can be as small as 4096 bytes. So we cannot safely +- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number +- to allow for a few compiler-allocated temporary stack slots. */ +-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +-# endif +-# else +-# define YYSTACK_ALLOC YYMALLOC +-# define YYSTACK_FREE YYFREE +-# ifndef YYSTACK_ALLOC_MAXIMUM +-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +-# endif +-# if (defined __cplusplus && ! defined _STDLIB_H \ +- && ! ((defined YYMALLOC || defined malloc) \ +- && (defined YYFREE || defined free))) +-# include /* INFRINGES ON USER NAME SPACE */ +-# ifndef _STDLIB_H +-# define _STDLIB_H 1 +-# endif +-# endif +-# ifndef YYMALLOC +-# define YYMALLOC malloc +-# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +-# endif +-# endif +-# ifndef YYFREE +-# define YYFREE free +-# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-void free (void *); /* INFRINGES ON USER NAME SPACE */ +-# endif +-# endif +-# endif +-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ +- +- +-#if (! defined yyoverflow \ +- && (! defined __cplusplus \ +- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) +- +-/* A type that is properly aligned for any stack member. */ +-union yyalloc +-{ +- yytype_int16 yyss; +- YYSTYPE yyvs; +- }; +- +-/* The size of the maximum gap between one aligned stack and the next. */ +-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +- +-/* The size of an array large to enough to hold all stacks, each with +- N elements. */ +-# define YYSTACK_BYTES(N) \ +- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ +- + YYSTACK_GAP_MAXIMUM) +- +-/* Copy COUNT objects from FROM to TO. The source and destination do +- not overlap. */ +-# ifndef YYCOPY +-# if defined __GNUC__ && 1 < __GNUC__ +-# define YYCOPY(To, From, Count) \ +- __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +-# else +-# define YYCOPY(To, From, Count) \ +- do \ +- { \ +- YYSIZE_T yyi; \ +- for (yyi = 0; yyi < (Count); yyi++) \ +- (To)[yyi] = (From)[yyi]; \ +- } \ +- while (YYID (0)) +-# endif +-# endif +- +-/* Relocate STACK from its old location to the new one. The +- local variables YYSIZE and YYSTACKSIZE give the old and new number of +- elements in the stack, and YYPTR gives the new location of the +- stack. Advance YYPTR to a properly aligned location for the next +- stack. */ +-# define YYSTACK_RELOCATE(Stack) \ +- do \ +- { \ +- YYSIZE_T yynewbytes; \ +- YYCOPY (&yyptr->Stack, Stack, yysize); \ +- Stack = &yyptr->Stack; \ +- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ +- yyptr += yynewbytes / sizeof (*yyptr); \ +- } \ +- while (YYID (0)) +- +-#endif +- +-/* YYFINAL -- State number of the termination state. */ +-#define YYFINAL 3 +-/* YYLAST -- Last index in YYTABLE. */ +-#define YYLAST 34 +- +-/* YYNTOKENS -- Number of terminals. */ +-#define YYNTOKENS 24 +-/* YYNNTS -- Number of nonterminals. */ +-#define YYNNTS 22 +-/* YYNRULES -- Number of rules. */ +-#define YYNRULES 42 +-/* YYNRULES -- Number of states. */ +-#define YYNSTATES 53 +- +-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +-#define YYUNDEFTOK 2 +-#define YYMAXUTOK 275 +- +-#define YYTRANSLATE(YYX) \ +- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) +- +-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +-static const yytype_uint8 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, 2, 2, 2, +- 21, 22, 2, 2, 23, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 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 +-}; +- +-#if YYDEBUG +-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in +- YYRHS. */ +-static const yytype_uint8 yyprhs[] = +-{ +- 0, 0, 3, 4, 7, 10, 11, 14, 16, 18, +- 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, +- 40, 42, 44, 45, 48, 51, 53, 56, 59, 61, +- 63, 66, 69, 73, 78, 80, 81, 85, 86, 90, +- 91, 93, 94 +-}; +- +-/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +-static const yytype_int8 yyrhs[] = +-{ +- 25, 0, -1, -1, 26, 27, -1, 27, 28, -1, +- -1, 29, 3, -1, 37, -1, 38, -1, 45, -1, +- 40, -1, 39, -1, 32, -1, 34, -1, 36, -1, +- 30, -1, 31, -1, 33, -1, 35, -1, 13, -1, +- 1, -1, 5, -1, -1, 14, 43, -1, 18, 43, +- -1, 9, -1, 11, 43, -1, 8, 43, -1, 7, +- -1, 19, -1, 20, 5, -1, 10, 5, -1, 6, +- 5, 42, -1, 12, 5, 42, 41, -1, 5, -1, +- -1, 21, 43, 22, -1, -1, 43, 44, 5, -1, +- -1, 23, -1, -1, 4, -1 +-}; +- +-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +-static const yytype_uint8 yyrline[] = +-{ +- 0, 69, 69, 69, 73, 74, 78, 82, 83, 84, +- 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, +- 95, 96, 97, 102, 107, 112, 117, 121, 126, 131, +- 138, 143, 149, 153, 160, 162, 166, 169, 173, 179, +- 184, 185, 190 +-}; +-#endif +- +-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +- First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +-static const char *const yytname[] = +-{ +- "$end", "error", "$undefined", "NEWLINE", "VERBOSE", "FILENAME", +- "ADDLIB", "LIST", "ADDMOD", "CLEAR", "CREATE", "DELETE", "DIRECTORY", +- "END", "EXTRACT", "FULLDIR", "HELP", "QUIT", "REPLACE", "SAVE", "OPEN", +- "'('", "')'", "','", "$accept", "start", "@1", "session", "command_line", +- "command", "extract_command", "replace_command", "clear_command", +- "delete_command", "addmod_command", "list_command", "save_command", +- "open_command", "create_command", "addlib_command", "directory_command", +- "optional_filename", "modulelist", "modulename", "optcomma", +- "verbose_command", 0 +-}; +-#endif +- +-# ifdef YYPRINT +-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to +- token YYLEX-NUM. */ +-static const yytype_uint16 yytoknum[] = +-{ +- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, +- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, +- 275, 40, 41, 44 +-}; +-# endif +- +-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +-static const yytype_uint8 yyr1[] = +-{ +- 0, 24, 26, 25, 27, 27, 28, 29, 29, 29, +- 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +- 29, 29, 29, 30, 31, 32, 33, 34, 35, 36, +- 37, 38, 39, 40, 41, 41, 42, 42, 43, 43, +- 44, 44, 45 +-}; +- +-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +-static const yytype_uint8 yyr2[] = +-{ +- 0, 2, 0, 2, 2, 0, 2, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 0, 2, 2, 1, 2, 2, 1, 1, +- 2, 2, 3, 4, 1, 0, 3, 0, 3, 0, +- 1, 0, 1 +-}; +- +-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state +- STATE-NUM when YYTABLE doesn't specify something else to do. Zero +- means the default is an error. */ +-static const yytype_uint8 yydefact[] = +-{ +- 2, 0, 5, 1, 0, 20, 42, 21, 0, 28, +- 39, 25, 0, 39, 0, 19, 39, 39, 29, 0, +- 4, 0, 15, 16, 12, 17, 13, 18, 14, 7, +- 8, 11, 10, 9, 37, 27, 31, 26, 37, 23, +- 24, 30, 6, 39, 32, 40, 0, 35, 41, 38, +- 34, 33, 36 +-}; +- +-/* YYDEFGOTO[NTERM-NUM]. */ +-static const yytype_int8 yydefgoto[] = +-{ +- -1, 1, 2, 4, 20, 21, 22, 23, 24, 25, +- 26, 27, 28, 29, 30, 31, 32, 51, 44, 35, +- 46, 33 +-}; +- +-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing +- STATE-NUM. */ +-#define YYPACT_NINF -14 +-static const yytype_int8 yypact[] = +-{ +- -14, 1, -14, -14, 5, -14, -14, -14, 2, -14, +- -14, -14, 21, -14, 22, -14, -14, -14, -14, 23, +- -14, 26, -14, -14, -14, -14, -14, -14, -14, -14, +- -14, -14, -14, -14, 10, -3, -14, -3, 10, -3, +- -3, -14, -14, -14, -14, -14, 27, 28, -1, -14, +- -14, -14, -14 +-}; +- +-/* YYPGOTO[NTERM-NUM]. */ +-static const yytype_int8 yypgoto[] = +-{ +- -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, +- -14, -14, -14, -14, -14, -14, -14, -14, -4, -13, +- -14, -14 +-}; +- +-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If +- positive, shift that token. If negative, reduce the rule which +- number is the opposite. If zero, do what YYDEFACT says. +- If YYTABLE_NINF, syntax error. */ +-#define YYTABLE_NINF -42 +-static const yytype_int8 yytable[] = +-{ +- 37, 3, -41, 39, 40, -3, 5, 34, -22, 6, +- 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, +- 45, 52, 45, 17, 18, 19, 36, 38, 41, 42, +- 48, 43, 49, 50, 47 +-}; +- +-static const yytype_uint8 yycheck[] = +-{ +- 13, 0, 5, 16, 17, 0, 1, 5, 3, 4, +- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, +- 23, 22, 23, 18, 19, 20, 5, 5, 5, 3, +- 43, 21, 5, 5, 38 +-}; +- +-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing +- symbol of state STATE-NUM. */ +-static const yytype_uint8 yystos[] = +-{ +- 0, 25, 26, 0, 27, 1, 4, 5, 6, 7, +- 8, 9, 10, 11, 12, 13, 14, 18, 19, 20, +- 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, +- 38, 39, 40, 45, 5, 43, 5, 43, 5, 43, +- 43, 5, 3, 21, 42, 23, 44, 42, 43, 5, +- 5, 41, 22 +-}; +- +-#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 yyerrorlab +- +- +-/* 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); \ +- yytoken = YYTRANSLATE (yychar); \ +- YYPOPSTACK (1); \ +- goto yybackup; \ +- } \ +- else \ +- { \ +- yyerror (YY_("syntax error: cannot back up")); \ +- YYERROR; \ +- } \ +-while (YYID (0)) +- +- +-#define YYTERROR 1 +-#define YYERRCODE 256 +- +- +-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. +- If N is 0, then set CURRENT to the empty location which ends +- the previous symbol: RHS[0] (always defined). */ +- +-#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +-#ifndef YYLLOC_DEFAULT +-# define YYLLOC_DEFAULT(Current, Rhs, N) \ +- do \ +- if (YYID (N)) \ +- { \ +- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ +- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ +- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ +- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ +- } \ +- else \ +- { \ +- (Current).first_line = (Current).last_line = \ +- YYRHSLOC (Rhs, 0).last_line; \ +- (Current).first_column = (Current).last_column = \ +- YYRHSLOC (Rhs, 0).last_column; \ +- } \ +- while (YYID (0)) +-#endif +- +- +-/* YY_LOCATION_PRINT -- Print the location on the stream. +- This macro was not mandated originally: define only if we know +- we won't break user code: when these are the locations we know. */ +- +-#ifndef YY_LOCATION_PRINT +-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL +-# define YY_LOCATION_PRINT(File, Loc) \ +- fprintf (File, "%d.%d-%d.%d", \ +- (Loc).first_line, (Loc).first_column, \ +- (Loc).last_line, (Loc).last_column) +-# else +-# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +-# endif +-#endif +- +- +-/* YYLEX -- calling `yylex' with the right arguments. */ +- +-#ifdef YYLEX_PARAM +-# define YYLEX yylex (YYLEX_PARAM) +-#else +-# define YYLEX yylex () +-#endif +- +-/* Enable debugging if requested. */ +-#if YYDEBUG +- +-# ifndef YYFPRINTF +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYFPRINTF fprintf +-# endif +- +-# define YYDPRINTF(Args) \ +-do { \ +- if (yydebug) \ +- YYFPRINTF Args; \ +-} while (YYID (0)) +- +-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +-do { \ +- if (yydebug) \ +- { \ +- YYFPRINTF (stderr, "%s ", Title); \ +- yy_symbol_print (stderr, \ +- Type, Value); \ +- YYFPRINTF (stderr, "\n"); \ +- } \ +-} while (YYID (0)) +- +- +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-/*ARGSUSED*/ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +-#else +-static void +-yy_symbol_value_print (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE const * const yyvaluep; +-#endif +-{ +- if (!yyvaluep) +- return; +-# ifdef YYPRINT +- if (yytype < YYNTOKENS) +- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +-# else +- YYUSE (yyoutput); +-# endif +- switch (yytype) +- { +- default: +- break; +- } +-} +- +- +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +-#else +-static void +-yy_symbol_print (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE const * const yyvaluep; +-#endif +-{ +- if (yytype < YYNTOKENS) +- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +- else +- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); +- +- yy_symbol_value_print (yyoutput, yytype, yyvaluep); +- YYFPRINTF (yyoutput, ")"); +-} +- +-/*------------------------------------------------------------------. +-| yy_stack_print -- Print the state stack from its BOTTOM up to its | +-| TOP (included). | +-`------------------------------------------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +-#else +-static void +-yy_stack_print (bottom, top) +- yytype_int16 *bottom; +- yytype_int16 *top; +-#endif +-{ +- YYFPRINTF (stderr, "Stack now"); +- for (; bottom <= top; ++bottom) +- YYFPRINTF (stderr, " %d", *bottom); +- YYFPRINTF (stderr, "\n"); +-} +- +-# define YY_STACK_PRINT(Bottom, Top) \ +-do { \ +- if (yydebug) \ +- yy_stack_print ((Bottom), (Top)); \ +-} while (YYID (0)) +- +- +-/*------------------------------------------------. +-| Report that the YYRULE is going to be reduced. | +-`------------------------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +-#else +-static void +-yy_reduce_print (yyvsp, yyrule) +- YYSTYPE *yyvsp; +- int yyrule; +-#endif +-{ +- int yynrhs = yyr2[yyrule]; +- int yyi; +- unsigned long int yylno = yyrline[yyrule]; +- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", +- yyrule - 1, yylno); +- /* The symbols being reduced. */ +- for (yyi = 0; yyi < yynrhs; yyi++) +- { +- fprintf (stderr, " $%d = ", yyi + 1); +- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], +- &(yyvsp[(yyi + 1) - (yynrhs)]) +- ); +- fprintf (stderr, "\n"); +- } +-} +- +-# define YY_REDUCE_PRINT(Rule) \ +-do { \ +- if (yydebug) \ +- yy_reduce_print (yyvsp, Rule); \ +-} while (YYID (0)) +- +-/* Nonzero means print parse trace. It is left uninitialized so that +- multiple parsers can coexist. */ +-int yydebug; +-#else /* !YYDEBUG */ +-# define YYDPRINTF(Args) +-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +-# define YY_STACK_PRINT(Bottom, Top) +-# define YY_REDUCE_PRINT(Rule) +-#endif /* !YYDEBUG */ +- +- +-/* YYINITDEPTH -- initial size of the parser's stacks. */ +-#ifndef YYINITDEPTH +-# define YYINITDEPTH 200 +-#endif +- +-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only +- if the built-in stack extension method is used). +- +- Do not make this value too large; the results are undefined if +- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) +- evaluated with infinite-precision integer arithmetic. */ +- +-#ifndef YYMAXDEPTH +-# define YYMAXDEPTH 10000 +-#endif +- +- +- +-#if YYERROR_VERBOSE +- +-# ifndef yystrlen +-# if defined __GLIBC__ && defined _STRING_H +-# define yystrlen strlen +-# else +-/* Return the length of YYSTR. */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static YYSIZE_T +-yystrlen (const char *yystr) +-#else +-static YYSIZE_T +-yystrlen (yystr) +- const char *yystr; +-#endif +-{ +- YYSIZE_T yylen; +- for (yylen = 0; yystr[yylen]; yylen++) +- continue; +- return yylen; +-} +-# endif +-# endif +- +-# ifndef yystpcpy +-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +-# define yystpcpy stpcpy +-# else +-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in +- YYDEST. */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static char * +-yystpcpy (char *yydest, const char *yysrc) +-#else +-static char * +-yystpcpy (yydest, yysrc) +- char *yydest; +- const char *yysrc; +-#endif +-{ +- char *yyd = yydest; +- const char *yys = yysrc; +- +- while ((*yyd++ = *yys++) != '\0') +- continue; +- +- return yyd - 1; +-} +-# endif +-# endif +- +-# ifndef yytnamerr +-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary +- quotes and backslashes, so that it's suitable for yyerror. The +- heuristic is that double-quoting is unnecessary unless the string +- contains an apostrophe, a comma, or backslash (other than +- backslash-backslash). YYSTR is taken from yytname. If YYRES is +- null, do not copy; instead, return the length of what the result +- would have been. */ +-static YYSIZE_T +-yytnamerr (char *yyres, const char *yystr) +-{ +- if (*yystr == '"') +- { +- YYSIZE_T yyn = 0; +- char const *yyp = yystr; +- +- for (;;) +- switch (*++yyp) +- { +- case '\'': +- case ',': +- goto do_not_strip_quotes; +- +- case '\\': +- if (*++yyp != '\\') +- goto do_not_strip_quotes; +- /* Fall through. */ +- default: +- if (yyres) +- yyres[yyn] = *yyp; +- yyn++; +- break; +- +- case '"': +- if (yyres) +- yyres[yyn] = '\0'; +- return yyn; +- } +- do_not_strip_quotes: ; +- } +- +- if (! yyres) +- return yystrlen (yystr); +- +- return yystpcpy (yyres, yystr) - yyres; +-} +-# endif +- +-/* Copy into YYRESULT an error message about the unexpected token +- YYCHAR while in state YYSTATE. Return the number of bytes copied, +- including the terminating null byte. If YYRESULT is null, do not +- copy anything; just return the number of bytes that would be +- copied. As a special case, return 0 if an ordinary "syntax error" +- message will do. Return YYSIZE_MAXIMUM if overflow occurs during +- size calculation. */ +-static YYSIZE_T +-yysyntax_error (char *yyresult, int yystate, int yychar) +-{ +- int yyn = yypact[yystate]; +- +- if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) +- return 0; +- else +- { +- int yytype = YYTRANSLATE (yychar); +- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); +- YYSIZE_T yysize = yysize0; +- YYSIZE_T yysize1; +- int yysize_overflow = 0; +- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; +- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; +- int yyx; +- +-# if 0 +- /* This is so xgettext sees the translatable formats that are +- constructed on the fly. */ +- YY_("syntax error, unexpected %s"); +- YY_("syntax error, unexpected %s, expecting %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s or %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +-# endif +- char *yyfmt; +- char const *yyf; +- static char const yyunexpected[] = "syntax error, unexpected %s"; +- static char const yyexpecting[] = ", expecting %s"; +- static char const yyor[] = " or %s"; +- char yyformat[sizeof yyunexpected +- + sizeof yyexpecting - 1 +- + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) +- * (sizeof yyor - 1))]; +- char const *yyprefix = yyexpecting; +- +- /* Start YYX at -YYN if negative to avoid negative indexes in +- YYCHECK. */ +- int yyxbegin = yyn < 0 ? -yyn : 0; +- +- /* Stay within bounds of both yycheck and yytname. */ +- int yychecklim = YYLAST - yyn + 1; +- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; +- int yycount = 1; +- +- yyarg[0] = yytname[yytype]; +- yyfmt = yystpcpy (yyformat, yyunexpected); +- +- for (yyx = yyxbegin; yyx < yyxend; ++yyx) +- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) +- { +- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) +- { +- yycount = 1; +- yysize = yysize0; +- yyformat[sizeof yyunexpected - 1] = '\0'; +- break; +- } +- yyarg[yycount++] = yytname[yyx]; +- yysize1 = yysize + yytnamerr (0, yytname[yyx]); +- yysize_overflow |= (yysize1 < yysize); +- yysize = yysize1; +- yyfmt = yystpcpy (yyfmt, yyprefix); +- yyprefix = yyor; +- } +- +- yyf = YY_(yyformat); +- yysize1 = yysize + yystrlen (yyf); +- yysize_overflow |= (yysize1 < yysize); +- yysize = yysize1; +- +- if (yysize_overflow) +- return YYSIZE_MAXIMUM; +- +- if (yyresult) +- { +- /* Avoid sprintf, as that infringes on the user's name space. +- Don't have undefined behavior even if the translation +- produced a string with the wrong number of "%s"s. */ +- char *yyp = yyresult; +- int yyi = 0; +- while ((*yyp = *yyf) != '\0') +- { +- if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) +- { +- yyp += yytnamerr (yyp, yyarg[yyi++]); +- yyf += 2; +- } +- else +- { +- yyp++; +- yyf++; +- } +- } +- } +- return yysize; +- } +-} +-#endif /* YYERROR_VERBOSE */ +- +- +-/*-----------------------------------------------. +-| Release the memory associated to this symbol. | +-`-----------------------------------------------*/ +- +-/*ARGSUSED*/ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +-#else +-static void +-yydestruct (yymsg, yytype, yyvaluep) +- const char *yymsg; +- int yytype; +- YYSTYPE *yyvaluep; +-#endif +-{ +- YYUSE (yyvaluep); +- +- if (!yymsg) +- yymsg = "Deleting"; +- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); +- +- switch (yytype) +- { +- +- default: +- break; +- } +-} +- +- +-/* Prevent warnings from -Wmissing-prototypes. */ +- +-#ifdef YYPARSE_PARAM +-#if defined __STDC__ || defined __cplusplus +-int yyparse (void *YYPARSE_PARAM); +-#else +-int yyparse (); +-#endif +-#else /* ! YYPARSE_PARAM */ +-#if defined __STDC__ || defined __cplusplus +-int yyparse (void); +-#else +-int yyparse (); +-#endif +-#endif /* ! YYPARSE_PARAM */ +- +- +- +-/* The look-ahead symbol. */ +-int yychar; +- +-/* The semantic value of the look-ahead symbol. */ +-YYSTYPE yylval; +- +-/* Number of syntax errors so far. */ +-int yynerrs; +- +- +- +-/*----------. +-| yyparse. | +-`----------*/ +- +-#ifdef YYPARSE_PARAM +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-int +-yyparse (void *YYPARSE_PARAM) +-#else +-int +-yyparse (YYPARSE_PARAM) +- void *YYPARSE_PARAM; +-#endif +-#else /* ! YYPARSE_PARAM */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-int +-yyparse (void) +-#else +-int +-yyparse () +- +-#endif +-#endif +-{ +- +- int yystate; +- int yyn; +- int yyresult; +- /* Number of tokens to shift before error messages enabled. */ +- int yyerrstatus; +- /* Look-ahead token as an internal (translated) token number. */ +- int yytoken = 0; +-#if YYERROR_VERBOSE +- /* Buffer for error messages, and its allocated size. */ +- char yymsgbuf[128]; +- char *yymsg = yymsgbuf; +- YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +-#endif +- +- /* Three stacks and their tools: +- `yyss': related to states, +- `yyvs': related to semantic values, +- `yyls': related to locations. +- +- Refer to the stacks thru separate pointers, to allow yyoverflow +- to reallocate them elsewhere. */ +- +- /* The state stack. */ +- yytype_int16 yyssa[YYINITDEPTH]; +- yytype_int16 *yyss = yyssa; +- yytype_int16 *yyssp; +- +- /* The semantic value stack. */ +- YYSTYPE yyvsa[YYINITDEPTH]; +- YYSTYPE *yyvs = yyvsa; +- YYSTYPE *yyvsp; +- +- +- +-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) +- +- YYSIZE_T yystacksize = YYINITDEPTH; +- +- /* The variables used to return semantic value and location from the +- action routines. */ +- YYSTYPE yyval; +- +- +- /* The number of symbols on the RHS of the reduced rule. +- Keep to zero when no symbol should be popped. */ +- int yylen = 0; +- +- YYDPRINTF ((stderr, "Starting parse\n")); +- +- 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; +- yyvsp = yyvs; +- +- goto yysetstate; +- +-/*------------------------------------------------------------. +-| yynewstate -- Push a new state, which is found in yystate. | +-`------------------------------------------------------------*/ +- yynewstate: +- /* In all cases, when you get here, the value and location stacks +- have just been pushed. So pushing a state here evens the stacks. */ +- yyssp++; +- +- yysetstate: +- *yyssp = yystate; +- +- if (yyss + yystacksize - 1 <= yyssp) +- { +- /* Get the current used size of the three stacks, in elements. */ +- YYSIZE_T yysize = yyssp - yyss + 1; +- +-#ifdef yyoverflow +- { +- /* Give user a chance to reallocate the stack. Use copies of +- these so that the &'s don't force the real ones into +- memory. */ +- YYSTYPE *yyvs1 = yyvs; +- yytype_int16 *yyss1 = yyss; +- +- +- /* Each stack pointer address is followed by the size of the +- data in use in that stack, in bytes. This used to be a +- conditional around just the two extra args, but that might +- be undefined if yyoverflow is a macro. */ +- yyoverflow (YY_("memory exhausted"), +- &yyss1, yysize * sizeof (*yyssp), +- &yyvs1, yysize * sizeof (*yyvsp), +- +- &yystacksize); +- +- yyss = yyss1; +- yyvs = yyvs1; +- } +-#else /* no yyoverflow */ +-# ifndef YYSTACK_RELOCATE +- goto yyexhaustedlab; +-# else +- /* Extend the stack our own way. */ +- if (YYMAXDEPTH <= yystacksize) +- goto yyexhaustedlab; +- yystacksize *= 2; +- if (YYMAXDEPTH < yystacksize) +- yystacksize = YYMAXDEPTH; +- +- { +- yytype_int16 *yyss1 = yyss; +- union yyalloc *yyptr = +- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); +- if (! yyptr) +- goto yyexhaustedlab; +- YYSTACK_RELOCATE (yyss); +- YYSTACK_RELOCATE (yyvs); +- +-# undef YYSTACK_RELOCATE +- if (yyss1 != yyssa) +- YYSTACK_FREE (yyss1); +- } +-# endif +-#endif /* no yyoverflow */ +- +- yyssp = yyss + yysize - 1; +- yyvsp = yyvs + yysize - 1; +- +- +- YYDPRINTF ((stderr, "Stack size increased to %lu\n", +- (unsigned long int) yystacksize)); +- +- if (yyss + yystacksize - 1 <= yyssp) +- YYABORT; +- } +- +- YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +- +- goto yybackup; +- +-/*-----------. +-| yybackup. | +-`-----------*/ +-yybackup: +- +- /* Do appropriate processing given the current state. Read a +- look-ahead token if we need one and don't already have one. */ +- +- /* First try to decide what to do without reference to look-ahead token. */ +- yyn = yypact[yystate]; +- if (yyn == YYPACT_NINF) +- goto yydefault; +- +- /* Not known => get a look-ahead token if don't already have one. */ +- +- /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ +- if (yychar == YYEMPTY) +- { +- YYDPRINTF ((stderr, "Reading a token: ")); +- yychar = YYLEX; +- } +- +- if (yychar <= YYEOF) +- { +- yychar = yytoken = YYEOF; +- YYDPRINTF ((stderr, "Now at end of input.\n")); +- } +- else +- { +- yytoken = YYTRANSLATE (yychar); +- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); +- } +- +- /* If the proper action on seeing token YYTOKEN is to reduce or to +- detect an error, take that action. */ +- yyn += yytoken; +- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) +- goto yydefault; +- yyn = yytable[yyn]; +- if (yyn <= 0) +- { +- if (yyn == 0 || yyn == YYTABLE_NINF) +- goto yyerrlab; +- yyn = -yyn; +- goto yyreduce; +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- /* Count tokens shifted since error; after three, turn off error +- status. */ +- if (yyerrstatus) +- yyerrstatus--; +- +- /* Shift the look-ahead token. */ +- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); +- +- /* Discard the shifted token unless it is eof. */ +- if (yychar != YYEOF) +- yychar = YYEMPTY; +- +- yystate = yyn; +- *++yyvsp = yylval; +- +- goto yynewstate; +- +- +-/*-----------------------------------------------------------. +-| yydefault -- do the default action for the current state. | +-`-----------------------------------------------------------*/ +-yydefault: +- yyn = yydefact[yystate]; +- if (yyn == 0) +- goto yyerrlab; +- goto yyreduce; +- +- +-/*-----------------------------. +-| yyreduce -- Do a reduction. | +-`-----------------------------*/ +-yyreduce: +- /* yyn is the number of a rule to reduce with. */ +- yylen = yyr2[yyn]; +- +- /* If YYLEN is nonzero, implement the default value of the action: +- `$$ = $1'. +- +- Otherwise, the following line sets YYVAL to garbage. +- This behavior is undocumented and Bison +- users should not rely upon it. Assigning to YYVAL +- unconditionally makes the parser a bit smaller, and it avoids a +- GCC warning that YYVAL may be used uninitialized. */ +- yyval = yyvsp[1-yylen]; +- +- +- YY_REDUCE_PRINT (yyn); +- switch (yyn) +- { +- case 2: +-#line 69 "arparse.y" +- { prompt(); } +- break; +- +- case 6: +-#line 78 "arparse.y" +- { prompt(); } +- break; +- +- case 19: +-#line 94 "arparse.y" +- { ar_end(); return 0; } +- break; +- +- case 21: +-#line 96 "arparse.y" +- { yyerror("foo"); } +- break; +- +- case 23: +-#line 103 "arparse.y" +- { ar_extract((yyvsp[(2) - (2)].list)); } +- break; +- +- case 24: +-#line 108 "arparse.y" +- { ar_replace((yyvsp[(2) - (2)].list)); } +- break; +- +- case 25: +-#line 113 "arparse.y" +- { ar_clear(); } +- break; +- +- case 26: +-#line 118 "arparse.y" +- { ar_delete((yyvsp[(2) - (2)].list)); } +- break; +- +- case 27: +-#line 122 "arparse.y" +- { ar_addmod((yyvsp[(2) - (2)].list)); } +- break; +- +- case 28: +-#line 127 "arparse.y" +- { ar_list(); } +- break; +- +- case 29: +-#line 132 "arparse.y" +- { ar_save(); } +- break; +- +- case 30: +-#line 139 "arparse.y" +- { ar_open((yyvsp[(2) - (2)].name),0); } +- break; +- +- case 31: +-#line 144 "arparse.y" +- { ar_open((yyvsp[(2) - (2)].name),1); } +- break; +- +- case 32: +-#line 150 "arparse.y" +- { ar_addlib((yyvsp[(2) - (3)].name),(yyvsp[(3) - (3)].list)); } +- break; +- +- case 33: +-#line 154 "arparse.y" +- { ar_directory((yyvsp[(2) - (4)].name), (yyvsp[(3) - (4)].list), (yyvsp[(4) - (4)].name)); } +- break; +- +- case 34: +-#line 161 "arparse.y" +- { (yyval.name) = (yyvsp[(1) - (1)].name); } +- break; +- +- case 35: +-#line 162 "arparse.y" +- { (yyval.name) = 0; } +- break; +- +- case 36: +-#line 167 "arparse.y" +- { (yyval.list) = (yyvsp[(2) - (3)].list); } +- break; +- +- case 37: +-#line 169 "arparse.y" +- { (yyval.list) = 0; } +- break; +- +- case 38: +-#line 174 "arparse.y" +- { struct list *n = (struct list *) malloc(sizeof(struct list)); +- n->next = (yyvsp[(1) - (3)].list); +- n->name = (yyvsp[(3) - (3)].name); +- (yyval.list) = n; +- } +- break; +- +- case 39: +-#line 179 "arparse.y" +- { (yyval.list) = 0; } +- break; +- +- case 42: +-#line 191 "arparse.y" +- { verbose = !verbose; } +- break; +- +- +-/* Line 1267 of yacc.c. */ +-#line 1546 "arparse.c" +- default: break; +- } +- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); +- +- YYPOPSTACK (yylen); +- yylen = 0; +- YY_STACK_PRINT (yyss, yyssp); +- +- *++yyvsp = yyval; +- +- +- /* 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 - YYNTOKENS] + *yyssp; +- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) +- yystate = yytable[yystate]; +- else +- yystate = yydefgoto[yyn - YYNTOKENS]; +- +- goto yynewstate; +- +- +-/*------------------------------------. +-| yyerrlab -- here on detecting error | +-`------------------------------------*/ +-yyerrlab: +- /* If not already recovering from an error, report this error. */ +- if (!yyerrstatus) +- { +- ++yynerrs; +-#if ! YYERROR_VERBOSE +- yyerror (YY_("syntax error")); +-#else +- { +- YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); +- if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) +- { +- YYSIZE_T yyalloc = 2 * yysize; +- if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) +- yyalloc = YYSTACK_ALLOC_MAXIMUM; +- if (yymsg != yymsgbuf) +- YYSTACK_FREE (yymsg); +- yymsg = (char *) YYSTACK_ALLOC (yyalloc); +- if (yymsg) +- yymsg_alloc = yyalloc; +- else +- { +- yymsg = yymsgbuf; +- yymsg_alloc = sizeof yymsgbuf; +- } +- } +- +- if (0 < yysize && yysize <= yymsg_alloc) +- { +- (void) yysyntax_error (yymsg, yystate, yychar); +- yyerror (yymsg); +- } +- else +- { +- yyerror (YY_("syntax error")); +- if (yysize != 0) +- goto yyexhaustedlab; +- } +- } +-#endif +- } +- +- +- +- if (yyerrstatus == 3) +- { +- /* If just tried and failed to reuse look-ahead token after an +- error, discard it. */ +- +- if (yychar <= YYEOF) +- { +- /* Return failure if at end of input. */ +- if (yychar == YYEOF) +- YYABORT; +- } +- else +- { +- yydestruct ("Error: discarding", +- yytoken, &yylval); +- yychar = YYEMPTY; +- } +- } +- +- /* Else will try to reuse look-ahead token after shifting the error +- token. */ +- goto yyerrlab1; +- +- +-/*---------------------------------------------------. +-| yyerrorlab -- error raised explicitly by YYERROR. | +-`---------------------------------------------------*/ +-yyerrorlab: +- +- /* Pacify compilers like GCC when the user code never invokes +- YYERROR and the label yyerrorlab therefore never appears in user +- code. */ +- if (/*CONSTCOND*/ 0) +- goto yyerrorlab; +- +- /* Do not reclaim the symbols of the rule which action triggered +- this YYERROR. */ +- YYPOPSTACK (yylen); +- yylen = 0; +- YY_STACK_PRINT (yyss, yyssp); +- yystate = *yyssp; +- goto yyerrlab1; +- +- +-/*-------------------------------------------------------------. +-| yyerrlab1 -- common code for both syntax error and YYERROR. | +-`-------------------------------------------------------------*/ +-yyerrlab1: +- yyerrstatus = 3; /* Each real token shifted decrements this. */ +- +- for (;;) +- { +- yyn = yypact[yystate]; +- if (yyn != YYPACT_NINF) +- { +- yyn += YYTERROR; +- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) +- { +- yyn = yytable[yyn]; +- if (0 < yyn) +- break; +- } +- } +- +- /* Pop the current state because it cannot handle the error token. */ +- if (yyssp == yyss) +- YYABORT; +- +- +- yydestruct ("Error: popping", +- yystos[yystate], yyvsp); +- YYPOPSTACK (1); +- yystate = *yyssp; +- YY_STACK_PRINT (yyss, yyssp); +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- *++yyvsp = yylval; +- +- +- /* Shift the error token. */ +- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); +- +- yystate = yyn; +- goto yynewstate; +- +- +-/*-------------------------------------. +-| yyacceptlab -- YYACCEPT comes here. | +-`-------------------------------------*/ +-yyacceptlab: +- yyresult = 0; +- goto yyreturn; +- +-/*-----------------------------------. +-| yyabortlab -- YYABORT comes here. | +-`-----------------------------------*/ +-yyabortlab: +- yyresult = 1; +- goto yyreturn; +- +-#ifndef yyoverflow +-/*-------------------------------------------------. +-| yyexhaustedlab -- memory exhaustion comes here. | +-`-------------------------------------------------*/ +-yyexhaustedlab: +- yyerror (YY_("memory exhausted")); +- yyresult = 2; +- /* Fall through. */ +-#endif +- +-yyreturn: +- if (yychar != YYEOF && yychar != YYEMPTY) +- yydestruct ("Cleanup: discarding lookahead", +- yytoken, &yylval); +- /* Do not reclaim the symbols of the rule which action triggered +- this YYABORT or YYACCEPT. */ +- YYPOPSTACK (yylen); +- YY_STACK_PRINT (yyss, yyssp); +- while (yyssp != yyss) +- { +- yydestruct ("Cleanup: popping", +- yystos[*yyssp], yyvsp); +- YYPOPSTACK (1); +- } +-#ifndef yyoverflow +- if (yyss != yyssa) +- YYSTACK_FREE (yyss); +-#endif +-#if YYERROR_VERBOSE +- if (yymsg != yymsgbuf) +- YYSTACK_FREE (yymsg); +-#endif +- /* Make sure YYID is used. */ +- return YYID (yyresult); +-} +- +- +-#line 195 "arparse.y" +- +- +-static int +-yyerror (const char *x ATTRIBUTE_UNUSED) +-{ +- extern int linenumber; +- +- printf (_("Syntax error in archive script, line %d\n"), linenumber + 1); +- return 0; +-} +- +diff -Nur binutils-2.24.orig/binutils/arparse.h binutils-2.24/binutils/arparse.h +--- binutils-2.24.orig/binutils/arparse.h 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/arparse.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,102 +0,0 @@ +-/* A Bison parser, made by GNU Bison 2.3. */ +- +-/* Skeleton interface for Bison's Yacc-like parsers in C +- +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +- 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., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. */ +- +-/* As a special exception, you may create a larger work that contains +- part or all of the Bison parser skeleton and distribute that work +- under terms of your choice, so long as that work isn't itself a +- parser generator using the skeleton or a modified version thereof +- as a parser skeleton. Alternatively, if you modify or redistribute +- the parser skeleton itself, you may (at your option) remove this +- special exception, which will cause the skeleton and the resulting +- Bison output files to be licensed under the GNU General Public +- License without this special exception. +- +- This special exception was added by the Free Software Foundation in +- version 2.2 of Bison. */ +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- NEWLINE = 258, +- VERBOSE = 259, +- FILENAME = 260, +- ADDLIB = 261, +- LIST = 262, +- ADDMOD = 263, +- CLEAR = 264, +- CREATE = 265, +- DELETE = 266, +- DIRECTORY = 267, +- END = 268, +- EXTRACT = 269, +- FULLDIR = 270, +- HELP = 271, +- QUIT = 272, +- REPLACE = 273, +- SAVE = 274, +- OPEN = 275 +- }; +-#endif +-/* Tokens. */ +-#define NEWLINE 258 +-#define VERBOSE 259 +-#define FILENAME 260 +-#define ADDLIB 261 +-#define LIST 262 +-#define ADDMOD 263 +-#define CLEAR 264 +-#define CREATE 265 +-#define DELETE 266 +-#define DIRECTORY 267 +-#define END 268 +-#define EXTRACT 269 +-#define FULLDIR 270 +-#define HELP 271 +-#define QUIT 272 +-#define REPLACE 273 +-#define SAVE 274 +-#define OPEN 275 +- +- +- +- +-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +-typedef union YYSTYPE +-#line 38 "arparse.y" +-{ +- char *name; +-struct list *list ; +- +-} +-/* Line 1529 of yacc.c. */ +-#line 95 "arparse.h" +- YYSTYPE; +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +-extern YYSTYPE yylval; +- +diff -Nur binutils-2.24.orig/binutils/deflex.c binutils-2.24/binutils/deflex.c +--- binutils-2.24.orig/binutils/deflex.c 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/deflex.c 1970-01-01 01:00:00.000000000 +0100 +@@ -1,2105 +0,0 @@ +- +-#line 3 "deflex.c" +- +-#define YY_INT_ALIGNED short int +- +-/* A lexical scanner generated by flex */ +- +-#define FLEX_SCANNER +-#define YY_FLEX_MAJOR_VERSION 2 +-#define YY_FLEX_MINOR_VERSION 5 +-#define YY_FLEX_SUBMINOR_VERSION 35 +-#if YY_FLEX_SUBMINOR_VERSION > 0 +-#define FLEX_BETA +-#endif +- +-/* First, we deal with platform-specific or compiler-specific issues. */ +- +-/* begin standard C headers. */ +-#include +-#include +-#include +-#include +- +-/* end standard C headers. */ +- +-/* flex integer type definitions */ +- +-#ifndef FLEXINT_H +-#define FLEXINT_H +- +-/* C99 systems have . Non-C99 systems may or may not. */ +- +-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +- +-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, +- * if you want the limit (max/min) macros for int types. +- */ +-#ifndef __STDC_LIMIT_MACROS +-#define __STDC_LIMIT_MACROS 1 +-#endif +- +-#include +-typedef int8_t flex_int8_t; +-typedef uint8_t flex_uint8_t; +-typedef int16_t flex_int16_t; +-typedef uint16_t flex_uint16_t; +-typedef int32_t flex_int32_t; +-typedef uint32_t flex_uint32_t; +-typedef uint64_t flex_uint64_t; +-#else +-typedef signed char flex_int8_t; +-typedef short int flex_int16_t; +-typedef int flex_int32_t; +-typedef unsigned char flex_uint8_t; +-typedef unsigned short int flex_uint16_t; +-typedef unsigned int flex_uint32_t; +-#endif /* ! C99 */ +- +-/* Limits of integral types. */ +-#ifndef INT8_MIN +-#define INT8_MIN (-128) +-#endif +-#ifndef INT16_MIN +-#define INT16_MIN (-32767-1) +-#endif +-#ifndef INT32_MIN +-#define INT32_MIN (-2147483647-1) +-#endif +-#ifndef INT8_MAX +-#define INT8_MAX (127) +-#endif +-#ifndef INT16_MAX +-#define INT16_MAX (32767) +-#endif +-#ifndef INT32_MAX +-#define INT32_MAX (2147483647) +-#endif +-#ifndef UINT8_MAX +-#define UINT8_MAX (255U) +-#endif +-#ifndef UINT16_MAX +-#define UINT16_MAX (65535U) +-#endif +-#ifndef UINT32_MAX +-#define UINT32_MAX (4294967295U) +-#endif +- +-#endif /* ! FLEXINT_H */ +- +-#ifdef __cplusplus +- +-/* The "const" storage-class-modifier is valid. */ +-#define YY_USE_CONST +- +-#else /* ! __cplusplus */ +- +-/* C99 requires __STDC__ to be defined as 1. */ +-#if defined (__STDC__) +- +-#define YY_USE_CONST +- +-#endif /* defined (__STDC__) */ +-#endif /* ! __cplusplus */ +- +-#ifdef YY_USE_CONST +-#define yyconst const +-#else +-#define yyconst +-#endif +- +-/* Returned upon end-of-file. */ +-#define YY_NULL 0 +- +-/* Promotes a possibly negative, possibly signed char to an unsigned +- * integer for use as an array index. If the signed char is negative, +- * we want to instead treat it as an 8-bit unsigned char, hence the +- * double cast. +- */ +-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) +- +-/* Enter a start condition. This macro really ought to take a parameter, +- * but we do it the disgusting crufty way forced on us by the ()-less +- * definition of BEGIN. +- */ +-#define BEGIN (yy_start) = 1 + 2 * +- +-/* Translate the current start state into a value that can be later handed +- * to BEGIN to return to the state. The YYSTATE alias is for lex +- * compatibility. +- */ +-#define YY_START (((yy_start) - 1) / 2) +-#define YYSTATE YY_START +- +-/* Action number for EOF rule of a given start state. */ +-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +- +-/* Special action meaning "start processing a new file". */ +-#define YY_NEW_FILE yyrestart(yyin ) +- +-#define YY_END_OF_BUFFER_CHAR 0 +- +-/* Size of default input buffer. */ +-#ifndef YY_BUF_SIZE +-#define YY_BUF_SIZE 16384 +-#endif +- +-/* The state buf must be large enough to hold one state per character in the main buffer. +- */ +-#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) +- +-#ifndef YY_TYPEDEF_YY_BUFFER_STATE +-#define YY_TYPEDEF_YY_BUFFER_STATE +-typedef struct yy_buffer_state *YY_BUFFER_STATE; +-#endif +- +-#ifndef YY_TYPEDEF_YY_SIZE_T +-#define YY_TYPEDEF_YY_SIZE_T +-typedef size_t yy_size_t; +-#endif +- +-extern yy_size_t yyleng; +- +-extern FILE *yyin, *yyout; +- +-#define EOB_ACT_CONTINUE_SCAN 0 +-#define EOB_ACT_END_OF_FILE 1 +-#define EOB_ACT_LAST_MATCH 2 +- +- #define YY_LESS_LINENO(n) +- +-/* Return all but the first "n" matched characters back to the input stream. */ +-#define yyless(n) \ +- do \ +- { \ +- /* Undo effects of setting up yytext. */ \ +- int yyless_macro_arg = (n); \ +- YY_LESS_LINENO(yyless_macro_arg);\ +- *yy_cp = (yy_hold_char); \ +- YY_RESTORE_YY_MORE_OFFSET \ +- (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ +- YY_DO_BEFORE_ACTION; /* set up yytext again */ \ +- } \ +- while ( 0 ) +- +-#define unput(c) yyunput( c, (yytext_ptr) ) +- +-#ifndef YY_STRUCT_YY_BUFFER_STATE +-#define YY_STRUCT_YY_BUFFER_STATE +-struct yy_buffer_state +- { +- FILE *yy_input_file; +- +- char *yy_ch_buf; /* input buffer */ +- char *yy_buf_pos; /* current position in input buffer */ +- +- /* Size of input buffer in bytes, not including room for EOB +- * characters. +- */ +- yy_size_t yy_buf_size; +- +- /* Number of characters read into yy_ch_buf, not including EOB +- * characters. +- */ +- yy_size_t yy_n_chars; +- +- /* Whether we "own" the buffer - i.e., we know we created it, +- * and can realloc() it to grow it, and should free() it to +- * delete it. +- */ +- int yy_is_our_buffer; +- +- /* Whether this is an "interactive" input source; if so, and +- * if we're using stdio for input, then we want to use getc() +- * instead of fread(), to make sure we stop fetching input after +- * each newline. +- */ +- int yy_is_interactive; +- +- /* Whether we're considered to be at the beginning of a line. +- * If so, '^' rules will be active on the next match, otherwise +- * not. +- */ +- int yy_at_bol; +- +- int yy_bs_lineno; /**< The line count. */ +- int yy_bs_column; /**< The column count. */ +- +- /* Whether to try to fill the input buffer when we reach the +- * end of it. +- */ +- int yy_fill_buffer; +- +- int yy_buffer_status; +- +-#define YY_BUFFER_NEW 0 +-#define YY_BUFFER_NORMAL 1 +- /* When an EOF's been seen but there's still some text to process +- * then we mark the buffer as YY_EOF_PENDING, to indicate that we +- * shouldn't try reading from the input source any more. We might +- * still have a bunch of tokens to match, though, because of +- * possible backing-up. +- * +- * When we actually see the EOF, we change the status to "new" +- * (via yyrestart()), so that the user can continue scanning by +- * just pointing yyin at a new input file. +- */ +-#define YY_BUFFER_EOF_PENDING 2 +- +- }; +-#endif /* !YY_STRUCT_YY_BUFFER_STATE */ +- +-/* Stack of input buffers. */ +-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ +- +-/* We provide macros for accessing buffer states in case in the +- * future we want to put the buffer states in a more general +- * "scanner state". +- * +- * Returns the top of the stack, or NULL. +- */ +-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ +- ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ +- : NULL) +- +-/* Same as previous macro, but useful when we know that the buffer stack is not +- * NULL or when we need an lvalue. For internal use only. +- */ +-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] +- +-/* yy_hold_char holds the character lost when yytext is formed. */ +-static char yy_hold_char; +-static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ +-yy_size_t yyleng; +- +-/* Points to current character in buffer. */ +-static char *yy_c_buf_p = (char *) 0; +-static int yy_init = 0; /* whether we need to initialize */ +-static int yy_start = 0; /* start state number */ +- +-/* Flag which is used to allow yywrap()'s to do buffer switches +- * instead of setting up a fresh yyin. A bit of a hack ... +- */ +-static int yy_did_buffer_switch_on_eof; +- +-void yyrestart (FILE *input_file ); +-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +-void yy_delete_buffer (YY_BUFFER_STATE b ); +-void yy_flush_buffer (YY_BUFFER_STATE b ); +-void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +-void yypop_buffer_state (void ); +- +-static void yyensure_buffer_stack (void ); +-static void yy_load_buffer_state (void ); +-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); +- +-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) +- +-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); +- +-void *yyalloc (yy_size_t ); +-void *yyrealloc (void *,yy_size_t ); +-void yyfree (void * ); +- +-#define yy_new_buffer yy_create_buffer +- +-#define yy_set_interactive(is_interactive) \ +- { \ +- if ( ! YY_CURRENT_BUFFER ){ \ +- yyensure_buffer_stack (); \ +- YY_CURRENT_BUFFER_LVALUE = \ +- yy_create_buffer(yyin,YY_BUF_SIZE ); \ +- } \ +- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ +- } +- +-#define yy_set_bol(at_bol) \ +- { \ +- if ( ! YY_CURRENT_BUFFER ){\ +- yyensure_buffer_stack (); \ +- YY_CURRENT_BUFFER_LVALUE = \ +- yy_create_buffer(yyin,YY_BUF_SIZE ); \ +- } \ +- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ +- } +- +-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) +- +-/* Begin user sect3 */ +- +-typedef unsigned char YY_CHAR; +- +-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +- +-typedef int yy_state_type; +- +-extern int yylineno; +- +-int yylineno = 1; +- +-extern char *yytext; +-#define yytext_ptr yytext +- +-static yy_state_type yy_get_previous_state (void ); +-static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +-static int yy_get_next_buffer (void ); +-static void yy_fatal_error (yyconst char msg[] ); +- +-/* Done after the current pattern has been matched and before the +- * corresponding action - sets up yytext. +- */ +-#define YY_DO_BEFORE_ACTION \ +- (yytext_ptr) = yy_bp; \ +- yyleng = (yy_size_t) (yy_cp - yy_bp); \ +- (yy_hold_char) = *yy_cp; \ +- *yy_cp = '\0'; \ +- (yy_c_buf_p) = yy_cp; +- +-#define YY_NUM_RULES 42 +-#define YY_END_OF_BUFFER 43 +-/* This struct is not used in this scanner, +- but its presence is necessary. */ +-struct yy_trans_info +- { +- flex_int32_t yy_verify; +- flex_int32_t yy_nxt; +- }; +-static yyconst flex_int16_t yy_accept[199] = +- { 0, +- 0, 0, 43, 42, 34, 36, 35, 33, 42, 28, +- 42, 31, 41, 39, 27, 32, 38, 40, 28, 28, +- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +- 28, 28, 28, 0, 29, 28, 0, 30, 31, 27, +- 32, 37, 28, 28, 28, 28, 28, 28, 28, 28, +- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +- 28, 28, 28, 28, 28, 28, 28, 12, 6, 28, +- 7, 28, 28, 28, 28, 28, 28, 28, 28, 1, +- +- 28, 28, 28, 16, 28, 28, 28, 28, 28, 28, +- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +- 28, 17, 28, 28, 28, 28, 28, 28, 28, 28, +- 28, 28, 14, 28, 28, 28, 19, 21, 28, 28, +- 28, 28, 28, 28, 18, 9, 28, 10, 28, 28, +- 2, 28, 28, 15, 28, 28, 28, 28, 11, 13, +- 28, 5, 28, 28, 22, 28, 8, 28, 28, 28, +- 28, 28, 28, 20, 4, 28, 28, 28, 24, 28, +- 26, 28, 3, 28, 28, 23, 25, 0 +- +- } ; +- +-static yyconst flex_int32_t yy_ec[256] = +- { 0, +- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, +- 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 5, 1, 6, 1, 7, 1, 1, 8, 1, +- 1, 9, 1, 10, 7, 11, 12, 13, 13, 13, +- 13, 13, 13, 13, 13, 13, 13, 7, 14, 12, +- 15, 12, 7, 16, 17, 18, 19, 20, 21, 22, +- 23, 24, 25, 7, 26, 27, 28, 29, 30, 31, +- 7, 32, 33, 34, 35, 36, 37, 38, 39, 40, +- 1, 1, 1, 1, 7, 1, 22, 22, 22, 22, +- +- 22, 22, 7, 7, 7, 7, 7, 7, 7, 7, +- 7, 7, 7, 7, 7, 7, 7, 7, 7, 22, +- 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1 +- } ; +- +-static yyconst flex_int32_t yy_meta[41] = +- { 0, +- 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, +- 1, 4, 5, 1, 1, 4, 6, 6, 6, 6, +- 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 +- } ; +- +-static yyconst flex_int16_t yy_base[206] = +- { 0, +- 0, 0, 230, 231, 231, 231, 231, 231, 223, 0, +- 220, 0, 231, 231, 0, 0, 212, 0, 209, 195, +- 24, 186, 202, 14, 197, 186, 27, 188, 198, 25, +- 197, 196, 184, 209, 231, 0, 206, 231, 0, 0, +- 0, 231, 0, 180, 27, 178, 178, 27, 193, 178, +- 183, 189, 179, 177, 175, 178, 185, 182, 183, 170, +- 181, 165, 164, 170, 173, 172, 159, 174, 171, 170, +- 158, 156, 156, 151, 152, 149, 161, 34, 145, 160, +- 145, 146, 154, 157, 147, 141, 139, 0, 0, 138, +- 0, 139, 135, 137, 135, 135, 29, 149, 140, 0, +- +- 136, 139, 145, 0, 136, 139, 132, 132, 30, 132, +- 135, 138, 129, 119, 118, 126, 116, 122, 119, 115, +- 115, 124, 127, 109, 112, 121, 119, 106, 111, 108, +- 106, 0, 106, 103, 112, 99, 91, 97, 99, 95, +- 88, 99, 0, 93, 103, 94, 0, 0, 97, 91, +- 87, 90, 84, 83, 0, 0, 95, 0, 97, 80, +- 0, 92, 91, 0, 78, 70, 91, 74, 0, 0, +- 82, 0, 89, 88, 0, 84, 0, 82, 85, 83, +- 69, 66, 56, 0, 0, 39, 36, 35, 0, 44, +- 0, 43, 0, 40, 39, 0, 0, 231, 67, 71, +- +- 77, 83, 85, 91, 95 +- } ; +- +-static yyconst flex_int16_t yy_def[206] = +- { 0, +- 198, 1, 198, 198, 198, 198, 198, 198, 199, 200, +- 201, 202, 198, 198, 203, 204, 198, 205, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 199, 198, 200, 201, 198, 202, 203, +- 204, 198, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +- 200, 200, 200, 200, 200, 200, 200, 0, 198, 198, +- +- 198, 198, 198, 198, 198 +- } ; +- +-static yyconst flex_int16_t yy_nxt[272] = +- { 0, +- 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, +- 14, 4, 15, 16, 17, 18, 10, 19, 20, 21, +- 22, 10, 10, 23, 24, 10, 25, 26, 27, 10, +- 28, 29, 30, 31, 10, 32, 33, 10, 10, 10, +- 46, 50, 51, 54, 47, 58, 66, 70, 59, 60, +- 101, 118, 129, 119, 130, 67, 55, 71, 61, 197, +- 196, 195, 194, 193, 192, 191, 102, 34, 34, 34, +- 34, 34, 34, 36, 36, 36, 36, 37, 37, 37, +- 37, 37, 37, 39, 190, 39, 39, 39, 39, 40, +- 40, 41, 189, 41, 41, 41, 41, 43, 188, 187, +- +- 43, 186, 185, 184, 183, 182, 181, 180, 179, 178, +- 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, +- 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, +- 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, +- 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, +- 137, 136, 135, 134, 133, 132, 131, 128, 127, 126, +- 125, 124, 123, 122, 121, 120, 117, 116, 115, 114, +- 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, +- 103, 100, 99, 98, 97, 96, 95, 94, 93, 92, +- 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, +- +- 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, +- 69, 68, 65, 38, 35, 64, 63, 62, 57, 56, +- 53, 52, 49, 48, 45, 44, 42, 38, 35, 198, +- 3, 198, 198, 198, 198, 198, 198, 198, 198, 198, +- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +- 198 +- } ; +- +-static yyconst flex_int16_t yy_chk[272] = +- { 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, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 21, 24, 24, 27, 21, 30, 45, 48, 30, 30, +- 78, 97, 109, 97, 109, 45, 27, 48, 30, 195, +- 194, 192, 190, 188, 187, 186, 78, 199, 199, 199, +- 199, 199, 199, 200, 200, 200, 200, 201, 201, 201, +- 201, 201, 201, 202, 183, 202, 202, 202, 202, 203, +- 203, 204, 182, 204, 204, 204, 204, 205, 181, 180, +- +- 205, 179, 178, 176, 174, 173, 171, 168, 167, 166, +- 165, 163, 162, 160, 159, 157, 154, 153, 152, 151, +- 150, 149, 146, 145, 144, 142, 141, 140, 139, 138, +- 137, 136, 135, 134, 133, 131, 130, 129, 128, 127, +- 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, +- 116, 115, 114, 113, 112, 111, 110, 108, 107, 106, +- 105, 103, 102, 101, 99, 98, 96, 95, 94, 93, +- 92, 90, 87, 86, 85, 84, 83, 82, 81, 80, +- 79, 77, 76, 75, 74, 73, 72, 71, 70, 69, +- 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, +- +- 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, +- 47, 46, 44, 37, 34, 33, 32, 31, 29, 28, +- 26, 25, 23, 22, 20, 19, 17, 11, 9, 3, +- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +- 198 +- } ; +- +-static yy_state_type yy_last_accepting_state; +-static char *yy_last_accepting_cpos; +- +-extern int yy_flex_debug; +-int yy_flex_debug = 0; +- +-/* The intent behind this definition is that it'll catch +- * any uses of REJECT which flex missed. +- */ +-#define REJECT reject_used_but_not_detected +-#define yymore() yymore_used_but_not_detected +-#define YY_MORE_ADJ 0 +-#define YY_RESTORE_YY_MORE_OFFSET +-char *yytext; +-#line 1 "deflex.l" +-#line 2 "deflex.l" +- +-/* Copyright 1995, 1997, 1998, 1999, 2002, 2003, 2004, 2005, 2007 +- Free Software Foundation, Inc. +- +- 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 3 of the License, or +- (at your option) any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +- MA 02110-1301, USA. */ +- +- +-/* Contributed by Steve Chamberlain: sac@cygnus.com */ +- +-#define DONTDECLARE_MALLOC +-#include "libiberty.h" +-#include "defparse.h" +-#include "dlltool.h" +- +-#define YY_NO_UNPUT +- +-int linenumber; +- +-#line 610 "deflex.c" +- +-#define INITIAL 0 +- +-#ifndef YY_NO_UNISTD_H +-/* Special case for "unistd.h", since it is non-ANSI. We include it way +- * down here because we want the user's section 1 to have been scanned first. +- * The user has a chance to override it with an option. +- */ +-#include +-#endif +- +-#ifndef YY_EXTRA_TYPE +-#define YY_EXTRA_TYPE void * +-#endif +- +-static int yy_init_globals (void ); +- +-/* Accessor methods to globals. +- These are made visible to non-reentrant scanners for convenience. */ +- +-int yylex_destroy (void ); +- +-int yyget_debug (void ); +- +-void yyset_debug (int debug_flag ); +- +-YY_EXTRA_TYPE yyget_extra (void ); +- +-void yyset_extra (YY_EXTRA_TYPE user_defined ); +- +-FILE *yyget_in (void ); +- +-void yyset_in (FILE * in_str ); +- +-FILE *yyget_out (void ); +- +-void yyset_out (FILE * out_str ); +- +-yy_size_t yyget_leng (void ); +- +-char *yyget_text (void ); +- +-int yyget_lineno (void ); +- +-void yyset_lineno (int line_number ); +- +-/* Macros after this point can all be overridden by user definitions in +- * section 1. +- */ +- +-#ifndef YY_SKIP_YYWRAP +-#ifdef __cplusplus +-extern "C" int yywrap (void ); +-#else +-extern int yywrap (void ); +-#endif +-#endif +- +- static void yyunput (int c,char *buf_ptr ); +- +-#ifndef yytext_ptr +-static void yy_flex_strncpy (char *,yyconst char *,int ); +-#endif +- +-#ifdef YY_NEED_STRLEN +-static int yy_flex_strlen (yyconst char * ); +-#endif +- +-#ifndef YY_NO_INPUT +- +-#ifdef __cplusplus +-static int yyinput (void ); +-#else +-static int input (void ); +-#endif +- +-#endif +- +-/* Amount of stuff to slurp up with each read. */ +-#ifndef YY_READ_BUF_SIZE +-#define YY_READ_BUF_SIZE 8192 +-#endif +- +-/* Copy whatever the last rule matched to the standard output. */ +-#ifndef ECHO +-/* This used to be an fputs(), but since the string might contain NUL's, +- * we now use fwrite(). +- */ +-#define ECHO fwrite( yytext, yyleng, 1, yyout ) +-#endif +- +-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, +- * is returned in "result". +- */ +-#ifndef YY_INPUT +-#define YY_INPUT(buf,result,max_size) \ +- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ +- { \ +- int c = '*'; \ +- yy_size_t n; \ +- for ( n = 0; n < max_size && \ +- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ +- buf[n] = (char) c; \ +- if ( c == '\n' ) \ +- buf[n++] = (char) c; \ +- if ( c == EOF && ferror( yyin ) ) \ +- YY_FATAL_ERROR( "input in flex scanner failed" ); \ +- result = n; \ +- } \ +- else \ +- { \ +- errno=0; \ +- while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ +- { \ +- if( errno != EINTR) \ +- { \ +- YY_FATAL_ERROR( "input in flex scanner failed" ); \ +- break; \ +- } \ +- errno=0; \ +- clearerr(yyin); \ +- } \ +- }\ +-\ +- +-#endif +- +-/* No semi-colon after return; correct usage is to write "yyterminate();" - +- * we don't want an extra ';' after the "return" because that will cause +- * some compilers to complain about unreachable statements. +- */ +-#ifndef yyterminate +-#define yyterminate() return YY_NULL +-#endif +- +-/* Number of entries by which start-condition stack grows. */ +-#ifndef YY_START_STACK_INCR +-#define YY_START_STACK_INCR 25 +-#endif +- +-/* Report a fatal error. */ +-#ifndef YY_FATAL_ERROR +-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +-#endif +- +-/* end tables serialization structures and prototypes */ +- +-/* Default declaration of generated scanner - a define so the user can +- * easily add parameters. +- */ +-#ifndef YY_DECL +-#define YY_DECL_IS_OURS 1 +- +-extern int yylex (void); +- +-#define YY_DECL int yylex (void) +-#endif /* !YY_DECL */ +- +-/* Code executed at the beginning of each rule, after yytext and yyleng +- * have been set up. +- */ +-#ifndef YY_USER_ACTION +-#define YY_USER_ACTION +-#endif +- +-/* Code executed at the end of each rule. */ +-#ifndef YY_BREAK +-#define YY_BREAK break; +-#endif +- +-#define YY_RULE_SETUP \ +- YY_USER_ACTION +- +-/** The main scanner function which does all the work. +- */ +-YY_DECL +-{ +- register yy_state_type yy_current_state; +- register char *yy_cp, *yy_bp; +- register int yy_act; +- +-#line 36 "deflex.l" +- +-#line 794 "deflex.c" +- +- if ( !(yy_init) ) +- { +- (yy_init) = 1; +- +-#ifdef YY_USER_INIT +- YY_USER_INIT; +-#endif +- +- if ( ! (yy_start) ) +- (yy_start) = 1; /* first start state */ +- +- if ( ! yyin ) +- yyin = stdin; +- +- if ( ! yyout ) +- yyout = stdout; +- +- if ( ! YY_CURRENT_BUFFER ) { +- yyensure_buffer_stack (); +- YY_CURRENT_BUFFER_LVALUE = +- yy_create_buffer(yyin,YY_BUF_SIZE ); +- } +- +- yy_load_buffer_state( ); +- } +- +- while ( 1 ) /* loops until end-of-file is reached */ +- { +- yy_cp = (yy_c_buf_p); +- +- /* Support of yytext. */ +- *yy_cp = (yy_hold_char); +- +- /* yy_bp points to the position in yy_ch_buf of the start of +- * the current run. +- */ +- yy_bp = yy_cp; +- +- yy_current_state = (yy_start); +-yy_match: +- do +- { +- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; +- if ( yy_accept[yy_current_state] ) +- { +- (yy_last_accepting_state) = yy_current_state; +- (yy_last_accepting_cpos) = yy_cp; +- } +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 199 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- ++yy_cp; +- } +- while ( yy_base[yy_current_state] != 231 ); +- +-yy_find_action: +- yy_act = yy_accept[yy_current_state]; +- if ( yy_act == 0 ) +- { /* have to back up */ +- yy_cp = (yy_last_accepting_cpos); +- yy_current_state = (yy_last_accepting_state); +- yy_act = yy_accept[yy_current_state]; +- } +- +- YY_DO_BEFORE_ACTION; +- +-do_action: /* This label is used only to access EOF actions. */ +- +- switch ( yy_act ) +- { /* beginning of action switch */ +- case 0: /* must back up */ +- /* undo the effects of YY_DO_BEFORE_ACTION */ +- *yy_cp = (yy_hold_char); +- yy_cp = (yy_last_accepting_cpos); +- yy_current_state = (yy_last_accepting_state); +- goto yy_find_action; +- +-case 1: +-YY_RULE_SETUP +-#line 37 "deflex.l" +-{ return NAME;} +- YY_BREAK +-case 2: +-YY_RULE_SETUP +-#line 38 "deflex.l" +-{ return LIBRARY;} +- YY_BREAK +-case 3: +-YY_RULE_SETUP +-#line 39 "deflex.l" +-{ return DESCRIPTION;} +- YY_BREAK +-case 4: +-YY_RULE_SETUP +-#line 40 "deflex.l" +-{ return STACKSIZE;} +- YY_BREAK +-case 5: +-YY_RULE_SETUP +-#line 41 "deflex.l" +-{ return HEAPSIZE;} +- YY_BREAK +-case 6: +-YY_RULE_SETUP +-#line 42 "deflex.l" +-{ return CODE;} +- YY_BREAK +-case 7: +-YY_RULE_SETUP +-#line 43 "deflex.l" +-{ return DATA;} +- YY_BREAK +-case 8: +-YY_RULE_SETUP +-#line 44 "deflex.l" +-{ return SECTIONS;} +- YY_BREAK +-case 9: +-YY_RULE_SETUP +-#line 45 "deflex.l" +-{ return EXPORTS;} +- YY_BREAK +-case 10: +-YY_RULE_SETUP +-#line 46 "deflex.l" +-{ return IMPORTS;} +- YY_BREAK +-case 11: +-YY_RULE_SETUP +-#line 47 "deflex.l" +-{ return VERSIONK;} +- YY_BREAK +-case 12: +-YY_RULE_SETUP +-#line 48 "deflex.l" +-{ return BASE;} +- YY_BREAK +-case 13: +-YY_RULE_SETUP +-#line 49 "deflex.l" +-{ return CONSTANT; } +- YY_BREAK +-case 14: +-YY_RULE_SETUP +-#line 50 "deflex.l" +-{ return NONAME; } +- YY_BREAK +-case 15: +-YY_RULE_SETUP +-#line 51 "deflex.l" +-{ return PRIVATE; } +- YY_BREAK +-case 16: +-YY_RULE_SETUP +-#line 52 "deflex.l" +-{ return READ;} +- YY_BREAK +-case 17: +-YY_RULE_SETUP +-#line 53 "deflex.l" +-{ return WRITE;} +- YY_BREAK +-case 18: +-YY_RULE_SETUP +-#line 54 "deflex.l" +-{ return EXECUTE;} +- YY_BREAK +-case 19: +-YY_RULE_SETUP +-#line 55 "deflex.l" +-{ return SHARED;} +- YY_BREAK +-case 20: +-YY_RULE_SETUP +-#line 56 "deflex.l" +-{ return NONSHARED;} +- YY_BREAK +-case 21: +-YY_RULE_SETUP +-#line 57 "deflex.l" +-{ return SINGLE;} +- YY_BREAK +-case 22: +-YY_RULE_SETUP +-#line 58 "deflex.l" +-{ return MULTIPLE;} +- YY_BREAK +-case 23: +-YY_RULE_SETUP +-#line 59 "deflex.l" +-{ return INITINSTANCE;} +- YY_BREAK +-case 24: +-YY_RULE_SETUP +-#line 60 "deflex.l" +-{ return INITGLOBAL;} +- YY_BREAK +-case 25: +-YY_RULE_SETUP +-#line 61 "deflex.l" +-{ return TERMINSTANCE;} +- YY_BREAK +-case 26: +-YY_RULE_SETUP +-#line 62 "deflex.l" +-{ return TERMGLOBAL;} +- YY_BREAK +-case 27: +-YY_RULE_SETUP +-#line 64 "deflex.l" +-{ yylval.number = strtol (yytext,0,0); +- return NUMBER; } +- YY_BREAK +-case 28: +-YY_RULE_SETUP +-#line 67 "deflex.l" +-{ +- yylval.id = xstrdup (yytext); +- return ID; +- } +- YY_BREAK +-case 29: +-/* rule 29 can match eol */ +-YY_RULE_SETUP +-#line 72 "deflex.l" +-{ +- yylval.id = xstrdup (yytext+1); +- yylval.id[yyleng-2] = 0; +- return ID; +- } +- YY_BREAK +-case 30: +-/* rule 30 can match eol */ +-YY_RULE_SETUP +-#line 78 "deflex.l" +-{ +- yylval.id = xstrdup (yytext+1); +- yylval.id[yyleng-2] = 0; +- return ID; +- } +- YY_BREAK +-case 31: +-YY_RULE_SETUP +-#line 83 "deflex.l" +-{ } +- YY_BREAK +-case 32: +-YY_RULE_SETUP +-#line 84 "deflex.l" +-{ } +- YY_BREAK +-case 33: +-YY_RULE_SETUP +-#line 85 "deflex.l" +-{ } +- YY_BREAK +-case 34: +-YY_RULE_SETUP +-#line 86 "deflex.l" +-{ } +- YY_BREAK +-case 35: +-YY_RULE_SETUP +-#line 87 "deflex.l" +-{ } +- YY_BREAK +-case 36: +-/* rule 36 can match eol */ +-YY_RULE_SETUP +-#line 88 "deflex.l" +-{ linenumber ++ ;} +- YY_BREAK +-case 37: +-YY_RULE_SETUP +-#line 89 "deflex.l" +-{ return EQUAL;} +- YY_BREAK +-case 38: +-YY_RULE_SETUP +-#line 90 "deflex.l" +-{ return '=';} +- YY_BREAK +-case 39: +-YY_RULE_SETUP +-#line 91 "deflex.l" +-{ return '.';} +- YY_BREAK +-case 40: +-YY_RULE_SETUP +-#line 92 "deflex.l" +-{ return '@';} +- YY_BREAK +-case 41: +-YY_RULE_SETUP +-#line 93 "deflex.l" +-{ return ',';} +- YY_BREAK +-case 42: +-YY_RULE_SETUP +-#line 94 "deflex.l" +-ECHO; +- YY_BREAK +-#line 1102 "deflex.c" +-case YY_STATE_EOF(INITIAL): +- yyterminate(); +- +- case YY_END_OF_BUFFER: +- { +- /* Amount of text matched not including the EOB char. */ +- int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; +- +- /* Undo the effects of YY_DO_BEFORE_ACTION. */ +- *yy_cp = (yy_hold_char); +- YY_RESTORE_YY_MORE_OFFSET +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) +- { +- /* We're scanning a new file or input source. It's +- * possible that this happened because the user +- * just pointed yyin at a new source and called +- * yylex(). If so, then we have to assure +- * consistency between YY_CURRENT_BUFFER and our +- * globals. Here is the right place to do so, because +- * this is the first action (other than possibly a +- * back-up) that will match for the new input source. +- */ +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; +- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; +- } +- +- /* Note that here we test for yy_c_buf_p "<=" to the position +- * of the first EOB in the buffer, since yy_c_buf_p will +- * already have been incremented past the NUL character +- * (since all states make transitions on EOB to the +- * end-of-buffer state). Contrast this with the test +- * in input(). +- */ +- if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) +- { /* This was really a NUL. */ +- yy_state_type yy_next_state; +- +- (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; +- +- yy_current_state = yy_get_previous_state( ); +- +- /* Okay, we're now positioned to make the NUL +- * transition. We couldn't have +- * yy_get_previous_state() go ahead and do it +- * for us because it doesn't know how to deal +- * with the possibility of jamming (and we don't +- * want to build jamming into it because then it +- * will run more slowly). +- */ +- +- yy_next_state = yy_try_NUL_trans( yy_current_state ); +- +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- +- if ( yy_next_state ) +- { +- /* Consume the NUL. */ +- yy_cp = ++(yy_c_buf_p); +- yy_current_state = yy_next_state; +- goto yy_match; +- } +- +- else +- { +- yy_cp = (yy_c_buf_p); +- goto yy_find_action; +- } +- } +- +- else switch ( yy_get_next_buffer( ) ) +- { +- case EOB_ACT_END_OF_FILE: +- { +- (yy_did_buffer_switch_on_eof) = 0; +- +- if ( yywrap( ) ) +- { +- /* Note: because we've taken care in +- * yy_get_next_buffer() to have set up +- * yytext, we can now set up +- * yy_c_buf_p so that if some total +- * hoser (like flex itself) wants to +- * call the scanner after we return the +- * YY_NULL, it'll still work - another +- * YY_NULL will get returned. +- */ +- (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; +- +- yy_act = YY_STATE_EOF(YY_START); +- goto do_action; +- } +- +- else +- { +- if ( ! (yy_did_buffer_switch_on_eof) ) +- YY_NEW_FILE; +- } +- break; +- } +- +- case EOB_ACT_CONTINUE_SCAN: +- (yy_c_buf_p) = +- (yytext_ptr) + yy_amount_of_matched_text; +- +- yy_current_state = yy_get_previous_state( ); +- +- yy_cp = (yy_c_buf_p); +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- goto yy_match; +- +- case EOB_ACT_LAST_MATCH: +- (yy_c_buf_p) = +- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; +- +- yy_current_state = yy_get_previous_state( ); +- +- yy_cp = (yy_c_buf_p); +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- goto yy_find_action; +- } +- break; +- } +- +- default: +- YY_FATAL_ERROR( +- "fatal flex scanner internal error--no action found" ); +- } /* end of action switch */ +- } /* end of scanning one token */ +-} /* end of yylex */ +- +-/* yy_get_next_buffer - try to read in a new buffer +- * +- * Returns a code representing an action: +- * EOB_ACT_LAST_MATCH - +- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position +- * EOB_ACT_END_OF_FILE - end of file +- */ +-static int yy_get_next_buffer (void) +-{ +- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; +- register char *source = (yytext_ptr); +- register int number_to_move, i; +- int ret_val; +- +- if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) +- YY_FATAL_ERROR( +- "fatal flex scanner internal error--end of buffer missed" ); +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) +- { /* Don't try to fill the buffer, so this is an EOF. */ +- if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) +- { +- /* We matched a single character, the EOB, so +- * treat this as a final EOF. +- */ +- return EOB_ACT_END_OF_FILE; +- } +- +- else +- { +- /* We matched some text prior to the EOB, first +- * process it. +- */ +- return EOB_ACT_LAST_MATCH; +- } +- } +- +- /* Try to read more data. */ +- +- /* First move last chars to start of buffer. */ +- number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; +- +- for ( i = 0; i < number_to_move; ++i ) +- *(dest++) = *(source++); +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) +- /* don't do the read, it's not guaranteed to return an EOF, +- * just force an EOF +- */ +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; +- +- else +- { +- yy_size_t num_to_read = +- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; +- +- while ( num_to_read <= 0 ) +- { /* Not enough room in the buffer - grow it. */ +- +- /* just a shorter name for the current buffer */ +- YY_BUFFER_STATE b = YY_CURRENT_BUFFER; +- +- int yy_c_buf_p_offset = +- (int) ((yy_c_buf_p) - b->yy_ch_buf); +- +- if ( b->yy_is_our_buffer ) +- { +- yy_size_t new_size = b->yy_buf_size * 2; +- +- if ( new_size <= 0 ) +- b->yy_buf_size += b->yy_buf_size / 8; +- else +- b->yy_buf_size *= 2; +- +- b->yy_ch_buf = (char *) +- /* Include room in for 2 EOB chars. */ +- yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); +- } +- else +- /* Can't grow it, we don't own it. */ +- b->yy_ch_buf = 0; +- +- if ( ! b->yy_ch_buf ) +- YY_FATAL_ERROR( +- "fatal error - scanner input buffer overflow" ); +- +- (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; +- +- num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - +- number_to_move - 1; +- +- } +- +- if ( num_to_read > YY_READ_BUF_SIZE ) +- num_to_read = YY_READ_BUF_SIZE; +- +- /* Read in more data. */ +- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), +- (yy_n_chars), num_to_read ); +- +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- if ( (yy_n_chars) == 0 ) +- { +- if ( number_to_move == YY_MORE_ADJ ) +- { +- ret_val = EOB_ACT_END_OF_FILE; +- yyrestart(yyin ); +- } +- +- else +- { +- ret_val = EOB_ACT_LAST_MATCH; +- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = +- YY_BUFFER_EOF_PENDING; +- } +- } +- +- else +- ret_val = EOB_ACT_CONTINUE_SCAN; +- +- if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { +- /* Extend the array by 50%, plus the number we really need. */ +- yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); +- if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); +- } +- +- (yy_n_chars) += number_to_move; +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; +- +- (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; +- +- return ret_val; +-} +- +-/* yy_get_previous_state - get the state just before the EOB char was reached */ +- +- static yy_state_type yy_get_previous_state (void) +-{ +- register yy_state_type yy_current_state; +- register char *yy_cp; +- +- yy_current_state = (yy_start); +- +- for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) +- { +- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); +- if ( yy_accept[yy_current_state] ) +- { +- (yy_last_accepting_state) = yy_current_state; +- (yy_last_accepting_cpos) = yy_cp; +- } +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 199 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- } +- +- return yy_current_state; +-} +- +-/* yy_try_NUL_trans - try to make a transition on the NUL character +- * +- * synopsis +- * next_state = yy_try_NUL_trans( current_state ); +- */ +- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +-{ +- register int yy_is_jam; +- register char *yy_cp = (yy_c_buf_p); +- +- register YY_CHAR yy_c = 1; +- if ( yy_accept[yy_current_state] ) +- { +- (yy_last_accepting_state) = yy_current_state; +- (yy_last_accepting_cpos) = yy_cp; +- } +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 199 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- yy_is_jam = (yy_current_state == 198); +- +- return yy_is_jam ? 0 : yy_current_state; +-} +- +- static void yyunput (int c, register char * yy_bp ) +-{ +- register char *yy_cp; +- +- yy_cp = (yy_c_buf_p); +- +- /* undo effects of setting up yytext */ +- *yy_cp = (yy_hold_char); +- +- if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) +- { /* need to shift things up to make room */ +- /* +2 for EOB chars. */ +- register yy_size_t number_to_move = (yy_n_chars) + 2; +- register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ +- YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; +- register char *source = +- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; +- +- while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) +- *--dest = *--source; +- +- yy_cp += (int) (dest - source); +- yy_bp += (int) (dest - source); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; +- +- if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) +- YY_FATAL_ERROR( "flex scanner push-back overflow" ); +- } +- +- *--yy_cp = (char) c; +- +- (yytext_ptr) = yy_bp; +- (yy_hold_char) = *yy_cp; +- (yy_c_buf_p) = yy_cp; +-} +- +-#ifndef YY_NO_INPUT +-#ifdef __cplusplus +- static int yyinput (void) +-#else +- static int input (void) +-#endif +- +-{ +- int c; +- +- *(yy_c_buf_p) = (yy_hold_char); +- +- if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) +- { +- /* yy_c_buf_p now points to the character we want to return. +- * If this occurs *before* the EOB characters, then it's a +- * valid NUL; if not, then we've hit the end of the buffer. +- */ +- if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) +- /* This was really a NUL. */ +- *(yy_c_buf_p) = '\0'; +- +- else +- { /* need more input */ +- yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); +- ++(yy_c_buf_p); +- +- switch ( yy_get_next_buffer( ) ) +- { +- case EOB_ACT_LAST_MATCH: +- /* This happens because yy_g_n_b() +- * sees that we've accumulated a +- * token and flags that we need to +- * try matching the token before +- * proceeding. But for input(), +- * there's no matching to consider. +- * So convert the EOB_ACT_LAST_MATCH +- * to EOB_ACT_END_OF_FILE. +- */ +- +- /* Reset buffer status. */ +- yyrestart(yyin ); +- +- /*FALLTHROUGH*/ +- +- case EOB_ACT_END_OF_FILE: +- { +- if ( yywrap( ) ) +- return 0; +- +- if ( ! (yy_did_buffer_switch_on_eof) ) +- YY_NEW_FILE; +-#ifdef __cplusplus +- return yyinput(); +-#else +- return input(); +-#endif +- } +- +- case EOB_ACT_CONTINUE_SCAN: +- (yy_c_buf_p) = (yytext_ptr) + offset; +- break; +- } +- } +- } +- +- c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ +- *(yy_c_buf_p) = '\0'; /* preserve yytext */ +- (yy_hold_char) = *++(yy_c_buf_p); +- +- return c; +-} +-#endif /* ifndef YY_NO_INPUT */ +- +-/** Immediately switch to a different input stream. +- * @param input_file A readable stream. +- * +- * @note This function does not reset the start condition to @c INITIAL . +- */ +- void yyrestart (FILE * input_file ) +-{ +- +- if ( ! YY_CURRENT_BUFFER ){ +- yyensure_buffer_stack (); +- YY_CURRENT_BUFFER_LVALUE = +- yy_create_buffer(yyin,YY_BUF_SIZE ); +- } +- +- yy_init_buffer(YY_CURRENT_BUFFER,input_file ); +- yy_load_buffer_state( ); +-} +- +-/** Switch to a different input buffer. +- * @param new_buffer The new input buffer. +- * +- */ +- void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +-{ +- +- /* TODO. We should be able to replace this entire function body +- * with +- * yypop_buffer_state(); +- * yypush_buffer_state(new_buffer); +- */ +- yyensure_buffer_stack (); +- if ( YY_CURRENT_BUFFER == new_buffer ) +- return; +- +- if ( YY_CURRENT_BUFFER ) +- { +- /* Flush out information for old buffer. */ +- *(yy_c_buf_p) = (yy_hold_char); +- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- YY_CURRENT_BUFFER_LVALUE = new_buffer; +- yy_load_buffer_state( ); +- +- /* We don't actually know whether we did this switch during +- * EOF (yywrap()) processing, but the only time this flag +- * is looked at is after yywrap() is called, so it's safe +- * to go ahead and always set it. +- */ +- (yy_did_buffer_switch_on_eof) = 1; +-} +- +-static void yy_load_buffer_state (void) +-{ +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +- (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; +- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; +- (yy_hold_char) = *(yy_c_buf_p); +-} +- +-/** Allocate and initialize an input buffer state. +- * @param file A readable stream. +- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. +- * +- * @return the allocated buffer state. +- */ +- YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +-{ +- YY_BUFFER_STATE b; +- +- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); +- if ( ! b ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); +- +- b->yy_buf_size = size; +- +- /* yy_ch_buf has to be 2 characters longer than the size given because +- * we need to put in 2 end-of-buffer characters. +- */ +- b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); +- if ( ! b->yy_ch_buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); +- +- b->yy_is_our_buffer = 1; +- +- yy_init_buffer(b,file ); +- +- return b; +-} +- +-/** Destroy the buffer. +- * @param b a buffer created with yy_create_buffer() +- * +- */ +- void yy_delete_buffer (YY_BUFFER_STATE b ) +-{ +- +- if ( ! b ) +- return; +- +- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ +- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; +- +- if ( b->yy_is_our_buffer ) +- yyfree((void *) b->yy_ch_buf ); +- +- yyfree((void *) b ); +-} +- +-#ifndef __cplusplus +-extern int isatty (int ); +-#endif /* __cplusplus */ +- +-/* Initializes or reinitializes a buffer. +- * This function is sometimes called more than once on the same buffer, +- * such as during a yyrestart() or at EOF. +- */ +- static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) +- +-{ +- int oerrno = errno; +- +- yy_flush_buffer(b ); +- +- b->yy_input_file = file; +- b->yy_fill_buffer = 1; +- +- /* If b is the current buffer, then yy_init_buffer was _probably_ +- * called from yyrestart() or through yy_get_next_buffer. +- * In that case, we don't want to reset the lineno or column. +- */ +- if (b != YY_CURRENT_BUFFER){ +- b->yy_bs_lineno = 1; +- b->yy_bs_column = 0; +- } +- +- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +- +- errno = oerrno; +-} +- +-/** Discard all buffered characters. On the next scan, YY_INPUT will be called. +- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. +- * +- */ +- void yy_flush_buffer (YY_BUFFER_STATE b ) +-{ +- if ( ! b ) +- return; +- +- b->yy_n_chars = 0; +- +- /* We always need two end-of-buffer characters. The first causes +- * a transition to the end-of-buffer state. The second causes +- * a jam in that state. +- */ +- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; +- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; +- +- b->yy_buf_pos = &b->yy_ch_buf[0]; +- +- b->yy_at_bol = 1; +- b->yy_buffer_status = YY_BUFFER_NEW; +- +- if ( b == YY_CURRENT_BUFFER ) +- yy_load_buffer_state( ); +-} +- +-/** Pushes the new state onto the stack. The new state becomes +- * the current state. This function will allocate the stack +- * if necessary. +- * @param new_buffer The new state. +- * +- */ +-void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +-{ +- if (new_buffer == NULL) +- return; +- +- yyensure_buffer_stack(); +- +- /* This block is copied from yy_switch_to_buffer. */ +- if ( YY_CURRENT_BUFFER ) +- { +- /* Flush out information for old buffer. */ +- *(yy_c_buf_p) = (yy_hold_char); +- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- /* Only push if top exists. Otherwise, replace top. */ +- if (YY_CURRENT_BUFFER) +- (yy_buffer_stack_top)++; +- YY_CURRENT_BUFFER_LVALUE = new_buffer; +- +- /* copied from yy_switch_to_buffer. */ +- yy_load_buffer_state( ); +- (yy_did_buffer_switch_on_eof) = 1; +-} +- +-/** Removes and deletes the top of the stack, if present. +- * The next element becomes the new top. +- * +- */ +-void yypop_buffer_state (void) +-{ +- if (!YY_CURRENT_BUFFER) +- return; +- +- yy_delete_buffer(YY_CURRENT_BUFFER ); +- YY_CURRENT_BUFFER_LVALUE = NULL; +- if ((yy_buffer_stack_top) > 0) +- --(yy_buffer_stack_top); +- +- if (YY_CURRENT_BUFFER) { +- yy_load_buffer_state( ); +- (yy_did_buffer_switch_on_eof) = 1; +- } +-} +- +-/* Allocates the stack if it does not exist. +- * Guarantees space for at least one push. +- */ +-static void yyensure_buffer_stack (void) +-{ +- yy_size_t num_to_alloc; +- +- if (!(yy_buffer_stack)) { +- +- /* First allocation is just for 2 elements, since we don't know if this +- * scanner will even need a stack. We use 2 instead of 1 to avoid an +- * immediate realloc on the next call. +- */ +- num_to_alloc = 1; +- (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc +- (num_to_alloc * sizeof(struct yy_buffer_state*) +- ); +- if ( ! (yy_buffer_stack) ) +- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); +- +- memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); +- +- (yy_buffer_stack_max) = num_to_alloc; +- (yy_buffer_stack_top) = 0; +- return; +- } +- +- if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ +- +- /* Increase the buffer to prepare for a possible push. */ +- int grow_size = 8 /* arbitrary grow size */; +- +- num_to_alloc = (yy_buffer_stack_max) + grow_size; +- (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc +- ((yy_buffer_stack), +- num_to_alloc * sizeof(struct yy_buffer_state*) +- ); +- if ( ! (yy_buffer_stack) ) +- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); +- +- /* zero only the new slots.*/ +- memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); +- (yy_buffer_stack_max) = num_to_alloc; +- } +-} +- +-/** Setup the input buffer state to scan directly from a user-specified character buffer. +- * @param base the character buffer +- * @param size the size in bytes of the character buffer +- * +- * @return the newly allocated buffer state object. +- */ +-YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +-{ +- YY_BUFFER_STATE b; +- +- if ( size < 2 || +- base[size-2] != YY_END_OF_BUFFER_CHAR || +- base[size-1] != YY_END_OF_BUFFER_CHAR ) +- /* They forgot to leave room for the EOB's. */ +- return 0; +- +- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); +- if ( ! b ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); +- +- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ +- b->yy_buf_pos = b->yy_ch_buf = base; +- b->yy_is_our_buffer = 0; +- b->yy_input_file = 0; +- b->yy_n_chars = b->yy_buf_size; +- b->yy_is_interactive = 0; +- b->yy_at_bol = 1; +- b->yy_fill_buffer = 0; +- b->yy_buffer_status = YY_BUFFER_NEW; +- +- yy_switch_to_buffer(b ); +- +- return b; +-} +- +-/** Setup the input buffer state to scan a string. The next call to yylex() will +- * scan from a @e copy of @a str. +- * @param yystr a NUL-terminated string to scan +- * +- * @return the newly allocated buffer state object. +- * @note If you want to scan bytes that may contain NUL values, then use +- * yy_scan_bytes() instead. +- */ +-YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) +-{ +- +- return yy_scan_bytes(yystr,strlen(yystr) ); +-} +- +-/** Setup the input buffer state to scan the given bytes. The next call to yylex() will +- * scan from a @e copy of @a bytes. +- * @param bytes the byte buffer to scan +- * @param len the number of bytes in the buffer pointed to by @a bytes. +- * +- * @return the newly allocated buffer state object. +- */ +-YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) +-{ +- YY_BUFFER_STATE b; +- char *buf; +- yy_size_t n, i; +- +- /* Get memory for full buffer, including space for trailing EOB's. */ +- n = _yybytes_len + 2; +- buf = (char *) yyalloc(n ); +- if ( ! buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); +- +- for ( i = 0; i < _yybytes_len; ++i ) +- buf[i] = yybytes[i]; +- +- buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; +- +- b = yy_scan_buffer(buf,n ); +- if ( ! b ) +- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); +- +- /* It's okay to grow etc. this buffer, and we should throw it +- * away when we're done. +- */ +- b->yy_is_our_buffer = 1; +- +- return b; +-} +- +-#ifndef YY_EXIT_FAILURE +-#define YY_EXIT_FAILURE 2 +-#endif +- +-static void yy_fatal_error (yyconst char* msg ) +-{ +- (void) fprintf( stderr, "%s\n", msg ); +- exit( YY_EXIT_FAILURE ); +-} +- +-/* Redefine yyless() so it works in section 3 code. */ +- +-#undef yyless +-#define yyless(n) \ +- do \ +- { \ +- /* Undo effects of setting up yytext. */ \ +- int yyless_macro_arg = (n); \ +- YY_LESS_LINENO(yyless_macro_arg);\ +- yytext[yyleng] = (yy_hold_char); \ +- (yy_c_buf_p) = yytext + yyless_macro_arg; \ +- (yy_hold_char) = *(yy_c_buf_p); \ +- *(yy_c_buf_p) = '\0'; \ +- yyleng = yyless_macro_arg; \ +- } \ +- while ( 0 ) +- +-/* Accessor methods (get/set functions) to struct members. */ +- +-/** Get the current line number. +- * +- */ +-int yyget_lineno (void) +-{ +- +- return yylineno; +-} +- +-/** Get the input stream. +- * +- */ +-FILE *yyget_in (void) +-{ +- return yyin; +-} +- +-/** Get the output stream. +- * +- */ +-FILE *yyget_out (void) +-{ +- return yyout; +-} +- +-/** Get the length of the current token. +- * +- */ +-yy_size_t yyget_leng (void) +-{ +- return yyleng; +-} +- +-/** Get the current token. +- * +- */ +- +-char *yyget_text (void) +-{ +- return yytext; +-} +- +-/** Set the current line number. +- * @param line_number +- * +- */ +-void yyset_lineno (int line_number ) +-{ +- +- yylineno = line_number; +-} +- +-/** Set the input stream. This does not discard the current +- * input buffer. +- * @param in_str A readable stream. +- * +- * @see yy_switch_to_buffer +- */ +-void yyset_in (FILE * in_str ) +-{ +- yyin = in_str ; +-} +- +-void yyset_out (FILE * out_str ) +-{ +- yyout = out_str ; +-} +- +-int yyget_debug (void) +-{ +- return yy_flex_debug; +-} +- +-void yyset_debug (int bdebug ) +-{ +- yy_flex_debug = bdebug ; +-} +- +-static int yy_init_globals (void) +-{ +- /* Initialization is the same as for the non-reentrant scanner. +- * This function is called from yylex_destroy(), so don't allocate here. +- */ +- +- (yy_buffer_stack) = 0; +- (yy_buffer_stack_top) = 0; +- (yy_buffer_stack_max) = 0; +- (yy_c_buf_p) = (char *) 0; +- (yy_init) = 0; +- (yy_start) = 0; +- +-/* Defined in main.c */ +-#ifdef YY_STDINIT +- yyin = stdin; +- yyout = stdout; +-#else +- yyin = (FILE *) 0; +- yyout = (FILE *) 0; +-#endif +- +- /* For future reference: Set errno on error, since we are called by +- * yylex_init() +- */ +- return 0; +-} +- +-/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +-int yylex_destroy (void) +-{ +- +- /* Pop the buffer stack, destroying each element. */ +- while(YY_CURRENT_BUFFER){ +- yy_delete_buffer(YY_CURRENT_BUFFER ); +- YY_CURRENT_BUFFER_LVALUE = NULL; +- yypop_buffer_state(); +- } +- +- /* Destroy the stack itself. */ +- yyfree((yy_buffer_stack) ); +- (yy_buffer_stack) = NULL; +- +- /* Reset the globals. This is important in a non-reentrant scanner so the next time +- * yylex() is called, initialization will occur. */ +- yy_init_globals( ); +- +- return 0; +-} +- +-/* +- * Internal utility routines. +- */ +- +-#ifndef yytext_ptr +-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +-{ +- register int i; +- for ( i = 0; i < n; ++i ) +- s1[i] = s2[i]; +-} +-#endif +- +-#ifdef YY_NEED_STRLEN +-static int yy_flex_strlen (yyconst char * s ) +-{ +- register int n; +- for ( n = 0; s[n]; ++n ) +- ; +- +- return n; +-} +-#endif +- +-void *yyalloc (yy_size_t size ) +-{ +- return (void *) malloc( size ); +-} +- +-void *yyrealloc (void * ptr, yy_size_t size ) +-{ +- /* The cast to (char *) in the following accommodates both +- * implementations that use char* generic pointers, and those +- * that use void* generic pointers. It works with the latter +- * because both ANSI C and C++ allow castless assignment from +- * any pointer type to void*, and deal with argument conversions +- * as though doing an assignment. +- */ +- return (void *) realloc( (char *) ptr, size ); +-} +- +-void yyfree (void * ptr ) +-{ +- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +-} +- +-#define YYTABLES_NAME "yytables" +- +-#line 94 "deflex.l" +- +- +-#ifndef yywrap +-/* Needed for lex, though not flex. */ +-int yywrap(void) { return 1; } +-#endif +- +diff -Nur binutils-2.24.orig/binutils/defparse.c binutils-2.24/binutils/defparse.c +--- binutils-2.24.orig/binutils/defparse.c 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/defparse.c 1970-01-01 01:00:00.000000000 +0100 +@@ -1,2142 +0,0 @@ +-/* A Bison parser, made by GNU Bison 2.3. */ +- +-/* Skeleton implementation for Bison's Yacc-like parsers in C +- +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +- 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., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. */ +- +-/* As a special exception, you may create a larger work that contains +- part or all of the Bison parser skeleton and distribute that work +- under terms of your choice, so long as that work isn't itself a +- parser generator using the skeleton or a modified version thereof +- as a parser skeleton. Alternatively, if you modify or redistribute +- the parser skeleton itself, you may (at your option) remove this +- special exception, which will cause the skeleton and the resulting +- Bison output files to be licensed under the GNU General Public +- License without this special exception. +- +- This special exception was added by the Free Software Foundation in +- version 2.2 of Bison. */ +- +-/* C LALR(1) parser skeleton written by Richard Stallman, by +- simplifying the original so-called "semantic" parser. */ +- +-/* All symbols defined below should begin with yy or YY, to avoid +- infringing on user name space. This should be done even for local +- variables, as they might otherwise be expanded by user macros. +- There are some unavoidable exceptions within include files to +- define necessary library symbols; they are noted "INFRINGES ON +- USER NAME SPACE" below. */ +- +-/* Identify Bison output. */ +-#define YYBISON 1 +- +-/* Bison version. */ +-#define YYBISON_VERSION "2.3" +- +-/* Skeleton name. */ +-#define YYSKELETON_NAME "yacc.c" +- +-/* Pure parsers. */ +-#define YYPURE 0 +- +-/* Using locations. */ +-#define YYLSP_NEEDED 0 +- +- +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- NAME = 258, +- LIBRARY = 259, +- DESCRIPTION = 260, +- STACKSIZE = 261, +- HEAPSIZE = 262, +- CODE = 263, +- DATA = 264, +- SECTIONS = 265, +- EXPORTS = 266, +- IMPORTS = 267, +- VERSIONK = 268, +- BASE = 269, +- CONSTANT = 270, +- READ = 271, +- WRITE = 272, +- EXECUTE = 273, +- SHARED = 274, +- NONSHARED = 275, +- NONAME = 276, +- PRIVATE = 277, +- SINGLE = 278, +- MULTIPLE = 279, +- INITINSTANCE = 280, +- INITGLOBAL = 281, +- TERMINSTANCE = 282, +- TERMGLOBAL = 283, +- EQUAL = 284, +- ID = 285, +- NUMBER = 286 +- }; +-#endif +-/* Tokens. */ +-#define NAME 258 +-#define LIBRARY 259 +-#define DESCRIPTION 260 +-#define STACKSIZE 261 +-#define HEAPSIZE 262 +-#define CODE 263 +-#define DATA 264 +-#define SECTIONS 265 +-#define EXPORTS 266 +-#define IMPORTS 267 +-#define VERSIONK 268 +-#define BASE 269 +-#define CONSTANT 270 +-#define READ 271 +-#define WRITE 272 +-#define EXECUTE 273 +-#define SHARED 274 +-#define NONSHARED 275 +-#define NONAME 276 +-#define PRIVATE 277 +-#define SINGLE 278 +-#define MULTIPLE 279 +-#define INITINSTANCE 280 +-#define INITGLOBAL 281 +-#define TERMINSTANCE 282 +-#define TERMGLOBAL 283 +-#define EQUAL 284 +-#define ID 285 +-#define NUMBER 286 +- +- +- +- +-/* Copy the first part of user declarations. */ +-#line 1 "defparse.y" +- /* defparse.y - parser for .def files */ +- +-/* Copyright 1995, 1997, 1998, 1999, 2001, 2004, 2005, 2007 +- Free Software Foundation, Inc. +- +- 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 3 of the License, or +- (at your option) any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +- MA 02110-1301, USA. */ +- +-#include "sysdep.h" +-#include "bfd.h" +-#include "libiberty.h" +-#include "dlltool.h" +- +- +-/* Enabling traces. */ +-#ifndef YYDEBUG +-# define YYDEBUG 0 +-#endif +- +-/* Enabling verbose error messages. */ +-#ifdef YYERROR_VERBOSE +-# undef YYERROR_VERBOSE +-# define YYERROR_VERBOSE 1 +-#else +-# define YYERROR_VERBOSE 0 +-#endif +- +-/* Enabling the token table. */ +-#ifndef YYTOKEN_TABLE +-# define YYTOKEN_TABLE 0 +-#endif +- +-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +-typedef union YYSTYPE +-#line 29 "defparse.y" +-{ +- char *id; +- const char *id_const; +- int number; +-} +-/* Line 193 of yacc.c. */ +-#line 192 "defparse.c" +- YYSTYPE; +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +- +- +-/* Copy the second part of user declarations. */ +- +- +-/* Line 216 of yacc.c. */ +-#line 205 "defparse.c" +- +-#ifdef short +-# undef short +-#endif +- +-#ifdef YYTYPE_UINT8 +-typedef YYTYPE_UINT8 yytype_uint8; +-#else +-typedef unsigned char yytype_uint8; +-#endif +- +-#ifdef YYTYPE_INT8 +-typedef YYTYPE_INT8 yytype_int8; +-#elif (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-typedef signed char yytype_int8; +-#else +-typedef short int yytype_int8; +-#endif +- +-#ifdef YYTYPE_UINT16 +-typedef YYTYPE_UINT16 yytype_uint16; +-#else +-typedef unsigned short int yytype_uint16; +-#endif +- +-#ifdef YYTYPE_INT16 +-typedef YYTYPE_INT16 yytype_int16; +-#else +-typedef short int yytype_int16; +-#endif +- +-#ifndef YYSIZE_T +-# ifdef __SIZE_TYPE__ +-# define YYSIZE_T __SIZE_TYPE__ +-# elif defined size_t +-# define YYSIZE_T size_t +-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYSIZE_T size_t +-# else +-# define YYSIZE_T unsigned int +-# endif +-#endif +- +-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) +- +-#ifndef YY_ +-# if defined YYENABLE_NLS && YYENABLE_NLS +-# if ENABLE_NLS +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YY_(msgid) dgettext ("bison-runtime", msgid) +-# endif +-# endif +-# ifndef YY_ +-# define YY_(msgid) msgid +-# endif +-#endif +- +-/* Suppress unused-variable warnings by "using" E. */ +-#if ! defined lint || defined __GNUC__ +-# define YYUSE(e) ((void) (e)) +-#else +-# define YYUSE(e) /* empty */ +-#endif +- +-/* Identity function, used to suppress warnings about constant conditions. */ +-#ifndef lint +-# define YYID(n) (n) +-#else +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static int +-YYID (int i) +-#else +-static int +-YYID (i) +- int i; +-#endif +-{ +- return i; +-} +-#endif +- +-#if ! defined yyoverflow || YYERROR_VERBOSE +- +-/* The parser invokes alloca or malloc; define the necessary symbols. */ +- +-# ifdef YYSTACK_USE_ALLOCA +-# if YYSTACK_USE_ALLOCA +-# ifdef __GNUC__ +-# define YYSTACK_ALLOC __builtin_alloca +-# elif defined __BUILTIN_VA_ARG_INCR +-# include /* INFRINGES ON USER NAME SPACE */ +-# elif defined _AIX +-# define YYSTACK_ALLOC __alloca +-# elif defined _MSC_VER +-# include /* INFRINGES ON USER NAME SPACE */ +-# define alloca _alloca +-# else +-# define YYSTACK_ALLOC alloca +-# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-# include /* INFRINGES ON USER NAME SPACE */ +-# ifndef _STDLIB_H +-# define _STDLIB_H 1 +-# endif +-# endif +-# endif +-# endif +-# endif +- +-# ifdef YYSTACK_ALLOC +- /* Pacify GCC's `empty if-body' warning. */ +-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +-# ifndef YYSTACK_ALLOC_MAXIMUM +- /* The OS might guarantee only one guard page at the bottom of the stack, +- and a page size can be as small as 4096 bytes. So we cannot safely +- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number +- to allow for a few compiler-allocated temporary stack slots. */ +-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +-# endif +-# else +-# define YYSTACK_ALLOC YYMALLOC +-# define YYSTACK_FREE YYFREE +-# ifndef YYSTACK_ALLOC_MAXIMUM +-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +-# endif +-# if (defined __cplusplus && ! defined _STDLIB_H \ +- && ! ((defined YYMALLOC || defined malloc) \ +- && (defined YYFREE || defined free))) +-# include /* INFRINGES ON USER NAME SPACE */ +-# ifndef _STDLIB_H +-# define _STDLIB_H 1 +-# endif +-# endif +-# ifndef YYMALLOC +-# define YYMALLOC malloc +-# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +-# endif +-# endif +-# ifndef YYFREE +-# define YYFREE free +-# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-void free (void *); /* INFRINGES ON USER NAME SPACE */ +-# endif +-# endif +-# endif +-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ +- +- +-#if (! defined yyoverflow \ +- && (! defined __cplusplus \ +- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) +- +-/* A type that is properly aligned for any stack member. */ +-union yyalloc +-{ +- yytype_int16 yyss; +- YYSTYPE yyvs; +- }; +- +-/* The size of the maximum gap between one aligned stack and the next. */ +-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +- +-/* The size of an array large to enough to hold all stacks, each with +- N elements. */ +-# define YYSTACK_BYTES(N) \ +- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ +- + YYSTACK_GAP_MAXIMUM) +- +-/* Copy COUNT objects from FROM to TO. The source and destination do +- not overlap. */ +-# ifndef YYCOPY +-# if defined __GNUC__ && 1 < __GNUC__ +-# define YYCOPY(To, From, Count) \ +- __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +-# else +-# define YYCOPY(To, From, Count) \ +- do \ +- { \ +- YYSIZE_T yyi; \ +- for (yyi = 0; yyi < (Count); yyi++) \ +- (To)[yyi] = (From)[yyi]; \ +- } \ +- while (YYID (0)) +-# endif +-# endif +- +-/* Relocate STACK from its old location to the new one. The +- local variables YYSIZE and YYSTACKSIZE give the old and new number of +- elements in the stack, and YYPTR gives the new location of the +- stack. Advance YYPTR to a properly aligned location for the next +- stack. */ +-# define YYSTACK_RELOCATE(Stack) \ +- do \ +- { \ +- YYSIZE_T yynewbytes; \ +- YYCOPY (&yyptr->Stack, Stack, yysize); \ +- Stack = &yyptr->Stack; \ +- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ +- yyptr += yynewbytes / sizeof (*yyptr); \ +- } \ +- while (YYID (0)) +- +-#endif +- +-/* YYFINAL -- State number of the termination state. */ +-#define YYFINAL 66 +-/* YYLAST -- Last index in YYTABLE. */ +-#define YYLAST 141 +- +-/* YYNTOKENS -- Number of terminals. */ +-#define YYNTOKENS 36 +-/* YYNNTS -- Number of nonterminals. */ +-#define YYNNTS 26 +-/* YYNRULES -- Number of rules. */ +-#define YYNRULES 98 +-/* YYNRULES -- Number of states. */ +-#define YYNSTATES 139 +- +-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +-#define YYUNDEFTOK 2 +-#define YYMAXUTOK 286 +- +-#define YYTRANSLATE(YYX) \ +- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) +- +-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +-static const yytype_uint8 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, 2, 2, 2, +- 2, 2, 2, 2, 34, 2, 32, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 33, 2, 2, 35, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 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, 24, +- 25, 26, 27, 28, 29, 30, 31 +-}; +- +-#if YYDEBUG +-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in +- YYRHS. */ +-static const yytype_uint16 yyprhs[] = +-{ +- 0, 0, 3, 6, 8, 12, 17, 20, 23, 27, +- 31, 34, 37, 40, 43, 46, 51, 52, 55, 64, +- 67, 69, 78, 87, 94, 101, 108, 115, 120, 125, +- 128, 130, 133, 137, 139, 141, 142, 145, 146, 148, +- 150, 152, 154, 156, 158, 160, 162, 163, 165, 166, +- 168, 169, 171, 172, 174, 176, 178, 180, 182, 184, +- 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, +- 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, +- 227, 230, 234, 238, 240, 241, 244, 245, 248, 249, +- 252, 253, 257, 258, 259, 263, 265, 267, 269 +-}; +- +-/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +-static const yytype_int8 yyrhs[] = +-{ +- 37, 0, -1, 37, 38, -1, 38, -1, 3, 55, +- 59, -1, 4, 55, 59, 60, -1, 11, 39, -1, +- 5, 30, -1, 6, 31, 47, -1, 7, 31, 47, +- -1, 8, 45, -1, 9, 45, -1, 10, 43, -1, +- 12, 41, -1, 13, 31, -1, 13, 31, 32, 31, +- -1, -1, 39, 40, -1, 30, 58, 56, 50, 49, +- 51, 52, 57, -1, 41, 42, -1, 42, -1, 30, +- 33, 30, 32, 30, 32, 30, 57, -1, 30, 33, +- 30, 32, 30, 32, 31, 57, -1, 30, 33, 30, +- 32, 30, 57, -1, 30, 33, 30, 32, 31, 57, +- -1, 30, 32, 30, 32, 30, 57, -1, 30, 32, +- 30, 32, 31, 57, -1, 30, 32, 30, 57, -1, +- 30, 32, 31, 57, -1, 43, 44, -1, 44, -1, +- 30, 45, -1, 45, 46, 48, -1, 48, -1, 34, +- -1, -1, 34, 31, -1, -1, 16, -1, 17, -1, +- 18, -1, 19, -1, 20, -1, 23, -1, 24, -1, +- 15, -1, -1, 21, -1, -1, 9, -1, -1, 22, +- -1, -1, 3, -1, 5, -1, 6, -1, 7, -1, +- 8, -1, 9, -1, 10, -1, 11, -1, 12, -1, +- 13, -1, 14, -1, 15, -1, 21, -1, 22, -1, +- 16, -1, 17, -1, 18, -1, 19, -1, 20, -1, +- 23, -1, 24, -1, 25, -1, 26, -1, 27, -1, +- 28, -1, 30, -1, 32, 53, -1, 32, 54, -1, +- 53, 32, 54, -1, 30, 32, 54, -1, 54, -1, +- -1, 35, 31, -1, -1, 29, 54, -1, -1, 33, +- 54, -1, -1, 14, 33, 31, -1, -1, -1, 60, +- 46, 61, -1, 25, -1, 26, -1, 27, -1, 28, +- -1 +-}; +- +-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +-static const yytype_uint8 yyrline[] = +-{ +- 0, 49, 49, 50, 54, 55, 56, 57, 58, 59, +- 60, 61, 62, 63, 64, 65, 69, 71, 75, 80, +- 81, 85, 87, 89, 91, 93, 95, 97, 99, 104, +- 105, 109, 113, 114, 118, 119, 121, 122, 126, 127, +- 128, 129, 130, 131, 132, 136, 137, 141, 142, 146, +- 147, 151, 152, 155, 160, 161, 162, 163, 164, 165, +- 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, +- 176, 177, 178, 179, 180, 181, 182, 183, 186, 187, +- 193, 199, 205, 212, 213, 217, 218, 222, 223, 227, +- 228, 231, 232, 235, 237, 241, 242, 243, 244 +-}; +-#endif +- +-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +- First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +-static const char *const yytname[] = +-{ +- "$end", "error", "$undefined", "NAME", "LIBRARY", "DESCRIPTION", +- "STACKSIZE", "HEAPSIZE", "CODE", "DATA", "SECTIONS", "EXPORTS", +- "IMPORTS", "VERSIONK", "BASE", "CONSTANT", "READ", "WRITE", "EXECUTE", +- "SHARED", "NONSHARED", "NONAME", "PRIVATE", "SINGLE", "MULTIPLE", +- "INITINSTANCE", "INITGLOBAL", "TERMINSTANCE", "TERMGLOBAL", "EQUAL", +- "ID", "NUMBER", "'.'", "'='", "','", "'@'", "$accept", "start", +- "command", "explist", "expline", "implist", "impline", "seclist", +- "secline", "attr_list", "opt_comma", "opt_number", "attr", +- "opt_CONSTANT", "opt_NONAME", "opt_DATA", "opt_PRIVATE", +- "keyword_as_name", "opt_name2", "opt_name", "opt_ordinal", +- "opt_import_name", "opt_equal_name", "opt_base", "option_list", "option", 0 +-}; +-#endif +- +-# ifdef YYPRINT +-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to +- token YYLEX-NUM. */ +-static const yytype_uint16 yytoknum[] = +-{ +- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, +- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, +- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, +- 285, 286, 46, 61, 44, 64 +-}; +-# endif +- +-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +-static const yytype_uint8 yyr1[] = +-{ +- 0, 36, 37, 37, 38, 38, 38, 38, 38, 38, +- 38, 38, 38, 38, 38, 38, 39, 39, 40, 41, +- 41, 42, 42, 42, 42, 42, 42, 42, 42, 43, +- 43, 44, 45, 45, 46, 46, 47, 47, 48, 48, +- 48, 48, 48, 48, 48, 49, 49, 50, 50, 51, +- 51, 52, 52, 53, 53, 53, 53, 53, 53, 53, +- 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, +- 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, +- 54, 54, 54, 55, 55, 56, 56, 57, 57, 58, +- 58, 59, 59, 60, 60, 61, 61, 61, 61 +-}; +- +-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +-static const yytype_uint8 yyr2[] = +-{ +- 0, 2, 2, 1, 3, 4, 2, 2, 3, 3, +- 2, 2, 2, 2, 2, 4, 0, 2, 8, 2, +- 1, 8, 8, 6, 6, 6, 6, 4, 4, 2, +- 1, 2, 3, 1, 1, 0, 2, 0, 1, 1, +- 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, +- 0, 1, 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, 1, 1, 2, +- 2, 3, 3, 1, 0, 2, 0, 2, 0, 2, +- 0, 3, 0, 0, 3, 1, 1, 1, 1 +-}; +- +-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state +- STATE-NUM when YYTABLE doesn't specify something else to do. Zero +- means the default is an error. */ +-static const yytype_uint8 yydefact[] = +-{ +- 0, 84, 84, 0, 0, 0, 0, 0, 0, 16, +- 0, 0, 0, 3, 53, 54, 55, 56, 57, 58, +- 59, 60, 61, 62, 63, 64, 67, 68, 69, 70, +- 71, 65, 66, 72, 73, 74, 75, 76, 77, 78, +- 0, 0, 83, 92, 92, 7, 37, 37, 38, 39, +- 40, 41, 42, 43, 44, 10, 33, 11, 0, 12, +- 30, 6, 0, 13, 20, 14, 1, 2, 0, 79, +- 80, 0, 0, 4, 93, 0, 8, 9, 34, 0, +- 31, 29, 90, 17, 0, 0, 19, 0, 82, 81, +- 0, 5, 36, 32, 0, 86, 88, 88, 0, 15, +- 91, 0, 89, 0, 48, 0, 0, 27, 28, 0, +- 95, 96, 97, 98, 94, 85, 47, 46, 87, 88, +- 88, 88, 88, 45, 50, 25, 26, 0, 23, 24, +- 49, 52, 88, 88, 51, 88, 21, 22, 18 +-}; +- +-/* YYDEFGOTO[NTERM-NUM]. */ +-static const yytype_int16 yydefgoto[] = +-{ +- -1, 12, 13, 61, 83, 63, 64, 59, 60, 55, +- 79, 76, 56, 124, 117, 131, 135, 41, 42, 43, +- 104, 107, 95, 73, 91, 114 +-}; +- +-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing +- STATE-NUM. */ +-#define YYPACT_NINF -96 +-static const yytype_int8 yypact[] = +-{ +- 38, 61, 61, -22, -1, 8, 39, 39, -7, -96, +- 23, 59, 92, -96, -96, -96, -96, -96, -96, -96, +- -96, -96, -96, -96, -96, -96, -96, -96, -96, -96, +- -96, -96, -96, -96, -96, -96, -96, -96, -96, 62, +- 61, 79, -96, 96, 96, -96, 80, 80, -96, -96, +- -96, -96, -96, -96, -96, -13, -96, -13, 39, -7, +- -96, 82, 1, 23, -96, 81, -96, -96, 61, 79, +- -96, 61, 83, -96, -96, 84, -96, -96, -96, 39, +- -13, -96, 85, -96, 5, 87, -96, 88, -96, -96, +- 89, -12, -96, -96, 61, 86, -20, 93, 91, -96, +- -96, -8, -96, 94, 103, 61, 30, -96, -96, 76, +- -96, -96, -96, -96, -96, -96, -96, 111, -96, 93, +- 93, 0, 93, -96, 118, -96, -96, 78, -96, -96, +- -96, 106, 93, 93, -96, 93, -96, -96, -96 +-}; +- +-/* YYPGOTO[NTERM-NUM]. */ +-static const yytype_int16 yypgoto[] = +-{ +- -96, -96, 117, -96, -96, -96, 67, -96, 72, -6, +- 41, 90, 54, -96, -96, -96, -96, 95, -40, 132, +- -96, -95, -96, 97, -96, -96 +-}; +- +-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If +- positive, shift that token. If negative, reduce the rule which +- number is the opposite. If zero, do what YYDEFACT says. +- If YYTABLE_NINF, syntax error. */ +-#define YYTABLE_NINF -36 +-static const yytype_int16 yytable[] = +-{ +- 70, 57, 108, -35, -35, -35, -35, -35, 45, 105, +- -35, -35, 106, -35, -35, -35, -35, 110, 111, 112, +- 113, 78, 78, 58, 125, 126, 128, 129, 88, 105, +- 46, 89, 127, 84, 85, 96, 97, 136, 137, 47, +- 138, 1, 2, 3, 4, 5, 6, 7, 8, 9, +- 10, 11, 80, 62, 102, 48, 49, 50, 51, 52, +- 119, 120, 53, 54, 14, 118, 15, 16, 17, 18, +- 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, +- 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, +- 65, 39, 66, 40, 68, 1, 2, 3, 4, 5, +- 6, 7, 8, 9, 10, 11, 121, 122, 132, 133, +- 72, 71, 82, 87, 75, 92, 90, 98, 94, 99, +- 100, 103, 105, 109, 116, 115, 123, 130, 134, 67, +- 86, 81, 101, 93, 44, 69, 0, 77, 0, 0, +- 0, 74 +-}; +- +-static const yytype_int16 yycheck[] = +-{ +- 40, 7, 97, 16, 17, 18, 19, 20, 30, 29, +- 23, 24, 32, 25, 26, 27, 28, 25, 26, 27, +- 28, 34, 34, 30, 119, 120, 121, 122, 68, 29, +- 31, 71, 32, 32, 33, 30, 31, 132, 133, 31, +- 135, 3, 4, 5, 6, 7, 8, 9, 10, 11, +- 12, 13, 58, 30, 94, 16, 17, 18, 19, 20, +- 30, 31, 23, 24, 3, 105, 5, 6, 7, 8, +- 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, +- 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, +- 31, 30, 0, 32, 32, 3, 4, 5, 6, 7, +- 8, 9, 10, 11, 12, 13, 30, 31, 30, 31, +- 14, 32, 30, 32, 34, 31, 33, 30, 33, 31, +- 31, 35, 29, 32, 21, 31, 15, 9, 22, 12, +- 63, 59, 91, 79, 2, 40, -1, 47, -1, -1, +- -1, 44 +-}; +- +-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing +- symbol of state STATE-NUM. */ +-static const yytype_uint8 yystos[] = +-{ +- 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, +- 12, 13, 37, 38, 3, 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, +- 32, 53, 54, 55, 55, 30, 31, 31, 16, 17, +- 18, 19, 20, 23, 24, 45, 48, 45, 30, 43, +- 44, 39, 30, 41, 42, 31, 0, 38, 32, 53, +- 54, 32, 14, 59, 59, 34, 47, 47, 34, 46, +- 45, 44, 30, 40, 32, 33, 42, 32, 54, 54, +- 33, 60, 31, 48, 33, 58, 30, 31, 30, 31, +- 31, 46, 54, 35, 56, 29, 32, 57, 57, 32, +- 25, 26, 27, 28, 61, 31, 21, 50, 54, 30, +- 31, 30, 31, 15, 49, 57, 57, 32, 57, 57, +- 9, 51, 30, 31, 22, 52, 57, 57, 57 +-}; +- +-#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 yyerrorlab +- +- +-/* 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); \ +- yytoken = YYTRANSLATE (yychar); \ +- YYPOPSTACK (1); \ +- goto yybackup; \ +- } \ +- else \ +- { \ +- yyerror (YY_("syntax error: cannot back up")); \ +- YYERROR; \ +- } \ +-while (YYID (0)) +- +- +-#define YYTERROR 1 +-#define YYERRCODE 256 +- +- +-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. +- If N is 0, then set CURRENT to the empty location which ends +- the previous symbol: RHS[0] (always defined). */ +- +-#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +-#ifndef YYLLOC_DEFAULT +-# define YYLLOC_DEFAULT(Current, Rhs, N) \ +- do \ +- if (YYID (N)) \ +- { \ +- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ +- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ +- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ +- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ +- } \ +- else \ +- { \ +- (Current).first_line = (Current).last_line = \ +- YYRHSLOC (Rhs, 0).last_line; \ +- (Current).first_column = (Current).last_column = \ +- YYRHSLOC (Rhs, 0).last_column; \ +- } \ +- while (YYID (0)) +-#endif +- +- +-/* YY_LOCATION_PRINT -- Print the location on the stream. +- This macro was not mandated originally: define only if we know +- we won't break user code: when these are the locations we know. */ +- +-#ifndef YY_LOCATION_PRINT +-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL +-# define YY_LOCATION_PRINT(File, Loc) \ +- fprintf (File, "%d.%d-%d.%d", \ +- (Loc).first_line, (Loc).first_column, \ +- (Loc).last_line, (Loc).last_column) +-# else +-# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +-# endif +-#endif +- +- +-/* YYLEX -- calling `yylex' with the right arguments. */ +- +-#ifdef YYLEX_PARAM +-# define YYLEX yylex (YYLEX_PARAM) +-#else +-# define YYLEX yylex () +-#endif +- +-/* Enable debugging if requested. */ +-#if YYDEBUG +- +-# ifndef YYFPRINTF +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYFPRINTF fprintf +-# endif +- +-# define YYDPRINTF(Args) \ +-do { \ +- if (yydebug) \ +- YYFPRINTF Args; \ +-} while (YYID (0)) +- +-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +-do { \ +- if (yydebug) \ +- { \ +- YYFPRINTF (stderr, "%s ", Title); \ +- yy_symbol_print (stderr, \ +- Type, Value); \ +- YYFPRINTF (stderr, "\n"); \ +- } \ +-} while (YYID (0)) +- +- +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-/*ARGSUSED*/ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +-#else +-static void +-yy_symbol_value_print (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE const * const yyvaluep; +-#endif +-{ +- if (!yyvaluep) +- return; +-# ifdef YYPRINT +- if (yytype < YYNTOKENS) +- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +-# else +- YYUSE (yyoutput); +-# endif +- switch (yytype) +- { +- default: +- break; +- } +-} +- +- +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +-#else +-static void +-yy_symbol_print (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE const * const yyvaluep; +-#endif +-{ +- if (yytype < YYNTOKENS) +- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +- else +- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); +- +- yy_symbol_value_print (yyoutput, yytype, yyvaluep); +- YYFPRINTF (yyoutput, ")"); +-} +- +-/*------------------------------------------------------------------. +-| yy_stack_print -- Print the state stack from its BOTTOM up to its | +-| TOP (included). | +-`------------------------------------------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +-#else +-static void +-yy_stack_print (bottom, top) +- yytype_int16 *bottom; +- yytype_int16 *top; +-#endif +-{ +- YYFPRINTF (stderr, "Stack now"); +- for (; bottom <= top; ++bottom) +- YYFPRINTF (stderr, " %d", *bottom); +- YYFPRINTF (stderr, "\n"); +-} +- +-# define YY_STACK_PRINT(Bottom, Top) \ +-do { \ +- if (yydebug) \ +- yy_stack_print ((Bottom), (Top)); \ +-} while (YYID (0)) +- +- +-/*------------------------------------------------. +-| Report that the YYRULE is going to be reduced. | +-`------------------------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +-#else +-static void +-yy_reduce_print (yyvsp, yyrule) +- YYSTYPE *yyvsp; +- int yyrule; +-#endif +-{ +- int yynrhs = yyr2[yyrule]; +- int yyi; +- unsigned long int yylno = yyrline[yyrule]; +- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", +- yyrule - 1, yylno); +- /* The symbols being reduced. */ +- for (yyi = 0; yyi < yynrhs; yyi++) +- { +- fprintf (stderr, " $%d = ", yyi + 1); +- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], +- &(yyvsp[(yyi + 1) - (yynrhs)]) +- ); +- fprintf (stderr, "\n"); +- } +-} +- +-# define YY_REDUCE_PRINT(Rule) \ +-do { \ +- if (yydebug) \ +- yy_reduce_print (yyvsp, Rule); \ +-} while (YYID (0)) +- +-/* Nonzero means print parse trace. It is left uninitialized so that +- multiple parsers can coexist. */ +-int yydebug; +-#else /* !YYDEBUG */ +-# define YYDPRINTF(Args) +-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +-# define YY_STACK_PRINT(Bottom, Top) +-# define YY_REDUCE_PRINT(Rule) +-#endif /* !YYDEBUG */ +- +- +-/* YYINITDEPTH -- initial size of the parser's stacks. */ +-#ifndef YYINITDEPTH +-# define YYINITDEPTH 200 +-#endif +- +-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only +- if the built-in stack extension method is used). +- +- Do not make this value too large; the results are undefined if +- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) +- evaluated with infinite-precision integer arithmetic. */ +- +-#ifndef YYMAXDEPTH +-# define YYMAXDEPTH 10000 +-#endif +- +- +- +-#if YYERROR_VERBOSE +- +-# ifndef yystrlen +-# if defined __GLIBC__ && defined _STRING_H +-# define yystrlen strlen +-# else +-/* Return the length of YYSTR. */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static YYSIZE_T +-yystrlen (const char *yystr) +-#else +-static YYSIZE_T +-yystrlen (yystr) +- const char *yystr; +-#endif +-{ +- YYSIZE_T yylen; +- for (yylen = 0; yystr[yylen]; yylen++) +- continue; +- return yylen; +-} +-# endif +-# endif +- +-# ifndef yystpcpy +-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +-# define yystpcpy stpcpy +-# else +-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in +- YYDEST. */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static char * +-yystpcpy (char *yydest, const char *yysrc) +-#else +-static char * +-yystpcpy (yydest, yysrc) +- char *yydest; +- const char *yysrc; +-#endif +-{ +- char *yyd = yydest; +- const char *yys = yysrc; +- +- while ((*yyd++ = *yys++) != '\0') +- continue; +- +- return yyd - 1; +-} +-# endif +-# endif +- +-# ifndef yytnamerr +-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary +- quotes and backslashes, so that it's suitable for yyerror. The +- heuristic is that double-quoting is unnecessary unless the string +- contains an apostrophe, a comma, or backslash (other than +- backslash-backslash). YYSTR is taken from yytname. If YYRES is +- null, do not copy; instead, return the length of what the result +- would have been. */ +-static YYSIZE_T +-yytnamerr (char *yyres, const char *yystr) +-{ +- if (*yystr == '"') +- { +- YYSIZE_T yyn = 0; +- char const *yyp = yystr; +- +- for (;;) +- switch (*++yyp) +- { +- case '\'': +- case ',': +- goto do_not_strip_quotes; +- +- case '\\': +- if (*++yyp != '\\') +- goto do_not_strip_quotes; +- /* Fall through. */ +- default: +- if (yyres) +- yyres[yyn] = *yyp; +- yyn++; +- break; +- +- case '"': +- if (yyres) +- yyres[yyn] = '\0'; +- return yyn; +- } +- do_not_strip_quotes: ; +- } +- +- if (! yyres) +- return yystrlen (yystr); +- +- return yystpcpy (yyres, yystr) - yyres; +-} +-# endif +- +-/* Copy into YYRESULT an error message about the unexpected token +- YYCHAR while in state YYSTATE. Return the number of bytes copied, +- including the terminating null byte. If YYRESULT is null, do not +- copy anything; just return the number of bytes that would be +- copied. As a special case, return 0 if an ordinary "syntax error" +- message will do. Return YYSIZE_MAXIMUM if overflow occurs during +- size calculation. */ +-static YYSIZE_T +-yysyntax_error (char *yyresult, int yystate, int yychar) +-{ +- int yyn = yypact[yystate]; +- +- if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) +- return 0; +- else +- { +- int yytype = YYTRANSLATE (yychar); +- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); +- YYSIZE_T yysize = yysize0; +- YYSIZE_T yysize1; +- int yysize_overflow = 0; +- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; +- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; +- int yyx; +- +-# if 0 +- /* This is so xgettext sees the translatable formats that are +- constructed on the fly. */ +- YY_("syntax error, unexpected %s"); +- YY_("syntax error, unexpected %s, expecting %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s or %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +-# endif +- char *yyfmt; +- char const *yyf; +- static char const yyunexpected[] = "syntax error, unexpected %s"; +- static char const yyexpecting[] = ", expecting %s"; +- static char const yyor[] = " or %s"; +- char yyformat[sizeof yyunexpected +- + sizeof yyexpecting - 1 +- + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) +- * (sizeof yyor - 1))]; +- char const *yyprefix = yyexpecting; +- +- /* Start YYX at -YYN if negative to avoid negative indexes in +- YYCHECK. */ +- int yyxbegin = yyn < 0 ? -yyn : 0; +- +- /* Stay within bounds of both yycheck and yytname. */ +- int yychecklim = YYLAST - yyn + 1; +- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; +- int yycount = 1; +- +- yyarg[0] = yytname[yytype]; +- yyfmt = yystpcpy (yyformat, yyunexpected); +- +- for (yyx = yyxbegin; yyx < yyxend; ++yyx) +- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) +- { +- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) +- { +- yycount = 1; +- yysize = yysize0; +- yyformat[sizeof yyunexpected - 1] = '\0'; +- break; +- } +- yyarg[yycount++] = yytname[yyx]; +- yysize1 = yysize + yytnamerr (0, yytname[yyx]); +- yysize_overflow |= (yysize1 < yysize); +- yysize = yysize1; +- yyfmt = yystpcpy (yyfmt, yyprefix); +- yyprefix = yyor; +- } +- +- yyf = YY_(yyformat); +- yysize1 = yysize + yystrlen (yyf); +- yysize_overflow |= (yysize1 < yysize); +- yysize = yysize1; +- +- if (yysize_overflow) +- return YYSIZE_MAXIMUM; +- +- if (yyresult) +- { +- /* Avoid sprintf, as that infringes on the user's name space. +- Don't have undefined behavior even if the translation +- produced a string with the wrong number of "%s"s. */ +- char *yyp = yyresult; +- int yyi = 0; +- while ((*yyp = *yyf) != '\0') +- { +- if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) +- { +- yyp += yytnamerr (yyp, yyarg[yyi++]); +- yyf += 2; +- } +- else +- { +- yyp++; +- yyf++; +- } +- } +- } +- return yysize; +- } +-} +-#endif /* YYERROR_VERBOSE */ +- +- +-/*-----------------------------------------------. +-| Release the memory associated to this symbol. | +-`-----------------------------------------------*/ +- +-/*ARGSUSED*/ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +-#else +-static void +-yydestruct (yymsg, yytype, yyvaluep) +- const char *yymsg; +- int yytype; +- YYSTYPE *yyvaluep; +-#endif +-{ +- YYUSE (yyvaluep); +- +- if (!yymsg) +- yymsg = "Deleting"; +- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); +- +- switch (yytype) +- { +- +- default: +- break; +- } +-} +- +- +-/* Prevent warnings from -Wmissing-prototypes. */ +- +-#ifdef YYPARSE_PARAM +-#if defined __STDC__ || defined __cplusplus +-int yyparse (void *YYPARSE_PARAM); +-#else +-int yyparse (); +-#endif +-#else /* ! YYPARSE_PARAM */ +-#if defined __STDC__ || defined __cplusplus +-int yyparse (void); +-#else +-int yyparse (); +-#endif +-#endif /* ! YYPARSE_PARAM */ +- +- +- +-/* The look-ahead symbol. */ +-int yychar; +- +-/* The semantic value of the look-ahead symbol. */ +-YYSTYPE yylval; +- +-/* Number of syntax errors so far. */ +-int yynerrs; +- +- +- +-/*----------. +-| yyparse. | +-`----------*/ +- +-#ifdef YYPARSE_PARAM +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-int +-yyparse (void *YYPARSE_PARAM) +-#else +-int +-yyparse (YYPARSE_PARAM) +- void *YYPARSE_PARAM; +-#endif +-#else /* ! YYPARSE_PARAM */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-int +-yyparse (void) +-#else +-int +-yyparse () +- +-#endif +-#endif +-{ +- +- int yystate; +- int yyn; +- int yyresult; +- /* Number of tokens to shift before error messages enabled. */ +- int yyerrstatus; +- /* Look-ahead token as an internal (translated) token number. */ +- int yytoken = 0; +-#if YYERROR_VERBOSE +- /* Buffer for error messages, and its allocated size. */ +- char yymsgbuf[128]; +- char *yymsg = yymsgbuf; +- YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +-#endif +- +- /* Three stacks and their tools: +- `yyss': related to states, +- `yyvs': related to semantic values, +- `yyls': related to locations. +- +- Refer to the stacks thru separate pointers, to allow yyoverflow +- to reallocate them elsewhere. */ +- +- /* The state stack. */ +- yytype_int16 yyssa[YYINITDEPTH]; +- yytype_int16 *yyss = yyssa; +- yytype_int16 *yyssp; +- +- /* The semantic value stack. */ +- YYSTYPE yyvsa[YYINITDEPTH]; +- YYSTYPE *yyvs = yyvsa; +- YYSTYPE *yyvsp; +- +- +- +-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) +- +- YYSIZE_T yystacksize = YYINITDEPTH; +- +- /* The variables used to return semantic value and location from the +- action routines. */ +- YYSTYPE yyval; +- +- +- /* The number of symbols on the RHS of the reduced rule. +- Keep to zero when no symbol should be popped. */ +- int yylen = 0; +- +- YYDPRINTF ((stderr, "Starting parse\n")); +- +- 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; +- yyvsp = yyvs; +- +- goto yysetstate; +- +-/*------------------------------------------------------------. +-| yynewstate -- Push a new state, which is found in yystate. | +-`------------------------------------------------------------*/ +- yynewstate: +- /* In all cases, when you get here, the value and location stacks +- have just been pushed. So pushing a state here evens the stacks. */ +- yyssp++; +- +- yysetstate: +- *yyssp = yystate; +- +- if (yyss + yystacksize - 1 <= yyssp) +- { +- /* Get the current used size of the three stacks, in elements. */ +- YYSIZE_T yysize = yyssp - yyss + 1; +- +-#ifdef yyoverflow +- { +- /* Give user a chance to reallocate the stack. Use copies of +- these so that the &'s don't force the real ones into +- memory. */ +- YYSTYPE *yyvs1 = yyvs; +- yytype_int16 *yyss1 = yyss; +- +- +- /* Each stack pointer address is followed by the size of the +- data in use in that stack, in bytes. This used to be a +- conditional around just the two extra args, but that might +- be undefined if yyoverflow is a macro. */ +- yyoverflow (YY_("memory exhausted"), +- &yyss1, yysize * sizeof (*yyssp), +- &yyvs1, yysize * sizeof (*yyvsp), +- +- &yystacksize); +- +- yyss = yyss1; +- yyvs = yyvs1; +- } +-#else /* no yyoverflow */ +-# ifndef YYSTACK_RELOCATE +- goto yyexhaustedlab; +-# else +- /* Extend the stack our own way. */ +- if (YYMAXDEPTH <= yystacksize) +- goto yyexhaustedlab; +- yystacksize *= 2; +- if (YYMAXDEPTH < yystacksize) +- yystacksize = YYMAXDEPTH; +- +- { +- yytype_int16 *yyss1 = yyss; +- union yyalloc *yyptr = +- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); +- if (! yyptr) +- goto yyexhaustedlab; +- YYSTACK_RELOCATE (yyss); +- YYSTACK_RELOCATE (yyvs); +- +-# undef YYSTACK_RELOCATE +- if (yyss1 != yyssa) +- YYSTACK_FREE (yyss1); +- } +-# endif +-#endif /* no yyoverflow */ +- +- yyssp = yyss + yysize - 1; +- yyvsp = yyvs + yysize - 1; +- +- +- YYDPRINTF ((stderr, "Stack size increased to %lu\n", +- (unsigned long int) yystacksize)); +- +- if (yyss + yystacksize - 1 <= yyssp) +- YYABORT; +- } +- +- YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +- +- goto yybackup; +- +-/*-----------. +-| yybackup. | +-`-----------*/ +-yybackup: +- +- /* Do appropriate processing given the current state. Read a +- look-ahead token if we need one and don't already have one. */ +- +- /* First try to decide what to do without reference to look-ahead token. */ +- yyn = yypact[yystate]; +- if (yyn == YYPACT_NINF) +- goto yydefault; +- +- /* Not known => get a look-ahead token if don't already have one. */ +- +- /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ +- if (yychar == YYEMPTY) +- { +- YYDPRINTF ((stderr, "Reading a token: ")); +- yychar = YYLEX; +- } +- +- if (yychar <= YYEOF) +- { +- yychar = yytoken = YYEOF; +- YYDPRINTF ((stderr, "Now at end of input.\n")); +- } +- else +- { +- yytoken = YYTRANSLATE (yychar); +- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); +- } +- +- /* If the proper action on seeing token YYTOKEN is to reduce or to +- detect an error, take that action. */ +- yyn += yytoken; +- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) +- goto yydefault; +- yyn = yytable[yyn]; +- if (yyn <= 0) +- { +- if (yyn == 0 || yyn == YYTABLE_NINF) +- goto yyerrlab; +- yyn = -yyn; +- goto yyreduce; +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- /* Count tokens shifted since error; after three, turn off error +- status. */ +- if (yyerrstatus) +- yyerrstatus--; +- +- /* Shift the look-ahead token. */ +- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); +- +- /* Discard the shifted token unless it is eof. */ +- if (yychar != YYEOF) +- yychar = YYEMPTY; +- +- yystate = yyn; +- *++yyvsp = yylval; +- +- goto yynewstate; +- +- +-/*-----------------------------------------------------------. +-| yydefault -- do the default action for the current state. | +-`-----------------------------------------------------------*/ +-yydefault: +- yyn = yydefact[yystate]; +- if (yyn == 0) +- goto yyerrlab; +- goto yyreduce; +- +- +-/*-----------------------------. +-| yyreduce -- Do a reduction. | +-`-----------------------------*/ +-yyreduce: +- /* yyn is the number of a rule to reduce with. */ +- yylen = yyr2[yyn]; +- +- /* If YYLEN is nonzero, implement the default value of the action: +- `$$ = $1'. +- +- Otherwise, the following line sets YYVAL to garbage. +- This behavior is undocumented and Bison +- users should not rely upon it. Assigning to YYVAL +- unconditionally makes the parser a bit smaller, and it avoids a +- GCC warning that YYVAL may be used uninitialized. */ +- yyval = yyvsp[1-yylen]; +- +- +- YY_REDUCE_PRINT (yyn); +- switch (yyn) +- { +- case 4: +-#line 54 "defparse.y" +- { def_name ((yyvsp[(2) - (3)].id), (yyvsp[(3) - (3)].number)); } +- break; +- +- case 5: +-#line 55 "defparse.y" +- { def_library ((yyvsp[(2) - (4)].id), (yyvsp[(3) - (4)].number)); } +- break; +- +- case 7: +-#line 57 "defparse.y" +- { def_description ((yyvsp[(2) - (2)].id));} +- break; +- +- case 8: +-#line 58 "defparse.y" +- { def_stacksize ((yyvsp[(2) - (3)].number), (yyvsp[(3) - (3)].number));} +- break; +- +- case 9: +-#line 59 "defparse.y" +- { def_heapsize ((yyvsp[(2) - (3)].number), (yyvsp[(3) - (3)].number));} +- break; +- +- case 10: +-#line 60 "defparse.y" +- { def_code ((yyvsp[(2) - (2)].number));} +- break; +- +- case 11: +-#line 61 "defparse.y" +- { def_data ((yyvsp[(2) - (2)].number));} +- break; +- +- case 14: +-#line 64 "defparse.y" +- { def_version ((yyvsp[(2) - (2)].number),0);} +- break; +- +- case 15: +-#line 65 "defparse.y" +- { def_version ((yyvsp[(2) - (4)].number),(yyvsp[(4) - (4)].number));} +- break; +- +- case 18: +-#line 77 "defparse.y" +- { def_exports ((yyvsp[(1) - (8)].id), (yyvsp[(2) - (8)].id), (yyvsp[(3) - (8)].number), (yyvsp[(4) - (8)].number), (yyvsp[(5) - (8)].number), (yyvsp[(6) - (8)].number), (yyvsp[(7) - (8)].number), (yyvsp[(8) - (8)].id));} +- break; +- +- case 21: +-#line 86 "defparse.y" +- { def_import ((yyvsp[(1) - (8)].id),(yyvsp[(3) - (8)].id),(yyvsp[(5) - (8)].id),(yyvsp[(7) - (8)].id), 0, (yyvsp[(8) - (8)].id)); } +- break; +- +- case 22: +-#line 88 "defparse.y" +- { def_import ((yyvsp[(1) - (8)].id),(yyvsp[(3) - (8)].id),(yyvsp[(5) - (8)].id), 0,(yyvsp[(7) - (8)].number), (yyvsp[(8) - (8)].id)); } +- break; +- +- case 23: +-#line 90 "defparse.y" +- { def_import ((yyvsp[(1) - (6)].id),(yyvsp[(3) - (6)].id), 0,(yyvsp[(5) - (6)].id), 0, (yyvsp[(6) - (6)].id)); } +- break; +- +- case 24: +-#line 92 "defparse.y" +- { def_import ((yyvsp[(1) - (6)].id),(yyvsp[(3) - (6)].id), 0, 0,(yyvsp[(5) - (6)].number), (yyvsp[(6) - (6)].id)); } +- break; +- +- case 25: +-#line 94 "defparse.y" +- { def_import ( 0,(yyvsp[(1) - (6)].id),(yyvsp[(3) - (6)].id),(yyvsp[(5) - (6)].id), 0, (yyvsp[(6) - (6)].id)); } +- break; +- +- case 26: +-#line 96 "defparse.y" +- { def_import ( 0,(yyvsp[(1) - (6)].id),(yyvsp[(3) - (6)].id), 0,(yyvsp[(5) - (6)].number), (yyvsp[(6) - (6)].id)); } +- break; +- +- case 27: +-#line 98 "defparse.y" +- { def_import ( 0,(yyvsp[(1) - (4)].id), 0,(yyvsp[(3) - (4)].id), 0, (yyvsp[(4) - (4)].id)); } +- break; +- +- case 28: +-#line 100 "defparse.y" +- { def_import ( 0,(yyvsp[(1) - (4)].id), 0, 0,(yyvsp[(3) - (4)].number), (yyvsp[(4) - (4)].id)); } +- break; +- +- case 31: +-#line 109 "defparse.y" +- { def_section ((yyvsp[(1) - (2)].id),(yyvsp[(2) - (2)].number));} +- break; +- +- case 36: +-#line 121 "defparse.y" +- { (yyval.number)=(yyvsp[(2) - (2)].number);} +- break; +- +- case 37: +-#line 122 "defparse.y" +- { (yyval.number)=-1;} +- break; +- +- case 38: +-#line 126 "defparse.y" +- { (yyval.number) = 1; } +- break; +- +- case 39: +-#line 127 "defparse.y" +- { (yyval.number) = 2; } +- break; +- +- case 40: +-#line 128 "defparse.y" +- { (yyval.number) = 4; } +- break; +- +- case 41: +-#line 129 "defparse.y" +- { (yyval.number) = 8; } +- break; +- +- case 42: +-#line 130 "defparse.y" +- { (yyval.number) = 0; } +- break; +- +- case 43: +-#line 131 "defparse.y" +- { (yyval.number) = 0; } +- break; +- +- case 44: +-#line 132 "defparse.y" +- { (yyval.number) = 0; } +- break; +- +- case 45: +-#line 136 "defparse.y" +- {(yyval.number)=1;} +- break; +- +- case 46: +-#line 137 "defparse.y" +- {(yyval.number)=0;} +- break; +- +- case 47: +-#line 141 "defparse.y" +- {(yyval.number)=1;} +- break; +- +- case 48: +-#line 142 "defparse.y" +- {(yyval.number)=0;} +- break; +- +- case 49: +-#line 146 "defparse.y" +- { (yyval.number) = 1; } +- break; +- +- case 50: +-#line 147 "defparse.y" +- { (yyval.number) = 0; } +- break; +- +- case 51: +-#line 151 "defparse.y" +- { (yyval.number) = 1; } +- break; +- +- case 52: +-#line 152 "defparse.y" +- { (yyval.number) = 0; } +- break; +- +- case 53: +-#line 155 "defparse.y" +- { (yyval.id_const) = "NAME"; } +- break; +- +- case 54: +-#line 160 "defparse.y" +- { (yyval.id_const) = "DESCRIPTION"; } +- break; +- +- case 55: +-#line 161 "defparse.y" +- { (yyval.id_const) = "STACKSIZE"; } +- break; +- +- case 56: +-#line 162 "defparse.y" +- { (yyval.id_const) = "HEAPSIZE"; } +- break; +- +- case 57: +-#line 163 "defparse.y" +- { (yyval.id_const) = "CODE"; } +- break; +- +- case 58: +-#line 164 "defparse.y" +- { (yyval.id_const) = "DATA"; } +- break; +- +- case 59: +-#line 165 "defparse.y" +- { (yyval.id_const) = "SECTIONS"; } +- break; +- +- case 60: +-#line 166 "defparse.y" +- { (yyval.id_const) = "EXPORTS"; } +- break; +- +- case 61: +-#line 167 "defparse.y" +- { (yyval.id_const) = "IMPORTS"; } +- break; +- +- case 62: +-#line 168 "defparse.y" +- { (yyval.id_const) = "VERSION"; } +- break; +- +- case 63: +-#line 169 "defparse.y" +- { (yyval.id_const) = "BASE"; } +- break; +- +- case 64: +-#line 170 "defparse.y" +- { (yyval.id_const) = "CONSTANT"; } +- break; +- +- case 65: +-#line 171 "defparse.y" +- { (yyval.id_const) = "NONAME"; } +- break; +- +- case 66: +-#line 172 "defparse.y" +- { (yyval.id_const) = "PRIVATE"; } +- break; +- +- case 67: +-#line 173 "defparse.y" +- { (yyval.id_const) = "READ"; } +- break; +- +- case 68: +-#line 174 "defparse.y" +- { (yyval.id_const) = "WRITE"; } +- break; +- +- case 69: +-#line 175 "defparse.y" +- { (yyval.id_const) = "EXECUTE"; } +- break; +- +- case 70: +-#line 176 "defparse.y" +- { (yyval.id_const) = "SHARED"; } +- break; +- +- case 71: +-#line 177 "defparse.y" +- { (yyval.id_const) = "NONSHARED"; } +- break; +- +- case 72: +-#line 178 "defparse.y" +- { (yyval.id_const) = "SINGLE"; } +- break; +- +- case 73: +-#line 179 "defparse.y" +- { (yyval.id_const) = "MULTIPLE"; } +- break; +- +- case 74: +-#line 180 "defparse.y" +- { (yyval.id_const) = "INITINSTANCE"; } +- break; +- +- case 75: +-#line 181 "defparse.y" +- { (yyval.id_const) = "INITGLOBAL"; } +- break; +- +- case 76: +-#line 182 "defparse.y" +- { (yyval.id_const) = "TERMINSTANCE"; } +- break; +- +- case 77: +-#line 183 "defparse.y" +- { (yyval.id_const) = "TERMGLOBAL"; } +- break; +- +- case 78: +-#line 186 "defparse.y" +- { (yyval.id) = (yyvsp[(1) - (1)].id); } +- break; +- +- case 79: +-#line 188 "defparse.y" +- { +- char *name = xmalloc (strlen ((yyvsp[(2) - (2)].id_const)) + 2); +- sprintf (name, ".%s", (yyvsp[(2) - (2)].id_const)); +- (yyval.id) = name; +- } +- break; +- +- case 80: +-#line 194 "defparse.y" +- { +- char *name = xmalloc (strlen ((yyvsp[(2) - (2)].id)) + 2); +- sprintf (name, ".%s", (yyvsp[(2) - (2)].id)); +- (yyval.id) = name; +- } +- break; +- +- case 81: +-#line 200 "defparse.y" +- { +- char *name = xmalloc (strlen ((yyvsp[(1) - (3)].id_const)) + 1 + strlen ((yyvsp[(3) - (3)].id)) + 1); +- sprintf (name, "%s.%s", (yyvsp[(1) - (3)].id_const), (yyvsp[(3) - (3)].id)); +- (yyval.id) = name; +- } +- break; +- +- case 82: +-#line 206 "defparse.y" +- { +- char *name = xmalloc (strlen ((yyvsp[(1) - (3)].id)) + 1 + strlen ((yyvsp[(3) - (3)].id)) + 1); +- sprintf (name, "%s.%s", (yyvsp[(1) - (3)].id), (yyvsp[(3) - (3)].id)); +- (yyval.id) = name; +- } +- break; +- +- case 83: +-#line 212 "defparse.y" +- { (yyval.id) =(yyvsp[(1) - (1)].id); } +- break; +- +- case 84: +-#line 213 "defparse.y" +- { (yyval.id)=""; } +- break; +- +- case 85: +-#line 217 "defparse.y" +- { (yyval.number)=(yyvsp[(2) - (2)].number);} +- break; +- +- case 86: +-#line 218 "defparse.y" +- { (yyval.number)=-1;} +- break; +- +- case 87: +-#line 222 "defparse.y" +- { (yyval.id) = (yyvsp[(2) - (2)].id); } +- break; +- +- case 88: +-#line 223 "defparse.y" +- { (yyval.id) = 0; } +- break; +- +- case 89: +-#line 227 "defparse.y" +- { (yyval.id) = (yyvsp[(2) - (2)].id); } +- break; +- +- case 90: +-#line 228 "defparse.y" +- { (yyval.id) = 0; } +- break; +- +- case 91: +-#line 231 "defparse.y" +- { (yyval.number)= (yyvsp[(3) - (3)].number);} +- break; +- +- case 92: +-#line 232 "defparse.y" +- { (yyval.number)=-1;} +- break; +- +- +-/* Line 1267 of yacc.c. */ +-#line 1929 "defparse.c" +- default: break; +- } +- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); +- +- YYPOPSTACK (yylen); +- yylen = 0; +- YY_STACK_PRINT (yyss, yyssp); +- +- *++yyvsp = yyval; +- +- +- /* 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 - YYNTOKENS] + *yyssp; +- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) +- yystate = yytable[yystate]; +- else +- yystate = yydefgoto[yyn - YYNTOKENS]; +- +- goto yynewstate; +- +- +-/*------------------------------------. +-| yyerrlab -- here on detecting error | +-`------------------------------------*/ +-yyerrlab: +- /* If not already recovering from an error, report this error. */ +- if (!yyerrstatus) +- { +- ++yynerrs; +-#if ! YYERROR_VERBOSE +- yyerror (YY_("syntax error")); +-#else +- { +- YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); +- if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) +- { +- YYSIZE_T yyalloc = 2 * yysize; +- if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) +- yyalloc = YYSTACK_ALLOC_MAXIMUM; +- if (yymsg != yymsgbuf) +- YYSTACK_FREE (yymsg); +- yymsg = (char *) YYSTACK_ALLOC (yyalloc); +- if (yymsg) +- yymsg_alloc = yyalloc; +- else +- { +- yymsg = yymsgbuf; +- yymsg_alloc = sizeof yymsgbuf; +- } +- } +- +- if (0 < yysize && yysize <= yymsg_alloc) +- { +- (void) yysyntax_error (yymsg, yystate, yychar); +- yyerror (yymsg); +- } +- else +- { +- yyerror (YY_("syntax error")); +- if (yysize != 0) +- goto yyexhaustedlab; +- } +- } +-#endif +- } +- +- +- +- if (yyerrstatus == 3) +- { +- /* If just tried and failed to reuse look-ahead token after an +- error, discard it. */ +- +- if (yychar <= YYEOF) +- { +- /* Return failure if at end of input. */ +- if (yychar == YYEOF) +- YYABORT; +- } +- else +- { +- yydestruct ("Error: discarding", +- yytoken, &yylval); +- yychar = YYEMPTY; +- } +- } +- +- /* Else will try to reuse look-ahead token after shifting the error +- token. */ +- goto yyerrlab1; +- +- +-/*---------------------------------------------------. +-| yyerrorlab -- error raised explicitly by YYERROR. | +-`---------------------------------------------------*/ +-yyerrorlab: +- +- /* Pacify compilers like GCC when the user code never invokes +- YYERROR and the label yyerrorlab therefore never appears in user +- code. */ +- if (/*CONSTCOND*/ 0) +- goto yyerrorlab; +- +- /* Do not reclaim the symbols of the rule which action triggered +- this YYERROR. */ +- YYPOPSTACK (yylen); +- yylen = 0; +- YY_STACK_PRINT (yyss, yyssp); +- yystate = *yyssp; +- goto yyerrlab1; +- +- +-/*-------------------------------------------------------------. +-| yyerrlab1 -- common code for both syntax error and YYERROR. | +-`-------------------------------------------------------------*/ +-yyerrlab1: +- yyerrstatus = 3; /* Each real token shifted decrements this. */ +- +- for (;;) +- { +- yyn = yypact[yystate]; +- if (yyn != YYPACT_NINF) +- { +- yyn += YYTERROR; +- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) +- { +- yyn = yytable[yyn]; +- if (0 < yyn) +- break; +- } +- } +- +- /* Pop the current state because it cannot handle the error token. */ +- if (yyssp == yyss) +- YYABORT; +- +- +- yydestruct ("Error: popping", +- yystos[yystate], yyvsp); +- YYPOPSTACK (1); +- yystate = *yyssp; +- YY_STACK_PRINT (yyss, yyssp); +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- *++yyvsp = yylval; +- +- +- /* Shift the error token. */ +- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); +- +- yystate = yyn; +- goto yynewstate; +- +- +-/*-------------------------------------. +-| yyacceptlab -- YYACCEPT comes here. | +-`-------------------------------------*/ +-yyacceptlab: +- yyresult = 0; +- goto yyreturn; +- +-/*-----------------------------------. +-| yyabortlab -- YYABORT comes here. | +-`-----------------------------------*/ +-yyabortlab: +- yyresult = 1; +- goto yyreturn; +- +-#ifndef yyoverflow +-/*-------------------------------------------------. +-| yyexhaustedlab -- memory exhaustion comes here. | +-`-------------------------------------------------*/ +-yyexhaustedlab: +- yyerror (YY_("memory exhausted")); +- yyresult = 2; +- /* Fall through. */ +-#endif +- +-yyreturn: +- if (yychar != YYEOF && yychar != YYEMPTY) +- yydestruct ("Cleanup: discarding lookahead", +- yytoken, &yylval); +- /* Do not reclaim the symbols of the rule which action triggered +- this YYABORT or YYACCEPT. */ +- YYPOPSTACK (yylen); +- YY_STACK_PRINT (yyss, yyssp); +- while (yyssp != yyss) +- { +- yydestruct ("Cleanup: popping", +- yystos[*yyssp], yyvsp); +- YYPOPSTACK (1); +- } +-#ifndef yyoverflow +- if (yyss != yyssa) +- YYSTACK_FREE (yyss); +-#endif +-#if YYERROR_VERBOSE +- if (yymsg != yymsgbuf) +- YYSTACK_FREE (yymsg); +-#endif +- /* Make sure YYID is used. */ +- return YYID (yyresult); +-} +- +- +- +diff -Nur binutils-2.24.orig/binutils/defparse.h binutils-2.24/binutils/defparse.h +--- binutils-2.24.orig/binutils/defparse.h 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/defparse.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,124 +0,0 @@ +-/* A Bison parser, made by GNU Bison 2.3. */ +- +-/* Skeleton interface for Bison's Yacc-like parsers in C +- +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +- 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., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. */ +- +-/* As a special exception, you may create a larger work that contains +- part or all of the Bison parser skeleton and distribute that work +- under terms of your choice, so long as that work isn't itself a +- parser generator using the skeleton or a modified version thereof +- as a parser skeleton. Alternatively, if you modify or redistribute +- the parser skeleton itself, you may (at your option) remove this +- special exception, which will cause the skeleton and the resulting +- Bison output files to be licensed under the GNU General Public +- License without this special exception. +- +- This special exception was added by the Free Software Foundation in +- version 2.2 of Bison. */ +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- NAME = 258, +- LIBRARY = 259, +- DESCRIPTION = 260, +- STACKSIZE = 261, +- HEAPSIZE = 262, +- CODE = 263, +- DATA = 264, +- SECTIONS = 265, +- EXPORTS = 266, +- IMPORTS = 267, +- VERSIONK = 268, +- BASE = 269, +- CONSTANT = 270, +- READ = 271, +- WRITE = 272, +- EXECUTE = 273, +- SHARED = 274, +- NONSHARED = 275, +- NONAME = 276, +- PRIVATE = 277, +- SINGLE = 278, +- MULTIPLE = 279, +- INITINSTANCE = 280, +- INITGLOBAL = 281, +- TERMINSTANCE = 282, +- TERMGLOBAL = 283, +- EQUAL = 284, +- ID = 285, +- NUMBER = 286 +- }; +-#endif +-/* Tokens. */ +-#define NAME 258 +-#define LIBRARY 259 +-#define DESCRIPTION 260 +-#define STACKSIZE 261 +-#define HEAPSIZE 262 +-#define CODE 263 +-#define DATA 264 +-#define SECTIONS 265 +-#define EXPORTS 266 +-#define IMPORTS 267 +-#define VERSIONK 268 +-#define BASE 269 +-#define CONSTANT 270 +-#define READ 271 +-#define WRITE 272 +-#define EXECUTE 273 +-#define SHARED 274 +-#define NONSHARED 275 +-#define NONAME 276 +-#define PRIVATE 277 +-#define SINGLE 278 +-#define MULTIPLE 279 +-#define INITINSTANCE 280 +-#define INITGLOBAL 281 +-#define TERMINSTANCE 282 +-#define TERMGLOBAL 283 +-#define EQUAL 284 +-#define ID 285 +-#define NUMBER 286 +- +- +- +- +-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +-typedef union YYSTYPE +-#line 29 "defparse.y" +-{ +- char *id; +- const char *id_const; +- int number; +-} +-/* Line 1529 of yacc.c. */ +-#line 117 "defparse.h" +- YYSTYPE; +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +-extern YYSTYPE yylval; +- +diff -Nur binutils-2.24.orig/binutils/doc/addr2line.1 binutils-2.24/binutils/doc/addr2line.1 +--- binutils-2.24.orig/binutils/doc/addr2line.1 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/doc/addr2line.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,299 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "ADDR2LINE 1" +-.TH ADDR2LINE 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-addr2line \- convert addresses into file names and line numbers. +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-addr2line [\fB\-a\fR|\fB\-\-addresses\fR] +- [\fB\-b\fR \fIbfdname\fR|\fB\-\-target=\fR\fIbfdname\fR] +- [\fB\-C\fR|\fB\-\-demangle\fR[=\fIstyle\fR]] +- [\fB\-e\fR \fIfilename\fR|\fB\-\-exe=\fR\fIfilename\fR] +- [\fB\-f\fR|\fB\-\-functions\fR] [\fB\-s\fR|\fB\-\-basename\fR] +- [\fB\-i\fR|\fB\-\-inlines\fR] +- [\fB\-p\fR|\fB\-\-pretty\-print\fR] +- [\fB\-j\fR|\fB\-\-section=\fR\fIname\fR] +- [\fB\-H\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] +- [addr addr ...] +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-\&\fBaddr2line\fR translates addresses into file names and line numbers. +-Given an address in an executable or an offset in a section of a relocatable +-object, it uses the debugging information to figure out which file name and +-line number are associated with it. +-.PP +-The executable or relocatable object to use is specified with the \fB\-e\fR +-option. The default is the file \fIa.out\fR. The section in the relocatable +-object to use is specified with the \fB\-j\fR option. +-.PP +-\&\fBaddr2line\fR has two modes of operation. +-.PP +-In the first, hexadecimal addresses are specified on the command line, +-and \fBaddr2line\fR displays the file name and line number for each +-address. +-.PP +-In the second, \fBaddr2line\fR reads hexadecimal addresses from +-standard input, and prints the file name and line number for each +-address on standard output. In this mode, \fBaddr2line\fR may be used +-in a pipe to convert dynamically chosen addresses. +-.PP +-The format of the output is \fB\s-1FILENAME:LINENO\s0\fR. The file name and +-line number for each input address is printed on separate lines. +-.PP +-If the \fB\-f\fR option is used, then each \fB\s-1FILENAME:LINENO\s0\fR +-line is preceded by \fB\s-1FUNCTIONNAME\s0\fR which is the name of the +-function containing the address. +-.PP +-If the \fB\-i\fR option is used and the code at the given address is +-present there because of inlining by the compiler then the +-\&\fB{\s-1FUNCTIONNAME\s0} \s-1FILENAME:LINENO\s0\fR information for the inlining +-function will be displayed afterwards. This continues recursively +-until there is no more inlining to report. +-.PP +-If the \fB\-a\fR option is used then the output is prefixed by the +-input address. +-.PP +-If the \fB\-p\fR option is used then the output for each input +-address is displayed on one, possibly quite long, line. If +-\&\fB\-p\fR is not used then the output is broken up into multiple +-lines, based on the paragraphs above. +-.PP +-If the file name or function name can not be determined, +-\&\fBaddr2line\fR will print two question marks in their place. If the +-line number can not be determined, \fBaddr2line\fR will print 0. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-The long and short forms of options, shown here as alternatives, are +-equivalent. +-.IP "\fB\-a\fR" 4 +-.IX Item "-a" +-.PD 0 +-.IP "\fB\-\-addresses\fR" 4 +-.IX Item "--addresses" +-.PD +-Display the address before the function name, file and line number +-information. The address is printed with a \fB0x\fR prefix to easily +-identify it. +-.IP "\fB\-b\fR \fIbfdname\fR" 4 +-.IX Item "-b bfdname" +-.PD 0 +-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4 +-.IX Item "--target=bfdname" +-.PD +-Specify that the object-code format for the object files is +-\&\fIbfdname\fR. +-.IP "\fB\-C\fR" 4 +-.IX Item "-C" +-.PD 0 +-.IP "\fB\-\-demangle[=\fR\fIstyle\fR\fB]\fR" 4 +-.IX Item "--demangle[=style]" +-.PD +-Decode (\fIdemangle\fR) low-level symbol names into user-level names. +-Besides removing any initial underscore prepended by the system, this +-makes \*(C+ function names readable. Different compilers have different +-mangling styles. The optional demangling style argument can be used to +-choose an appropriate demangling style for your compiler. +-.IP "\fB\-e\fR \fIfilename\fR" 4 +-.IX Item "-e filename" +-.PD 0 +-.IP "\fB\-\-exe=\fR\fIfilename\fR" 4 +-.IX Item "--exe=filename" +-.PD +-Specify the name of the executable for which addresses should be +-translated. The default file is \fIa.out\fR. +-.IP "\fB\-f\fR" 4 +-.IX Item "-f" +-.PD 0 +-.IP "\fB\-\-functions\fR" 4 +-.IX Item "--functions" +-.PD +-Display function names as well as file and line number information. +-.IP "\fB\-s\fR" 4 +-.IX Item "-s" +-.PD 0 +-.IP "\fB\-\-basenames\fR" 4 +-.IX Item "--basenames" +-.PD +-Display only the base of each file name. +-.IP "\fB\-i\fR" 4 +-.IX Item "-i" +-.PD 0 +-.IP "\fB\-\-inlines\fR" 4 +-.IX Item "--inlines" +-.PD +-If the address belongs to a function that was inlined, the source +-information for all enclosing scopes back to the first non-inlined +-function will also be printed. For example, if \f(CW\*(C`main\*(C'\fR inlines +-\&\f(CW\*(C`callee1\*(C'\fR which inlines \f(CW\*(C`callee2\*(C'\fR, and address is from +-\&\f(CW\*(C`callee2\*(C'\fR, the source information for \f(CW\*(C`callee1\*(C'\fR and \f(CW\*(C`main\*(C'\fR +-will also be printed. +-.IP "\fB\-j\fR" 4 +-.IX Item "-j" +-.PD 0 +-.IP "\fB\-\-section\fR" 4 +-.IX Item "--section" +-.PD +-Read offsets relative to the specified section instead of absolute addresses. +-.IP "\fB\-p\fR" 4 +-.IX Item "-p" +-.PD 0 +-.IP "\fB\-\-pretty\-print\fR" 4 +-.IX Item "--pretty-print" +-.PD +-Make the output more human friendly: each location are printed on one line. +-If option \fB\-i\fR is specified, lines for all enclosing scopes are +-prefixed with \fB(inlined by)\fR. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/ar.1 binutils-2.24/binutils/doc/ar.1 +--- binutils-2.24.orig/binutils/doc/ar.1 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/doc/ar.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,461 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "AR 1" +-.TH AR 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-ar \- create, modify, and extract from archives +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-ar [\fB\-\-plugin\fR \fIname\fR] [\fB\-X32_64\fR] [\fB\-\fR]\fIp\fR[\fImod\fR [\fIrelpos\fR] [\fIcount\fR]] [\fB\-\-target\fR \fIbfdname\fR] \fIarchive\fR [\fImember\fR...] +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-The \s-1GNU\s0 \fBar\fR program creates, modifies, and extracts from +-archives. An \fIarchive\fR is a single file holding a collection of +-other files in a structure that makes it possible to retrieve +-the original individual files (called \fImembers\fR of the archive). +-.PP +-The original files' contents, mode (permissions), timestamp, owner, and +-group are preserved in the archive, and can be restored on +-extraction. +-.PP +-\&\s-1GNU\s0 \fBar\fR can maintain archives whose members have names of any +-length; however, depending on how \fBar\fR is configured on your +-system, a limit on member-name length may be imposed for compatibility +-with archive formats maintained with other tools. If it exists, the +-limit is often 15 characters (typical of formats related to a.out) or 16 +-characters (typical of formats related to coff). +-.PP +-\&\fBar\fR is considered a binary utility because archives of this sort +-are most often used as \fIlibraries\fR holding commonly needed +-subroutines. +-.PP +-\&\fBar\fR creates an index to the symbols defined in relocatable +-object modules in the archive when you specify the modifier \fBs\fR. +-Once created, this index is updated in the archive whenever \fBar\fR +-makes a change to its contents (save for the \fBq\fR update operation). +-An archive with such an index speeds up linking to the library, and +-allows routines in the library to call each other without regard to +-their placement in the archive. +-.PP +-You may use \fBnm \-s\fR or \fBnm \-\-print\-armap\fR to list this index +-table. If an archive lacks the table, another form of \fBar\fR called +-\&\fBranlib\fR can be used to add just the table. +-.PP +-\&\s-1GNU\s0 \fBar\fR can optionally create a \fIthin\fR archive, +-which contains a symbol index and references to the original copies +-of the member files of the archive. This is useful for building +-libraries for use within a local build tree, where the relocatable +-objects are expected to remain available, and copying the contents of +-each object would only waste time and space. +-.PP +-An archive can either be \fIthin\fR or it can be normal. It cannot +-be both at the same time. Once an archive is created its format +-cannot be changed without first deleting it and then creating a new +-archive in its place. +-.PP +-Thin archives are also \fIflattened\fR, so that adding one thin +-archive to another thin archive does not nest it, as would happen with +-a normal archive. Instead the elements of the first archive are added +-individually to the second archive. +-.PP +-The paths to the elements of the archive are stored relative to the +-archive itself. +-.PP +-\&\s-1GNU\s0 \fBar\fR is designed to be compatible with two different +-facilities. You can control its activity using command-line options, +-like the different varieties of \fBar\fR on Unix systems; or, if you +-specify the single command-line option \fB\-M\fR, you can control it +-with a script supplied via standard input, like the \s-1MRI\s0 \*(L"librarian\*(R" +-program. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-\&\s-1GNU\s0 \fBar\fR allows you to mix the operation code \fIp\fR and modifier +-flags \fImod\fR in any order, within the first command-line argument. +-.PP +-If you wish, you may begin the first command-line argument with a +-dash. +-.PP +-The \fIp\fR keyletter specifies what operation to execute; it may be +-any of the following, but you must specify only one of them: +-.IP "\fBd\fR" 4 +-.IX Item "d" +-\&\fIDelete\fR modules from the archive. Specify the names of modules to +-be deleted as \fImember\fR...; the archive is untouched if you +-specify no files to delete. +-.Sp +-If you specify the \fBv\fR modifier, \fBar\fR lists each module +-as it is deleted. +-.IP "\fBm\fR" 4 +-.IX Item "m" +-Use this operation to \fImove\fR members in an archive. +-.Sp +-The ordering of members in an archive can make a difference in how +-programs are linked using the library, if a symbol is defined in more +-than one member. +-.Sp +-If no modifiers are used with \f(CW\*(C`m\*(C'\fR, any members you name in the +-\&\fImember\fR arguments are moved to the \fIend\fR of the archive; +-you can use the \fBa\fR, \fBb\fR, or \fBi\fR modifiers to move them to a +-specified place instead. +-.IP "\fBp\fR" 4 +-.IX Item "p" +-\&\fIPrint\fR the specified members of the archive, to the standard +-output file. If the \fBv\fR modifier is specified, show the member +-name before copying its contents to standard output. +-.Sp +-If you specify no \fImember\fR arguments, all the files in the archive are +-printed. +-.IP "\fBq\fR" 4 +-.IX Item "q" +-\&\fIQuick append\fR; Historically, add the files \fImember\fR... to the end of +-\&\fIarchive\fR, without checking for replacement. +-.Sp +-The modifiers \fBa\fR, \fBb\fR, and \fBi\fR do \fInot\fR affect this +-operation; new members are always placed at the end of the archive. +-.Sp +-The modifier \fBv\fR makes \fBar\fR list each file as it is appended. +-.Sp +-Since the point of this operation is speed, implementations of +-\&\fBar\fR have the option of not updating the archive's symbol +-table if one exists. Too many different systems however assume that +-symbol tables are always up-to-date, so \s-1GNU\s0 \fBar\fR will +-rebuild the table even with a quick append. +-.Sp +-Note \- \s-1GNU\s0 \fBar\fR treats the command \fBqs\fR as a +-synonym for \fBr\fR \- replacing already existing files in the +-archive and appending new ones at the end. +-.IP "\fBr\fR" 4 +-.IX Item "r" +-Insert the files \fImember\fR... into \fIarchive\fR (with +-\&\fIreplacement\fR). This operation differs from \fBq\fR in that any +-previously existing members are deleted if their names match those being +-added. +-.Sp +-If one of the files named in \fImember\fR... does not exist, \fBar\fR +-displays an error message, and leaves undisturbed any existing members +-of the archive matching that name. +-.Sp +-By default, new members are added at the end of the file; but you may +-use one of the modifiers \fBa\fR, \fBb\fR, or \fBi\fR to request +-placement relative to some existing member. +-.Sp +-The modifier \fBv\fR used with this operation elicits a line of +-output for each file inserted, along with one of the letters \fBa\fR or +-\&\fBr\fR to indicate whether the file was appended (no old member +-deleted) or replaced. +-.IP "\fBs\fR" 4 +-.IX Item "s" +-Add an index to the archive, or update it if it already exists. Note +-this command is an exception to the rule that there can only be one +-command letter, as it is possible to use it as either a command or a +-modifier. In either case it does the same thing. +-.IP "\fBt\fR" 4 +-.IX Item "t" +-Display a \fItable\fR listing the contents of \fIarchive\fR, or those +-of the files listed in \fImember\fR... that are present in the +-archive. Normally only the member name is shown; if you also want to +-see the modes (permissions), timestamp, owner, group, and size, you can +-request that by also specifying the \fBv\fR modifier. +-.Sp +-If you do not specify a \fImember\fR, all files in the archive +-are listed. +-.Sp +-If there is more than one file with the same name (say, \fBfie\fR) in +-an archive (say \fBb.a\fR), \fBar t b.a fie\fR lists only the +-first instance; to see them all, you must ask for a complete +-listing\-\-\-in our example, \fBar t b.a\fR. +-.IP "\fBx\fR" 4 +-.IX Item "x" +-\&\fIExtract\fR members (named \fImember\fR) from the archive. You can +-use the \fBv\fR modifier with this operation, to request that +-\&\fBar\fR list each name as it extracts it. +-.Sp +-If you do not specify a \fImember\fR, all files in the archive +-are extracted. +-.Sp +-Files cannot be extracted from a thin archive. +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-Displays the list of command line options supported by \fBar\fR +-and then exits. +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-Displays the version information of \fBar\fR and then exits. +-.PP +-A number of modifiers (\fImod\fR) may immediately follow the \fIp\fR +-keyletter, to specify variations on an operation's behavior: +-.IP "\fBa\fR" 4 +-.IX Item "a" +-Add new files \fIafter\fR an existing member of the +-archive. If you use the modifier \fBa\fR, the name of an existing archive +-member must be present as the \fIrelpos\fR argument, before the +-\&\fIarchive\fR specification. +-.IP "\fBb\fR" 4 +-.IX Item "b" +-Add new files \fIbefore\fR an existing member of the +-archive. If you use the modifier \fBb\fR, the name of an existing archive +-member must be present as the \fIrelpos\fR argument, before the +-\&\fIarchive\fR specification. (same as \fBi\fR). +-.IP "\fBc\fR" 4 +-.IX Item "c" +-\&\fICreate\fR the archive. The specified \fIarchive\fR is always +-created if it did not exist, when you request an update. But a warning is +-issued unless you specify in advance that you expect to create it, by +-using this modifier. +-.IP "\fBD\fR" 4 +-.IX Item "D" +-Operate in \fIdeterministic\fR mode. When adding files and the archive +-index use zero for UIDs, GIDs, timestamps, and use consistent file modes +-for all files. When this option is used, if \fBar\fR is used with +-identical options and identical input files, multiple runs will create +-identical output files regardless of the input files' owners, groups, +-file modes, or modification times. +-.Sp +-If \fIbinutils\fR was configured with +-\&\fB\-\-enable\-deterministic\-archives\fR, then this mode is on by default. +-It can be disabled with the \fBU\fR modifier, below. +-.IP "\fBf\fR" 4 +-.IX Item "f" +-Truncate names in the archive. \s-1GNU\s0 \fBar\fR will normally permit file +-names of any length. This will cause it to create archives which are +-not compatible with the native \fBar\fR program on some systems. If +-this is a concern, the \fBf\fR modifier may be used to truncate file +-names when putting them in the archive. +-.IP "\fBi\fR" 4 +-.IX Item "i" +-Insert new files \fIbefore\fR an existing member of the +-archive. If you use the modifier \fBi\fR, the name of an existing archive +-member must be present as the \fIrelpos\fR argument, before the +-\&\fIarchive\fR specification. (same as \fBb\fR). +-.IP "\fBl\fR" 4 +-.IX Item "l" +-This modifier is accepted but not used. +-.IP "\fBN\fR" 4 +-.IX Item "N" +-Uses the \fIcount\fR parameter. This is used if there are multiple +-entries in the archive with the same name. Extract or delete instance +-\&\fIcount\fR of the given name from the archive. +-.IP "\fBo\fR" 4 +-.IX Item "o" +-Preserve the \fIoriginal\fR dates of members when extracting them. If +-you do not specify this modifier, files extracted from the archive +-are stamped with the time of extraction. +-.IP "\fBP\fR" 4 +-.IX Item "P" +-Use the full path name when matching names in the archive. \s-1GNU\s0 +-\&\fBar\fR can not create an archive with a full path name (such archives +-are not \s-1POSIX\s0 complaint), but other archive creators can. This option +-will cause \s-1GNU\s0 \fBar\fR to match file names using a complete path +-name, which can be convenient when extracting a single file from an +-archive created by another tool. +-.IP "\fBs\fR" 4 +-.IX Item "s" +-Write an object-file index into the archive, or update an existing one, +-even if no other change is made to the archive. You may use this modifier +-flag either with any operation, or alone. Running \fBar s\fR on an +-archive is equivalent to running \fBranlib\fR on it. +-.IP "\fBS\fR" 4 +-.IX Item "S" +-Do not generate an archive symbol table. This can speed up building a +-large library in several steps. The resulting archive can not be used +-with the linker. In order to build a symbol table, you must omit the +-\&\fBS\fR modifier on the last execution of \fBar\fR, or you must run +-\&\fBranlib\fR on the archive. +-.IP "\fBT\fR" 4 +-.IX Item "T" +-Make the specified \fIarchive\fR a \fIthin\fR archive. If it already +-exists and is a regular archive, the existing members must be present +-in the same directory as \fIarchive\fR. +-.IP "\fBu\fR" 4 +-.IX Item "u" +-Normally, \fBar r\fR... inserts all files +-listed into the archive. If you would like to insert \fIonly\fR those +-of the files you list that are newer than existing members of the same +-names, use this modifier. The \fBu\fR modifier is allowed only for the +-operation \fBr\fR (replace). In particular, the combination \fBqu\fR is +-not allowed, since checking the timestamps would lose any speed +-advantage from the operation \fBq\fR. +-.IP "\fBU\fR" 4 +-.IX Item "U" +-Do \fInot\fR operate in \fIdeterministic\fR mode. This is the inverse +-of the \fBD\fR modifier, above: added files and the archive index will +-get their actual \s-1UID\s0, \s-1GID\s0, timestamp, and file mode values. +-.Sp +-This is the default unless \fIbinutils\fR was configured with +-\&\fB\-\-enable\-deterministic\-archives\fR. +-.IP "\fBv\fR" 4 +-.IX Item "v" +-This modifier requests the \fIverbose\fR version of an operation. Many +-operations display additional information, such as filenames processed, +-when the modifier \fBv\fR is appended. +-.IP "\fBV\fR" 4 +-.IX Item "V" +-This modifier shows the version number of \fBar\fR. +-.PP +-\&\fBar\fR ignores an initial option spelt \fB\-X32_64\fR, for +-compatibility with \s-1AIX\s0. The behaviour produced by this option is the +-default for \s-1GNU\s0 \fBar\fR. \fBar\fR does not support any of the other +-\&\fB\-X\fR options; in particular, it does not support \fB\-X32\fR +-which is the default for \s-1AIX\s0 \fBar\fR. +-.PP +-The optional command line switch \fB\-\-plugin\fR \fIname\fR causes +-\&\fBar\fR to load the plugin called \fIname\fR which adds support +-for more file formats. This option is only available if the toolchain +-has been built with plugin support enabled. +-.PP +-The optional command line switch \fB\-\-target\fR \fIbfdname\fR +-specifies that the archive members are in an object code format +-different from your system's default format. See +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-\&\fInm\fR\|(1), \fIranlib\fR\|(1), and the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/binutils.info binutils-2.24/binutils/doc/binutils.info +--- binutils-2.24.orig/binutils/doc/binutils.info 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/doc/binutils.info 1970-01-01 01:00:00.000000000 +0100 +@@ -1,4898 +0,0 @@ +-This is binutils.info, produced by makeinfo version 4.8 from +-binutils.texi. +- +- Copyright (C) 1991-2013 Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.3 or +-any later version published by the Free Software Foundation; with no +-Invariant Sections, with no Front-Cover Texts, and with no Back-Cover +-Texts. A copy of the license is included in the section entitled "GNU +-Free Documentation License". +- +-INFO-DIR-SECTION Software development +-START-INFO-DIR-ENTRY +-* Binutils: (binutils). The GNU binary utilities. +-END-INFO-DIR-ENTRY +- +-INFO-DIR-SECTION Individual utilities +-START-INFO-DIR-ENTRY +-* addr2line: (binutils)addr2line. Convert addresses to file and line. +-* ar: (binutils)ar. Create, modify, and extract from archives. +-* c++filt: (binutils)c++filt. Filter to demangle encoded C++ symbols. +-* cxxfilt: (binutils)c++filt. MS-DOS name for c++filt. +-* dlltool: (binutils)dlltool. Create files needed to build and use DLLs. +-* nlmconv: (binutils)nlmconv. Converts object code into an NLM. +-* nm: (binutils)nm. List symbols from object files. +-* objcopy: (binutils)objcopy. Copy and translate object files. +-* objdump: (binutils)objdump. Display information from object files. +-* ranlib: (binutils)ranlib. Generate index to archive contents. +-* readelf: (binutils)readelf. Display the contents of ELF format files. +-* size: (binutils)size. List section sizes and total size. +-* strings: (binutils)strings. List printable strings from files. +-* strip: (binutils)strip. Discard symbols. +-* elfedit: (binutils)elfedit. Update the ELF header of ELF files. +-* windmc: (binutils)windmc. Generator for Windows message resources. +-* windres: (binutils)windres. Manipulate Windows resources. +-END-INFO-DIR-ENTRY +- +- +-File: binutils.info, Node: Top, Next: ar, Up: (dir) +- +-Introduction +-************ +- +-This brief manual contains documentation for the GNU binary utilities +-(GNU Binutils) version 2.23.91: +- +- This document is distributed under the terms of the GNU Free +-Documentation License version 1.3. A copy of the license is included +-in the section entitled "GNU Free Documentation License". +- +-* Menu: +- +-* ar:: Create, modify, and extract from archives +-* nm:: List symbols from object files +-* objcopy:: Copy and translate object files +-* objdump:: Display information from object files +-* ranlib:: Generate index to archive contents +-* size:: List section sizes and total size +-* strings:: List printable strings from files +-* strip:: Discard symbols +-* c++filt:: Filter to demangle encoded C++ symbols +-* cxxfilt: c++filt. MS-DOS name for c++filt +-* addr2line:: Convert addresses to file and line +-* nlmconv:: Converts object code into an NLM +-* windmc:: Generator for Windows message resources +-* windres:: Manipulate Windows resources +-* dlltool:: Create files needed to build and use DLLs +-* readelf:: Display the contents of ELF format files +-* elfedit:: Update the ELF header of ELF files +-* Common Options:: Command-line options for all utilities +-* Selecting the Target System:: How these utilities determine the target +-* Reporting Bugs:: Reporting Bugs +-* GNU Free Documentation License:: GNU Free Documentation License +-* Binutils Index:: Binutils Index +- +- +-File: binutils.info, Node: ar, Next: nm, Prev: Top, Up: Top +- +-1 ar +-**** +- +- ar [`--plugin' NAME] [-]P[MOD [RELPOS] [COUNT]] [`--target' BFDNAME] ARCHIVE [MEMBER...] +- ar -M [ '), and continues executing even after errors. If you +-redirect standard input to a script file, no prompts are issued, and +-`ar' abandons execution (with a nonzero exit code) on any error. +- +- The `ar' command language is _not_ designed to be equivalent to the +-command-line options; in fact, it provides somewhat less control over +-archives. The only purpose of the command language is to ease the +-transition to GNU `ar' for developers who already have scripts written +-for the MRI "librarian" program. +- +- The syntax for the `ar' command language is straightforward: +- * commands are recognized in upper or lower case; for example, `LIST' +- is the same as `list'. In the following descriptions, commands are +- shown in upper case for clarity. +- +- * a single command may appear on each line; it is the first word on +- the line. +- +- * empty lines are allowed, and have no effect. +- +- * comments are allowed; text after either of the characters `*' or +- `;' is ignored. +- +- * Whenever you use a list of names as part of the argument to an `ar' +- command, you can separate the individual names with either commas +- or blanks. Commas are shown in the explanations below, for +- clarity. +- +- * `+' is used as a line continuation character; if `+' appears at +- the end of a line, the text on the following line is considered +- part of the current command. +- +- Here are the commands you can use in `ar' scripts, or when using +-`ar' interactively. Three of them have special significance: +- +- `OPEN' or `CREATE' specify a "current archive", which is a temporary +-file required for most of the other commands. +- +- `SAVE' commits the changes so far specified by the script. Prior to +-`SAVE', commands affect only the temporary copy of the current archive. +- +-`ADDLIB ARCHIVE' +-`ADDLIB ARCHIVE (MODULE, MODULE, ... MODULE)' +- Add all the contents of ARCHIVE (or, if specified, each named +- MODULE from ARCHIVE) to the current archive. +- +- Requires prior use of `OPEN' or `CREATE'. +- +-`ADDMOD MEMBER, MEMBER, ... MEMBER' +- Add each named MEMBER as a module in the current archive. +- +- Requires prior use of `OPEN' or `CREATE'. +- +-`CLEAR' +- Discard the contents of the current archive, canceling the effect +- of any operations since the last `SAVE'. May be executed (with no +- effect) even if no current archive is specified. +- +-`CREATE ARCHIVE' +- Creates an archive, and makes it the current archive (required for +- many other commands). The new archive is created with a temporary +- name; it is not actually saved as ARCHIVE until you use `SAVE'. +- You can overwrite existing archives; similarly, the contents of any +- existing file named ARCHIVE will not be destroyed until `SAVE'. +- +-`DELETE MODULE, MODULE, ... MODULE' +- Delete each listed MODULE from the current archive; equivalent to +- `ar -d ARCHIVE MODULE ... MODULE'. +- +- Requires prior use of `OPEN' or `CREATE'. +- +-`DIRECTORY ARCHIVE (MODULE, ... MODULE)' +-`DIRECTORY ARCHIVE (MODULE, ... MODULE) OUTPUTFILE' +- List each named MODULE present in ARCHIVE. The separate command +- `VERBOSE' specifies the form of the output: when verbose output is +- off, output is like that of `ar -t ARCHIVE MODULE...'. When +- verbose output is on, the listing is like `ar -tv ARCHIVE +- MODULE...'. +- +- Output normally goes to the standard output stream; however, if you +- specify OUTPUTFILE as a final argument, `ar' directs the output to +- that file. +- +-`END' +- Exit from `ar', with a `0' exit code to indicate successful +- completion. This command does not save the output file; if you +- have changed the current archive since the last `SAVE' command, +- those changes are lost. +- +-`EXTRACT MODULE, MODULE, ... MODULE' +- Extract each named MODULE from the current archive, writing them +- into the current directory as separate files. Equivalent to `ar -x +- ARCHIVE MODULE...'. +- +- Requires prior use of `OPEN' or `CREATE'. +- +-`LIST' +- Display full contents of the current archive, in "verbose" style +- regardless of the state of `VERBOSE'. The effect is like `ar tv +- ARCHIVE'. (This single command is a GNU `ar' enhancement, rather +- than present for MRI compatibility.) +- +- Requires prior use of `OPEN' or `CREATE'. +- +-`OPEN ARCHIVE' +- Opens an existing archive for use as the current archive (required +- for many other commands). Any changes as the result of subsequent +- commands will not actually affect ARCHIVE until you next use +- `SAVE'. +- +-`REPLACE MODULE, MODULE, ... MODULE' +- In the current archive, replace each existing MODULE (named in the +- `REPLACE' arguments) from files in the current working directory. +- To execute this command without errors, both the file, and the +- module in the current archive, must exist. +- +- Requires prior use of `OPEN' or `CREATE'. +- +-`VERBOSE' +- Toggle an internal flag governing the output from `DIRECTORY'. +- When the flag is on, `DIRECTORY' output matches output from `ar +- -tv '.... +- +-`SAVE' +- Commit your changes to the current archive, and actually save it +- as a file with the name specified in the last `CREATE' or `OPEN' +- command. +- +- Requires prior use of `OPEN' or `CREATE'. +- +- +- +-File: binutils.info, Node: nm, Next: objcopy, Prev: ar, Up: Top +- +-2 nm +-**** +- +- nm [`-A'|`-o'|`--print-file-name'] [`-a'|`--debug-syms'] +- [`-B'|`--format=bsd'] [`-C'|`--demangle'[=STYLE]] +- [`-D'|`--dynamic'] [`-f'FORMAT|`--format='FORMAT] +- [`-g'|`--extern-only'] [`-h'|`--help'] +- [`-l'|`--line-numbers'] [`-n'|`-v'|`--numeric-sort'] +- [`-P'|`--portability'] [`-p'|`--no-sort'] +- [`-r'|`--reverse-sort'] [`-S'|`--print-size'] +- [`-s'|`--print-armap'] [`-t' RADIX|`--radix='RADIX] +- [`-u'|`--undefined-only'] [`-V'|`--version'] +- [`-X 32_64'] [`--defined-only'] [`--no-demangle'] +- [`--plugin' NAME] [`--size-sort'] [`--special-syms'] +- [`--synthetic'] [`--target='BFDNAME] +- [OBJFILE...] +- +- GNU `nm' lists the symbols from object files OBJFILE.... If no +-object files are listed as arguments, `nm' assumes the file `a.out'. +- +- For each symbol, `nm' shows: +- +- * The symbol value, in the radix selected by options (see below), or +- hexadecimal by default. +- +- * The symbol type. At least the following types are used; others +- are, as well, depending on the object file format. If lowercase, +- the symbol is usually local; if uppercase, the symbol is global +- (external). There are however a few lowercase symbols that are +- shown for special global symbols (`u', `v' and `w'). +- +- `A' +- The symbol's value is absolute, and will not be changed by +- further linking. +- +- `B' +- `b' +- The symbol is in the uninitialized data section (known as +- BSS). +- +- `C' +- The symbol is common. Common symbols are uninitialized data. +- When linking, multiple common symbols may appear with the +- same name. If the symbol is defined anywhere, the common +- symbols are treated as undefined references. For more +- details on common symbols, see the discussion of -warn-common +- in *Note Linker options: (ld.info)Options. +- +- `D' +- `d' +- The symbol is in the initialized data section. +- +- `G' +- `g' +- The symbol is in an initialized data section for small +- objects. Some object file formats permit more efficient +- access to small data objects, such as a global int variable +- as opposed to a large global array. +- +- `i' +- For PE format files this indicates that the symbol is in a +- section specific to the implementation of DLLs. For ELF +- format files this indicates that the symbol is an indirect +- function. This is a GNU extension to the standard set of ELF +- symbol types. It indicates a symbol which if referenced by a +- relocation does not evaluate to its address, but instead must +- be invoked at runtime. The runtime execution will then +- return the value to be used in the relocation. +- +- `I' +- The symbol is an indirect reference to another symbol. +- +- `N' +- The symbol is a debugging symbol. +- +- `p' +- The symbols is in a stack unwind section. +- +- `R' +- `r' +- The symbol is in a read only data section. +- +- `S' +- `s' +- The symbol is in an uninitialized data section for small +- objects. +- +- `T' +- `t' +- The symbol is in the text (code) section. +- +- `U' +- The symbol is undefined. +- +- `u' +- The symbol is a unique global symbol. This is a GNU +- extension to the standard set of ELF symbol bindings. For +- such a symbol the dynamic linker will make sure that in the +- entire process there is just one symbol with this name and +- type in use. +- +- `V' +- `v' +- The symbol is a weak object. When a weak defined symbol is +- linked with a normal defined symbol, the normal defined +- symbol is used with no error. When a weak undefined symbol +- is linked and the symbol is not defined, the value of the +- weak symbol becomes zero with no error. On some systems, +- uppercase indicates that a default value has been specified. +- +- `W' +- `w' +- The symbol is a weak symbol that has not been specifically +- tagged as a weak object symbol. When a weak defined symbol +- is linked with a normal defined symbol, the normal defined +- symbol is used with no error. When a weak undefined symbol +- is linked and the symbol is not defined, the value of the +- symbol is determined in a system-specific manner without +- error. On some systems, uppercase indicates that a default +- value has been specified. +- +- `-' +- The symbol is a stabs symbol in an a.out object file. In +- this case, the next values printed are the stabs other field, +- the stabs desc field, and the stab type. Stabs symbols are +- used to hold debugging information. +- +- `?' +- The symbol type is unknown, or object file format specific. +- +- * The symbol name. +- +- The long and short forms of options, shown here as alternatives, are +-equivalent. +- +-`-A' +-`-o' +-`--print-file-name' +- Precede each symbol by the name of the input file (or archive +- member) in which it was found, rather than identifying the input +- file once only, before all of its symbols. +- +-`-a' +-`--debug-syms' +- Display all symbols, even debugger-only symbols; normally these +- are not listed. +- +-`-B' +- The same as `--format=bsd' (for compatibility with the MIPS `nm'). +- +-`-C' +-`--demangle[=STYLE]' +- Decode ("demangle") low-level symbol names into user-level names. +- Besides removing any initial underscore prepended by the system, +- this makes C++ function names readable. Different compilers have +- different mangling styles. The optional demangling style argument +- can be used to choose an appropriate demangling style for your +- compiler. *Note c++filt::, for more information on demangling. +- +-`--no-demangle' +- Do not demangle low-level symbol names. This is the default. +- +-`-D' +-`--dynamic' +- Display the dynamic symbols rather than the normal symbols. This +- is only meaningful for dynamic objects, such as certain types of +- shared libraries. +- +-`-f FORMAT' +-`--format=FORMAT' +- Use the output format FORMAT, which can be `bsd', `sysv', or +- `posix'. The default is `bsd'. Only the first character of +- FORMAT is significant; it can be either upper or lower case. +- +-`-g' +-`--extern-only' +- Display only external symbols. +- +-`-h' +-`--help' +- Show a summary of the options to `nm' and exit. +- +-`-l' +-`--line-numbers' +- For each symbol, use debugging information to try to find a +- filename and line number. For a defined symbol, look for the line +- number of the address of the symbol. For an undefined symbol, +- look for the line number of a relocation entry which refers to the +- symbol. If line number information can be found, print it after +- the other symbol information. +- +-`-n' +-`-v' +-`--numeric-sort' +- Sort symbols numerically by their addresses, rather than +- alphabetically by their names. +- +-`-p' +-`--no-sort' +- Do not bother to sort the symbols in any order; print them in the +- order encountered. +- +-`-P' +-`--portability' +- Use the POSIX.2 standard output format instead of the default +- format. Equivalent to `-f posix'. +- +-`-r' +-`--reverse-sort' +- Reverse the order of the sort (whether numeric or alphabetic); let +- the last come first. +- +-`-S' +-`--print-size' +- Print both value and size of defined symbols for the `bsd' output +- style. This option has no effect for object formats that do not +- record symbol sizes, unless `--size-sort' is also used in which +- case a calculated size is displayed. +- +-`-s' +-`--print-armap' +- When listing symbols from archive members, include the index: a +- mapping (stored in the archive by `ar' or `ranlib') of which +- modules contain definitions for which names. +- +-`-t RADIX' +-`--radix=RADIX' +- Use RADIX as the radix for printing the symbol values. It must be +- `d' for decimal, `o' for octal, or `x' for hexadecimal. +- +-`-u' +-`--undefined-only' +- Display only undefined symbols (those external to each object +- file). +- +-`-V' +-`--version' +- Show the version number of `nm' and exit. +- +-`-X' +- This option is ignored for compatibility with the AIX version of +- `nm'. It takes one parameter which must be the string `32_64'. +- The default mode of AIX `nm' corresponds to `-X 32', which is not +- supported by GNU `nm'. +- +-`--defined-only' +- Display only defined symbols for each object file. +- +-`--plugin NAME' +- Load the plugin called NAME to add support for extra target types. +- This option is only available if the toolchain has been built +- with plugin support enabled. +- +-`--size-sort' +- Sort symbols by size. The size is computed as the difference +- between the value of the symbol and the value of the symbol with +- the next higher value. If the `bsd' output format is used the +- size of the symbol is printed, rather than the value, and `-S' +- must be used in order both size and value to be printed. +- +-`--special-syms' +- Display symbols which have a target-specific special meaning. +- These symbols are usually used by the target for some special +- processing and are not normally helpful when included in the +- normal symbol lists. For example for ARM targets this option +- would skip the mapping symbols used to mark transitions between +- ARM code, THUMB code and data. +- +-`--synthetic' +- Include synthetic symbols in the output. These are special symbols +- created by the linker for various purposes. They are not shown by +- default since they are not part of the binary's original source +- code. +- +-`--target=BFDNAME' +- Specify an object code format other than your system's default +- format. *Note Target Selection::, for more information. +- +- +- +-File: binutils.info, Node: objcopy, Next: objdump, Prev: nm, Up: Top +- +-3 objcopy +-********* +- +- objcopy [`-F' BFDNAME|`--target='BFDNAME] +- [`-I' BFDNAME|`--input-target='BFDNAME] +- [`-O' BFDNAME|`--output-target='BFDNAME] +- [`-B' BFDARCH|`--binary-architecture='BFDARCH] +- [`-S'|`--strip-all'] +- [`-g'|`--strip-debug'] +- [`-K' SYMBOLNAME|`--keep-symbol='SYMBOLNAME] +- [`-N' SYMBOLNAME|`--strip-symbol='SYMBOLNAME] +- [`--strip-unneeded-symbol='SYMBOLNAME] +- [`-G' SYMBOLNAME|`--keep-global-symbol='SYMBOLNAME] +- [`--localize-hidden'] +- [`-L' SYMBOLNAME|`--localize-symbol='SYMBOLNAME] +- [`--globalize-symbol='SYMBOLNAME] +- [`-W' SYMBOLNAME|`--weaken-symbol='SYMBOLNAME] +- [`-w'|`--wildcard'] +- [`-x'|`--discard-all'] +- [`-X'|`--discard-locals'] +- [`-b' BYTE|`--byte='BYTE] +- [`-i' [BREADTH]|`--interleave'[=BREADTH]] +- [`--interleave-width='WIDTH] +- [`-j' SECTIONPATTERN|`--only-section='SECTIONPATTERN] +- [`-R' SECTIONPATTERN|`--remove-section='SECTIONPATTERN] +- [`-p'|`--preserve-dates'] +- [`-D'|`--enable-deterministic-archives'] +- [`-U'|`--disable-deterministic-archives'] +- [`--debugging'] +- [`--gap-fill='VAL] +- [`--pad-to='ADDRESS] +- [`--set-start='VAL] +- [`--adjust-start='INCR] +- [`--change-addresses='INCR] +- [`--change-section-address' SECTIONPATTERN{=,+,-}VAL] +- [`--change-section-lma' SECTIONPATTERN{=,+,-}VAL] +- [`--change-section-vma' SECTIONPATTERN{=,+,-}VAL] +- [`--change-warnings'] [`--no-change-warnings'] +- [`--set-section-flags' SECTIONPATTERN=FLAGS] +- [`--add-section' SECTIONNAME=FILENAME] +- [`--rename-section' OLDNAME=NEWNAME[,FLAGS]] +- [`--long-section-names' {enable,disable,keep}] +- [`--change-leading-char'] [`--remove-leading-char'] +- [`--reverse-bytes='NUM] +- [`--srec-len='IVAL] [`--srec-forceS3'] +- [`--redefine-sym' OLD=NEW] +- [`--redefine-syms='FILENAME] +- [`--weaken'] +- [`--keep-symbols='FILENAME] +- [`--strip-symbols='FILENAME] +- [`--strip-unneeded-symbols='FILENAME] +- [`--keep-global-symbols='FILENAME] +- [`--localize-symbols='FILENAME] +- [`--globalize-symbols='FILENAME] +- [`--weaken-symbols='FILENAME] +- [`--alt-machine-code='INDEX] +- [`--prefix-symbols='STRING] +- [`--prefix-sections='STRING] +- [`--prefix-alloc-sections='STRING] +- [`--add-gnu-debuglink='PATH-TO-FILE] +- [`--keep-file-symbols'] +- [`--only-keep-debug'] +- [`--strip-dwo'] +- [`--extract-dwo'] +- [`--extract-symbol'] +- [`--writable-text'] +- [`--readonly-text'] +- [`--pure'] +- [`--impure'] +- [`--file-alignment='NUM] +- [`--heap='SIZE] +- [`--image-base='ADDRESS] +- [`--section-alignment='NUM] +- [`--stack='SIZE] +- [`--subsystem='WHICH:MAJOR.MINOR] +- [`--compress-debug-sections'] +- [`--decompress-debug-sections'] +- [`--dwarf-depth=N'] +- [`--dwarf-start=N'] +- [`-v'|`--verbose'] +- [`-V'|`--version'] +- [`--help'] [`--info'] +- INFILE [OUTFILE] +- +- The GNU `objcopy' utility copies the contents of an object file to +-another. `objcopy' uses the GNU BFD Library to read and write the +-object files. It can write the destination object file in a format +-different from that of the source object file. The exact behavior of +-`objcopy' is controlled by command-line options. Note that `objcopy' +-should be able to copy a fully linked file between any two formats. +-However, copying a relocatable object file between any two formats may +-not work as expected. +- +- `objcopy' creates temporary files to do its translations and deletes +-them afterward. `objcopy' uses BFD to do all its translation work; it +-has access to all the formats described in BFD and thus is able to +-recognize most formats without being told explicitly. *Note BFD: +-(ld.info)BFD. +- +- `objcopy' can be used to generate S-records by using an output +-target of `srec' (e.g., use `-O srec'). +- +- `objcopy' can be used to generate a raw binary file by using an +-output target of `binary' (e.g., use `-O binary'). When `objcopy' +-generates a raw binary file, it will essentially produce a memory dump +-of the contents of the input object file. All symbols and relocation +-information will be discarded. The memory dump will start at the load +-address of the lowest section copied into the output file. +- +- When generating an S-record or a raw binary file, it may be helpful +-to use `-S' to remove sections containing debugging information. In +-some cases `-R' will be useful to remove sections which contain +-information that is not needed by the binary file. +- +- Note--`objcopy' is not able to change the endianness of its input +-files. If the input format has an endianness (some formats do not), +-`objcopy' can only copy the inputs into file formats that have the same +-endianness or which have no endianness (e.g., `srec'). (However, see +-the `--reverse-bytes' option.) +- +-`INFILE' +-`OUTFILE' +- The input and output files, respectively. If you do not specify +- OUTFILE, `objcopy' creates a temporary file and destructively +- renames the result with the name of INFILE. +- +-`-I BFDNAME' +-`--input-target=BFDNAME' +- Consider the source file's object format to be BFDNAME, rather than +- attempting to deduce it. *Note Target Selection::, for more +- information. +- +-`-O BFDNAME' +-`--output-target=BFDNAME' +- Write the output file using the object format BFDNAME. *Note +- Target Selection::, for more information. +- +-`-F BFDNAME' +-`--target=BFDNAME' +- Use BFDNAME as the object format for both the input and the output +- file; i.e., simply transfer data from source to destination with no +- translation. *Note Target Selection::, for more information. +- +-`-B BFDARCH' +-`--binary-architecture=BFDARCH' +- Useful when transforming a architecture-less input file into an +- object file. In this case the output architecture can be set to +- BFDARCH. This option will be ignored if the input file has a +- known BFDARCH. You can access this binary data inside a program +- by referencing the special symbols that are created by the +- conversion process. These symbols are called +- _binary_OBJFILE_start, _binary_OBJFILE_end and +- _binary_OBJFILE_size. e.g. you can transform a picture file into +- an object file and then access it in your code using these symbols. +- +-`-j SECTIONPATTERN' +-`--only-section=SECTIONPATTERN' +- Copy only the indicated sections from the input file to the output +- file. This option may be given more than once. Note that using +- this option inappropriately may make the output file unusable. +- Wildcard characters are accepted in SECTIONPATTERN. +- +-`-R SECTIONPATTERN' +-`--remove-section=SECTIONPATTERN' +- Remove any section matching SECTIONPATTERN from the output file. +- This option may be given more than once. Note that using this +- option inappropriately may make the output file unusable. Wildcard +- characters are accepted in SECTIONPATTERN. Using both the `-j' +- and `-R' options together results in undefined behaviour. +- +-`-S' +-`--strip-all' +- Do not copy relocation and symbol information from the source file. +- +-`-g' +-`--strip-debug' +- Do not copy debugging symbols or sections from the source file. +- +-`--strip-unneeded' +- Strip all symbols that are not needed for relocation processing. +- +-`-K SYMBOLNAME' +-`--keep-symbol=SYMBOLNAME' +- When stripping symbols, keep symbol SYMBOLNAME even if it would +- normally be stripped. This option may be given more than once. +- +-`-N SYMBOLNAME' +-`--strip-symbol=SYMBOLNAME' +- Do not copy symbol SYMBOLNAME from the source file. This option +- may be given more than once. +- +-`--strip-unneeded-symbol=SYMBOLNAME' +- Do not copy symbol SYMBOLNAME from the source file unless it is +- needed by a relocation. This option may be given more than once. +- +-`-G SYMBOLNAME' +-`--keep-global-symbol=SYMBOLNAME' +- Keep only symbol SYMBOLNAME global. Make all other symbols local +- to the file, so that they are not visible externally. This option +- may be given more than once. +- +-`--localize-hidden' +- In an ELF object, mark all symbols that have hidden or internal +- visibility as local. This option applies on top of +- symbol-specific localization options such as `-L'. +- +-`-L SYMBOLNAME' +-`--localize-symbol=SYMBOLNAME' +- Make symbol SYMBOLNAME local to the file, so that it is not +- visible externally. This option may be given more than once. +- +-`-W SYMBOLNAME' +-`--weaken-symbol=SYMBOLNAME' +- Make symbol SYMBOLNAME weak. This option may be given more than +- once. +- +-`--globalize-symbol=SYMBOLNAME' +- Give symbol SYMBOLNAME global scoping so that it is visible +- outside of the file in which it is defined. This option may be +- given more than once. +- +-`-w' +-`--wildcard' +- Permit regular expressions in SYMBOLNAMEs used in other command +- line options. The question mark (?), asterisk (*), backslash (\) +- and square brackets ([]) operators can be used anywhere in the +- symbol name. If the first character of the symbol name is the +- exclamation point (!) then the sense of the switch is reversed for +- that symbol. For example: +- +- -w -W !foo -W fo* +- +- would cause objcopy to weaken all symbols that start with "fo" +- except for the symbol "foo". +- +-`-x' +-`--discard-all' +- Do not copy non-global symbols from the source file. +- +-`-X' +-`--discard-locals' +- Do not copy compiler-generated local symbols. (These usually +- start with `L' or `.'.) +- +-`-b BYTE' +-`--byte=BYTE' +- If interleaving has been enabled via the `--interleave' option +- then start the range of bytes to keep at the BYTEth byte. BYTE +- can be in the range from 0 to BREADTH-1, where BREADTH is the +- value given by the `--interleave' option. +- +-`-i [BREADTH]' +-`--interleave[=BREADTH]' +- Only copy a range out of every BREADTH bytes. (Header data is not +- affected). Select which byte in the range begins the copy with +- the `--byte' option. Select the width of the range with the +- `--interleave-width' option. +- +- This option is useful for creating files to program ROM. It is +- typically used with an `srec' output target. Note that `objcopy' +- will complain if you do not specify the `--byte' option as well. +- +- The default interleave breadth is 4, so with `--byte' set to 0, +- `objcopy' would copy the first byte out of every four bytes from +- the input to the output. +- +-`--interleave-width=WIDTH' +- When used with the `--interleave' option, copy WIDTH bytes at a +- time. The start of the range of bytes to be copied is set by the +- `--byte' option, and the extent of the range is set with the +- `--interleave' option. +- +- The default value for this option is 1. The value of WIDTH plus +- the BYTE value set by the `--byte' option must not exceed the +- interleave breadth set by the `--interleave' option. +- +- This option can be used to create images for two 16-bit flashes +- interleaved in a 32-bit bus by passing `-b 0 -i 4 +- --interleave-width=2' and `-b 2 -i 4 --interleave-width=2' to two +- `objcopy' commands. If the input was '12345678' then the outputs +- would be '1256' and '3478' respectively. +- +-`-p' +-`--preserve-dates' +- Set the access and modification dates of the output file to be the +- same as those of the input file. +- +-`-D' +-`--enable-deterministic-archives' +- Operate in _deterministic_ mode. When copying archive members and +- writing the archive index, use zero for UIDs, GIDs, timestamps, +- and use consistent file modes for all files. +- +- If `binutils' was configured with +- `--enable-deterministic-archives', then this mode is on by default. +- It can be disabled with the `-U' option, below. +- +-`-U' +-`--disable-deterministic-archives' +- Do _not_ operate in _deterministic_ mode. This is the inverse of +- the `-D' option, above: when copying archive members and writing +- the archive index, use their actual UID, GID, timestamp, and file +- mode values. +- +- This is the default unless `binutils' was configured with +- `--enable-deterministic-archives'. +- +-`--debugging' +- Convert debugging information, if possible. This is not the +- default because only certain debugging formats are supported, and +- the conversion process can be time consuming. +- +-`--gap-fill VAL' +- Fill gaps between sections with VAL. This operation applies to +- the _load address_ (LMA) of the sections. It is done by increasing +- the size of the section with the lower address, and filling in the +- extra space created with VAL. +- +-`--pad-to ADDRESS' +- Pad the output file up to the load address ADDRESS. This is done +- by increasing the size of the last section. The extra space is +- filled in with the value specified by `--gap-fill' (default zero). +- +-`--set-start VAL' +- Set the start address of the new file to VAL. Not all object file +- formats support setting the start address. +- +-`--change-start INCR' +-`--adjust-start INCR' +- Change the start address by adding INCR. Not all object file +- formats support setting the start address. +- +-`--change-addresses INCR' +-`--adjust-vma INCR' +- Change the VMA and LMA addresses of all sections, as well as the +- start address, by adding INCR. Some object file formats do not +- permit section addresses to be changed arbitrarily. Note that +- this does not relocate the sections; if the program expects +- sections to be loaded at a certain address, and this option is +- used to change the sections such that they are loaded at a +- different address, the program may fail. +- +-`--change-section-address SECTIONPATTERN{=,+,-}VAL' +-`--adjust-section-vma SECTIONPATTERN{=,+,-}VAL' +- Set or change both the VMA address and the LMA address of any +- section matching SECTIONPATTERN. If `=' is used, the section +- address is set to VAL. Otherwise, VAL is added to or subtracted +- from the section address. See the comments under +- `--change-addresses', above. If SECTIONPATTERN does not match any +- sections in the input file, a warning will be issued, unless +- `--no-change-warnings' is used. +- +-`--change-section-lma SECTIONPATTERN{=,+,-}VAL' +- Set or change the LMA address of any sections matching +- SECTIONPATTERN. The LMA address is the address where the section +- will be loaded into memory at program load time. Normally this is +- the same as the VMA address, which is the address of the section +- at program run time, but on some systems, especially those where a +- program is held in ROM, the two can be different. If `=' is used, +- the section address is set to VAL. Otherwise, VAL is added to or +- subtracted from the section address. See the comments under +- `--change-addresses', above. If SECTIONPATTERN does not match any +- sections in the input file, a warning will be issued, unless +- `--no-change-warnings' is used. +- +-`--change-section-vma SECTIONPATTERN{=,+,-}VAL' +- Set or change the VMA address of any section matching +- SECTIONPATTERN. The VMA address is the address where the section +- will be located once the program has started executing. Normally +- this is the same as the LMA address, which is the address where +- the section will be loaded into memory, but on some systems, +- especially those where a program is held in ROM, the two can be +- different. If `=' is used, the section address is set to VAL. +- Otherwise, VAL is added to or subtracted from the section address. +- See the comments under `--change-addresses', above. If +- SECTIONPATTERN does not match any sections in the input file, a +- warning will be issued, unless `--no-change-warnings' is used. +- +-`--change-warnings' +-`--adjust-warnings' +- If `--change-section-address' or `--change-section-lma' or +- `--change-section-vma' is used, and the section pattern does not +- match any sections, issue a warning. This is the default. +- +-`--no-change-warnings' +-`--no-adjust-warnings' +- Do not issue a warning if `--change-section-address' or +- `--adjust-section-lma' or `--adjust-section-vma' is used, even if +- the section pattern does not match any sections. +- +-`--set-section-flags SECTIONPATTERN=FLAGS' +- Set the flags for any sections matching SECTIONPATTERN. The FLAGS +- argument is a comma separated string of flag names. The +- recognized names are `alloc', `contents', `load', `noload', +- `readonly', `code', `data', `rom', `share', and `debug'. You can +- set the `contents' flag for a section which does not have +- contents, but it is not meaningful to clear the `contents' flag of +- a section which does have contents-just remove the section +- instead. Not all flags are meaningful for all object file formats. +- +-`--add-section SECTIONNAME=FILENAME' +- Add a new section named SECTIONNAME while copying the file. The +- contents of the new section are taken from the file FILENAME. The +- size of the section will be the size of the file. This option only +- works on file formats which can support sections with arbitrary +- names. +- +-`--rename-section OLDNAME=NEWNAME[,FLAGS]' +- Rename a section from OLDNAME to NEWNAME, optionally changing the +- section's flags to FLAGS in the process. This has the advantage +- over usng a linker script to perform the rename in that the output +- stays as an object file and does not become a linked executable. +- +- This option is particularly helpful when the input format is +- binary, since this will always create a section called .data. If +- for example, you wanted instead to create a section called .rodata +- containing binary data you could use the following command line to +- achieve it: +- +- objcopy -I binary -O -B \ +- --rename-section .data=.rodata,alloc,load,readonly,data,contents \ +- +- +-`--long-section-names {enable,disable,keep}' +- Controls the handling of long section names when processing `COFF' +- and `PE-COFF' object formats. The default behaviour, `keep', is +- to preserve long section names if any are present in the input +- file. The `enable' and `disable' options forcibly enable or +- disable the use of long section names in the output object; when +- `disable' is in effect, any long section names in the input object +- will be truncated. The `enable' option will only emit long +- section names if any are present in the inputs; this is mostly the +- same as `keep', but it is left undefined whether the `enable' +- option might force the creation of an empty string table in the +- output file. +- +-`--change-leading-char' +- Some object file formats use special characters at the start of +- symbols. The most common such character is underscore, which +- compilers often add before every symbol. This option tells +- `objcopy' to change the leading character of every symbol when it +- converts between object file formats. If the object file formats +- use the same leading character, this option has no effect. +- Otherwise, it will add a character, or remove a character, or +- change a character, as appropriate. +- +-`--remove-leading-char' +- If the first character of a global symbol is a special symbol +- leading character used by the object file format, remove the +- character. The most common symbol leading character is +- underscore. This option will remove a leading underscore from all +- global symbols. This can be useful if you want to link together +- objects of different file formats with different conventions for +- symbol names. This is different from `--change-leading-char' +- because it always changes the symbol name when appropriate, +- regardless of the object file format of the output file. +- +-`--reverse-bytes=NUM' +- Reverse the bytes in a section with output contents. A section +- length must be evenly divisible by the value given in order for +- the swap to be able to take place. Reversing takes place before +- the interleaving is performed. +- +- This option is used typically in generating ROM images for +- problematic target systems. For example, on some target boards, +- the 32-bit words fetched from 8-bit ROMs are re-assembled in +- little-endian byte order regardless of the CPU byte order. +- Depending on the programming model, the endianness of the ROM may +- need to be modified. +- +- Consider a simple file with a section containing the following +- eight bytes: `12345678'. +- +- Using `--reverse-bytes=2' for the above example, the bytes in the +- output file would be ordered `21436587'. +- +- Using `--reverse-bytes=4' for the above example, the bytes in the +- output file would be ordered `43218765'. +- +- By using `--reverse-bytes=2' for the above example, followed by +- `--reverse-bytes=4' on the output file, the bytes in the second +- output file would be ordered `34127856'. +- +-`--srec-len=IVAL' +- Meaningful only for srec output. Set the maximum length of the +- Srecords being produced to IVAL. This length covers both address, +- data and crc fields. +- +-`--srec-forceS3' +- Meaningful only for srec output. Avoid generation of S1/S2 +- records, creating S3-only record format. +- +-`--redefine-sym OLD=NEW' +- Change the name of a symbol OLD, to NEW. This can be useful when +- one is trying link two things together for which you have no +- source, and there are name collisions. +- +-`--redefine-syms=FILENAME' +- Apply `--redefine-sym' to each symbol pair "OLD NEW" listed in the +- file FILENAME. FILENAME is simply a flat file, with one symbol +- pair per line. Line comments may be introduced by the hash +- character. This option may be given more than once. +- +-`--weaken' +- Change all global symbols in the file to be weak. This can be +- useful when building an object which will be linked against other +- objects using the `-R' option to the linker. This option is only +- effective when using an object file format which supports weak +- symbols. +- +-`--keep-symbols=FILENAME' +- Apply `--keep-symbol' option to each symbol listed in the file +- FILENAME. FILENAME is simply a flat file, with one symbol name +- per line. Line comments may be introduced by the hash character. +- This option may be given more than once. +- +-`--strip-symbols=FILENAME' +- Apply `--strip-symbol' option to each symbol listed in the file +- FILENAME. FILENAME is simply a flat file, with one symbol name +- per line. Line comments may be introduced by the hash character. +- This option may be given more than once. +- +-`--strip-unneeded-symbols=FILENAME' +- Apply `--strip-unneeded-symbol' option to each symbol listed in +- the file FILENAME. FILENAME is simply a flat file, with one +- symbol name per line. Line comments may be introduced by the hash +- character. This option may be given more than once. +- +-`--keep-global-symbols=FILENAME' +- Apply `--keep-global-symbol' option to each symbol listed in the +- file FILENAME. FILENAME is simply a flat file, with one symbol +- name per line. Line comments may be introduced by the hash +- character. This option may be given more than once. +- +-`--localize-symbols=FILENAME' +- Apply `--localize-symbol' option to each symbol listed in the file +- FILENAME. FILENAME is simply a flat file, with one symbol name +- per line. Line comments may be introduced by the hash character. +- This option may be given more than once. +- +-`--globalize-symbols=FILENAME' +- Apply `--globalize-symbol' option to each symbol listed in the file +- FILENAME. FILENAME is simply a flat file, with one symbol name +- per line. Line comments may be introduced by the hash character. +- This option may be given more than once. +- +-`--weaken-symbols=FILENAME' +- Apply `--weaken-symbol' option to each symbol listed in the file +- FILENAME. FILENAME is simply a flat file, with one symbol name +- per line. Line comments may be introduced by the hash character. +- This option may be given more than once. +- +-`--alt-machine-code=INDEX' +- If the output architecture has alternate machine codes, use the +- INDEXth code instead of the default one. This is useful in case a +- machine is assigned an official code and the tool-chain adopts the +- new code, but other applications still depend on the original code +- being used. For ELF based architectures if the INDEX alternative +- does not exist then the value is treated as an absolute number to +- be stored in the e_machine field of the ELF header. +- +-`--writable-text' +- Mark the output text as writable. This option isn't meaningful +- for all object file formats. +- +-`--readonly-text' +- Make the output text write protected. This option isn't +- meaningful for all object file formats. +- +-`--pure' +- Mark the output file as demand paged. This option isn't +- meaningful for all object file formats. +- +-`--impure' +- Mark the output file as impure. This option isn't meaningful for +- all object file formats. +- +-`--prefix-symbols=STRING' +- Prefix all symbols in the output file with STRING. +- +-`--prefix-sections=STRING' +- Prefix all section names in the output file with STRING. +- +-`--prefix-alloc-sections=STRING' +- Prefix all the names of all allocated sections in the output file +- with STRING. +- +-`--add-gnu-debuglink=PATH-TO-FILE' +- Creates a .gnu_debuglink section which contains a reference to +- PATH-TO-FILE and adds it to the output file. +- +-`--keep-file-symbols' +- When stripping a file, perhaps with `--strip-debug' or +- `--strip-unneeded', retain any symbols specifying source file +- names, which would otherwise get stripped. +- +-`--only-keep-debug' +- Strip a file, removing contents of any sections that would not be +- stripped by `--strip-debug' and leaving the debugging sections +- intact. In ELF files, this preserves all note sections in the +- output. +- +- The intention is that this option will be used in conjunction with +- `--add-gnu-debuglink' to create a two part executable. One a +- stripped binary which will occupy less space in RAM and in a +- distribution and the second a debugging information file which is +- only needed if debugging abilities are required. The suggested +- procedure to create these files is as follows: +- +- 1. Link the executable as normal. Assuming that is is called +- `foo' then... +- +- 2. Run `objcopy --only-keep-debug foo foo.dbg' to create a file +- containing the debugging info. +- +- 3. Run `objcopy --strip-debug foo' to create a stripped +- executable. +- +- 4. Run `objcopy --add-gnu-debuglink=foo.dbg foo' to add a link +- to the debugging info into the stripped executable. +- +- Note--the choice of `.dbg' as an extension for the debug info file +- is arbitrary. Also the `--only-keep-debug' step is optional. You +- could instead do this: +- +- 1. Link the executable as normal. +- +- 2. Copy `foo' to `foo.full' +- +- 3. Run `objcopy --strip-debug foo' +- +- 4. Run `objcopy --add-gnu-debuglink=foo.full foo' +- +- i.e., the file pointed to by the `--add-gnu-debuglink' can be the +- full executable. It does not have to be a file created by the +- `--only-keep-debug' switch. +- +- Note--this switch is only intended for use on fully linked files. +- It does not make sense to use it on object files where the +- debugging information may be incomplete. Besides the +- gnu_debuglink feature currently only supports the presence of one +- filename containing debugging information, not multiple filenames +- on a one-per-object-file basis. +- +-`--strip-dwo' +- Remove the contents of all DWARF .dwo sections, leaving the +- remaining debugging sections and all symbols intact. This option +- is intended for use by the compiler as part of the `-gsplit-dwarf' +- option, which splits debug information between the .o file and a +- separate .dwo file. The compiler generates all debug information +- in the same file, then uses the `--extract-dwo' option to copy the +- .dwo sections to the .dwo file, then the `--strip-dwo' option to +- remove those sections from the original .o file. +- +-`--extract-dwo' +- Extract the contents of all DWARF .dwo sections. See the +- `--strip-dwo' option for more information. +- +-`--file-alignment NUM' +- Specify the file alignment. Sections in the file will always +- begin at file offsets which are multiples of this number. This +- defaults to 512. [This option is specific to PE targets.] +- +-`--heap RESERVE' +-`--heap RESERVE,COMMIT' +- Specify the number of bytes of memory to reserve (and optionally +- commit) to be used as heap for this program. [This option is +- specific to PE targets.] +- +-`--image-base VALUE' +- Use VALUE as the base address of your program or dll. This is the +- lowest memory location that will be used when your program or dll +- is loaded. To reduce the need to relocate and improve performance +- of your dlls, each should have a unique base address and not +- overlap any other dlls. The default is 0x400000 for executables, +- and 0x10000000 for dlls. [This option is specific to PE targets.] +- +-`--section-alignment NUM' +- Sets the section alignment. Sections in memory will always begin +- at addresses which are a multiple of this number. Defaults to +- 0x1000. [This option is specific to PE targets.] +- +-`--stack RESERVE' +-`--stack RESERVE,COMMIT' +- Specify the number of bytes of memory to reserve (and optionally +- commit) to be used as stack for this program. [This option is +- specific to PE targets.] +- +-`--subsystem WHICH' +-`--subsystem WHICH:MAJOR' +-`--subsystem WHICH:MAJOR.MINOR' +- Specifies the subsystem under which your program will execute. The +- legal values for WHICH are `native', `windows', `console', +- `posix', `efi-app', `efi-bsd', `efi-rtd', `sal-rtd', and `xbox'. +- You may optionally set the subsystem version also. Numeric values +- are also accepted for WHICH. [This option is specific to PE +- targets.] +- +-`--extract-symbol' +- Keep the file's section flags and symbols but remove all section +- data. Specifically, the option: +- +- * removes the contents of all sections; +- +- * sets the size of every section to zero; and +- +- * sets the file's start address to zero. +- +- This option is used to build a `.sym' file for a VxWorks kernel. +- It can also be a useful way of reducing the size of a +- `--just-symbols' linker input file. +- +-`--compress-debug-sections' +- Compress DWARF debug sections using zlib. +- +-`--decompress-debug-sections' +- Decompress DWARF debug sections using zlib. +- +-`-V' +-`--version' +- Show the version number of `objcopy'. +- +-`-v' +-`--verbose' +- Verbose output: list all object files modified. In the case of +- archives, `objcopy -V' lists all members of the archive. +- +-`--help' +- Show a summary of the options to `objcopy'. +- +-`--info' +- Display a list showing all architectures and object formats +- available. +- +- +-File: binutils.info, Node: objdump, Next: ranlib, Prev: objcopy, Up: Top +- +-4 objdump +-********* +- +- objdump [`-a'|`--archive-headers'] +- [`-b' BFDNAME|`--target=BFDNAME'] +- [`-C'|`--demangle'[=STYLE] ] +- [`-d'|`--disassemble'] +- [`-D'|`--disassemble-all'] +- [`-z'|`--disassemble-zeroes'] +- [`-EB'|`-EL'|`--endian='{big | little }] +- [`-f'|`--file-headers'] +- [`-F'|`--file-offsets'] +- [`--file-start-context'] +- [`-g'|`--debugging'] +- [`-e'|`--debugging-tags'] +- [`-h'|`--section-headers'|`--headers'] +- [`-i'|`--info'] +- [`-j' SECTION|`--section='SECTION] +- [`-l'|`--line-numbers'] +- [`-S'|`--source'] +- [`-m' MACHINE|`--architecture='MACHINE] +- [`-M' OPTIONS|`--disassembler-options='OPTIONS] +- [`-p'|`--private-headers'] +- [`-P' OPTIONS|`--private='OPTIONS] +- [`-r'|`--reloc'] +- [`-R'|`--dynamic-reloc'] +- [`-s'|`--full-contents'] +- [`-W[lLiaprmfFsoRt]'| +- `--dwarf'[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]] +- [`-G'|`--stabs'] +- [`-t'|`--syms'] +- [`-T'|`--dynamic-syms'] +- [`-x'|`--all-headers'] +- [`-w'|`--wide'] +- [`--start-address='ADDRESS] +- [`--stop-address='ADDRESS] +- [`--prefix-addresses'] +- [`--[no-]show-raw-insn'] +- [`--adjust-vma='OFFSET] +- [`--special-syms'] +- [`--prefix='PREFIX] +- [`--prefix-strip='LEVEL] +- [`--insn-width='WIDTH] +- [`-V'|`--version'] +- [`-H'|`--help'] +- OBJFILE... +- +- `objdump' displays information about one or more object files. The +-options control what particular information to display. This +-information is mostly useful to programmers who are working on the +-compilation tools, as opposed to programmers who just want their +-program to compile and work. +- +- OBJFILE... are the object files to be examined. When you specify +-archives, `objdump' shows information on each of the member object +-files. +- +- The long and short forms of options, shown here as alternatives, are +-equivalent. At least one option from the list +-`-a,-d,-D,-e,-f,-g,-G,-h,-H,-p,-P,-r,-R,-s,-S,-t,-T,-V,-x' must be +-given. +- +-`-a' +-`--archive-header' +- If any of the OBJFILE files are archives, display the archive +- header information (in a format similar to `ls -l'). Besides the +- information you could list with `ar tv', `objdump -a' shows the +- object file format of each archive member. +- +-`--adjust-vma=OFFSET' +- When dumping information, first add OFFSET to all the section +- addresses. This is useful if the section addresses do not +- correspond to the symbol table, which can happen when putting +- sections at particular addresses when using a format which can not +- represent section addresses, such as a.out. +- +-`-b BFDNAME' +-`--target=BFDNAME' +- Specify that the object-code format for the object files is +- BFDNAME. This option may not be necessary; OBJDUMP can +- automatically recognize many formats. +- +- For example, +- objdump -b oasys -m vax -h fu.o +- displays summary information from the section headers (`-h') of +- `fu.o', which is explicitly identified (`-m') as a VAX object file +- in the format produced by Oasys compilers. You can list the +- formats available with the `-i' option. *Note Target Selection::, +- for more information. +- +-`-C' +-`--demangle[=STYLE]' +- Decode ("demangle") low-level symbol names into user-level names. +- Besides removing any initial underscore prepended by the system, +- this makes C++ function names readable. Different compilers have +- different mangling styles. The optional demangling style argument +- can be used to choose an appropriate demangling style for your +- compiler. *Note c++filt::, for more information on demangling. +- +-`-g' +-`--debugging' +- Display debugging information. This attempts to parse STABS and +- IEEE debugging format information stored in the file and print it +- out using a C like syntax. If neither of these formats are found +- this option falls back on the `-W' option to print any DWARF +- information in the file. +- +-`-e' +-`--debugging-tags' +- Like `-g', but the information is generated in a format compatible +- with ctags tool. +- +-`-d' +-`--disassemble' +- Display the assembler mnemonics for the machine instructions from +- OBJFILE. This option only disassembles those sections which are +- expected to contain instructions. +- +-`-D' +-`--disassemble-all' +- Like `-d', but disassemble the contents of all sections, not just +- those expected to contain instructions. +- +- If the target is an ARM architecture this switch also has the +- effect of forcing the disassembler to decode pieces of data found +- in code sections as if they were instructions. +- +-`--prefix-addresses' +- When disassembling, print the complete address on each line. This +- is the older disassembly format. +- +-`-EB' +-`-EL' +-`--endian={big|little}' +- Specify the endianness of the object files. This only affects +- disassembly. This can be useful when disassembling a file format +- which does not describe endianness information, such as S-records. +- +-`-f' +-`--file-headers' +- Display summary information from the overall header of each of the +- OBJFILE files. +- +-`-F' +-`--file-offsets' +- When disassembling sections, whenever a symbol is displayed, also +- display the file offset of the region of data that is about to be +- dumped. If zeroes are being skipped, then when disassembly +- resumes, tell the user how many zeroes were skipped and the file +- offset of the location from where the disassembly resumes. When +- dumping sections, display the file offset of the location from +- where the dump starts. +- +-`--file-start-context' +- Specify that when displaying interlisted source code/disassembly +- (assumes `-S') from a file that has not yet been displayed, extend +- the context to the start of the file. +- +-`-h' +-`--section-headers' +-`--headers' +- Display summary information from the section headers of the object +- file. +- +- File segments may be relocated to nonstandard addresses, for +- example by using the `-Ttext', `-Tdata', or `-Tbss' options to +- `ld'. However, some object file formats, such as a.out, do not +- store the starting address of the file segments. In those +- situations, although `ld' relocates the sections correctly, using +- `objdump -h' to list the file section headers cannot show the +- correct addresses. Instead, it shows the usual addresses, which +- are implicit for the target. +- +-`-H' +-`--help' +- Print a summary of the options to `objdump' and exit. +- +-`-i' +-`--info' +- Display a list showing all architectures and object formats +- available for specification with `-b' or `-m'. +- +-`-j NAME' +-`--section=NAME' +- Display information only for section NAME. +- +-`-l' +-`--line-numbers' +- Label the display (using debugging information) with the filename +- and source line numbers corresponding to the object code or relocs +- shown. Only useful with `-d', `-D', or `-r'. +- +-`-m MACHINE' +-`--architecture=MACHINE' +- Specify the architecture to use when disassembling object files. +- This can be useful when disassembling object files which do not +- describe architecture information, such as S-records. You can +- list the available architectures with the `-i' option. +- +- If the target is an ARM architecture then this switch has an +- additional effect. It restricts the disassembly to only those +- instructions supported by the architecture specified by MACHINE. +- If it is necessary to use this switch because the input file does +- not contain any architecture information, but it is also desired to +- disassemble all the instructions use `-marm'. +- +-`-M OPTIONS' +-`--disassembler-options=OPTIONS' +- Pass target specific information to the disassembler. Only +- supported on some targets. If it is necessary to specify more +- than one disassembler option then multiple `-M' options can be +- used or can be placed together into a comma separated list. +- +- If the target is an ARM architecture then this switch can be used +- to select which register name set is used during disassembler. +- Specifying `-M reg-names-std' (the default) will select the +- register names as used in ARM's instruction set documentation, but +- with register 13 called 'sp', register 14 called 'lr' and register +- 15 called 'pc'. Specifying `-M reg-names-apcs' will select the +- name set used by the ARM Procedure Call Standard, whilst +- specifying `-M reg-names-raw' will just use `r' followed by the +- register number. +- +- There are also two variants on the APCS register naming scheme +- enabled by `-M reg-names-atpcs' and `-M reg-names-special-atpcs' +- which use the ARM/Thumb Procedure Call Standard naming +- conventions. (Either with the normal register names or the +- special register names). +- +- This option can also be used for ARM architectures to force the +- disassembler to interpret all instructions as Thumb instructions by +- using the switch `--disassembler-options=force-thumb'. This can be +- useful when attempting to disassemble thumb code produced by other +- compilers. +- +- For the x86, some of the options duplicate functions of the `-m' +- switch, but allow finer grained control. Multiple selections from +- the following may be specified as a comma separated string. +- `x86-64', `i386' and `i8086' select disassembly for the given +- architecture. `intel' and `att' select between intel syntax mode +- and AT&T syntax mode. `intel-mnemonic' and `att-mnemonic' select +- between intel mnemonic mode and AT&T mnemonic mode. +- `intel-mnemonic' implies `intel' and `att-mnemonic' implies `att'. +- `addr64', `addr32', `addr16', `data32' and `data16' specify the +- default address size and operand size. These four options will be +- overridden if `x86-64', `i386' or `i8086' appear later in the +- option string. Lastly, `suffix', when in AT&T mode, instructs the +- disassembler to print a mnemonic suffix even when the suffix could +- be inferred by the operands. +- +- For PowerPC, `booke' controls the disassembly of BookE +- instructions. `32' and `64' select PowerPC and PowerPC64 +- disassembly, respectively. `e300' selects disassembly for the +- e300 family. `440' selects disassembly for the PowerPC 440. +- `ppcps' selects disassembly for the paired single instructions of +- the PPC750CL. +- +- For MIPS, this option controls the printing of instruction mnemonic +- names and register names in disassembled instructions. Multiple +- selections from the following may be specified as a comma separated +- string, and invalid options are ignored: +- +- `no-aliases' +- Print the 'raw' instruction mnemonic instead of some pseudo +- instruction mnemonic. I.e., print 'daddu' or 'or' instead of +- 'move', 'sll' instead of 'nop', etc. +- +- `virt' +- Disassemble the virtualization ASE instructions. +- +- `gpr-names=ABI' +- Print GPR (general-purpose register) names as appropriate for +- the specified ABI. By default, GPR names are selected +- according to the ABI of the binary being disassembled. +- +- `fpr-names=ABI' +- Print FPR (floating-point register) names as appropriate for +- the specified ABI. By default, FPR numbers are printed +- rather than names. +- +- `cp0-names=ARCH' +- Print CP0 (system control coprocessor; coprocessor 0) +- register names as appropriate for the CPU or architecture +- specified by ARCH. By default, CP0 register names are +- selected according to the architecture and CPU of the binary +- being disassembled. +- +- `hwr-names=ARCH' +- Print HWR (hardware register, used by the `rdhwr' +- instruction) names as appropriate for the CPU or architecture +- specified by ARCH. By default, HWR names are selected +- according to the architecture and CPU of the binary being +- disassembled. +- +- `reg-names=ABI' +- Print GPR and FPR names as appropriate for the selected ABI. +- +- `reg-names=ARCH' +- Print CPU-specific register names (CP0 register and HWR names) +- as appropriate for the selected CPU or architecture. +- +- For any of the options listed above, ABI or ARCH may be specified +- as `numeric' to have numbers printed rather than names, for the +- selected types of registers. You can list the available values of +- ABI and ARCH using the `--help' option. +- +- For VAX, you can specify function entry addresses with `-M +- entry:0xf00ba'. You can use this multiple times to properly +- disassemble VAX binary files that don't contain symbol tables (like +- ROM dumps). In these cases, the function entry mask would +- otherwise be decoded as VAX instructions, which would probably +- lead the rest of the function being wrongly disassembled. +- +-`-p' +-`--private-headers' +- Print information that is specific to the object file format. The +- exact information printed depends upon the object file format. +- For some object file formats, no additional information is printed. +- +-`-P OPTIONS' +-`--private=OPTIONS' +- Print information that is specific to the object file format. The +- argument OPTIONS is a comma separated list that depends on the +- format (the lists of options is displayed with the help). +- +- For XCOFF, the available options are: `header', `aout', +- `sections', `syms', `relocs', `lineno', `loader', `except', +- `typchk', `traceback', `toc' and `ldinfo'. +- +-`-r' +-`--reloc' +- Print the relocation entries of the file. If used with `-d' or +- `-D', the relocations are printed interspersed with the +- disassembly. +- +-`-R' +-`--dynamic-reloc' +- Print the dynamic relocation entries of the file. This is only +- meaningful for dynamic objects, such as certain types of shared +- libraries. As for `-r', if used with `-d' or `-D', the +- relocations are printed interspersed with the disassembly. +- +-`-s' +-`--full-contents' +- Display the full contents of any sections requested. By default +- all non-empty sections are displayed. +- +-`-S' +-`--source' +- Display source code intermixed with disassembly, if possible. +- Implies `-d'. +- +-`--prefix=PREFIX' +- Specify PREFIX to add to the absolute paths when used with `-S'. +- +-`--prefix-strip=LEVEL' +- Indicate how many initial directory names to strip off the +- hardwired absolute paths. It has no effect without +- `--prefix='PREFIX. +- +-`--show-raw-insn' +- When disassembling instructions, print the instruction in hex as +- well as in symbolic form. This is the default except when +- `--prefix-addresses' is used. +- +-`--no-show-raw-insn' +- When disassembling instructions, do not print the instruction +- bytes. This is the default when `--prefix-addresses' is used. +- +-`--insn-width=WIDTH' +- Display WIDTH bytes on a single line when disassembling +- instructions. +- +-`-W[lLiaprmfFsoRt]' +-`--dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]' +- Displays the contents of the debug sections in the file, if any are +- present. If one of the optional letters or words follows the +- switch then only data found in those specific sections will be +- dumped. +- +- Note that there is no single letter option to display the content +- of trace sections or .gdb_index. +- +- Note: the output from the `=info' option can also be affected by +- the options `--dwarf-depth', the `--dwarf-start' and the +- `--dwarf-check'. +- +-`--dwarf-depth=N' +- Limit the dump of the `.debug_info' section to N children. This +- is only useful with `--dwarf=info'. The default is to print all +- DIEs; the special value 0 for N will also have this effect. +- +- With a non-zero value for N, DIEs at or deeper than N levels will +- not be printed. The range for N is zero-based. +- +-`--dwarf-start=N' +- Print only DIEs beginning with the DIE numbered N. This is only +- useful with `--dwarf=info'. +- +- If specified, this option will suppress printing of any header +- information and all DIEs before the DIE numbered N. Only siblings +- and children of the specified DIE will be printed. +- +- This can be used in conjunction with `--dwarf-depth'. +- +-`--dwarf-check' +- Enable additional checks for consistency of Dwarf information. +- +-`-G' +-`--stabs' +- Display the full contents of any sections requested. Display the +- contents of the .stab and .stab.index and .stab.excl sections from +- an ELF file. This is only useful on systems (such as Solaris 2.0) +- in which `.stab' debugging symbol-table entries are carried in an +- ELF section. In most other file formats, debugging symbol-table +- entries are interleaved with linkage symbols, and are visible in +- the `--syms' output. +- +-`--start-address=ADDRESS' +- Start displaying data at the specified address. This affects the +- output of the `-d', `-r' and `-s' options. +- +-`--stop-address=ADDRESS' +- Stop displaying data at the specified address. This affects the +- output of the `-d', `-r' and `-s' options. +- +-`-t' +-`--syms' +- Print the symbol table entries of the file. This is similar to +- the information provided by the `nm' program, although the display +- format is different. The format of the output depends upon the +- format of the file being dumped, but there are two main types. +- One looks like this: +- +- [ 4](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .bss +- [ 6](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 fred +- +- where the number inside the square brackets is the number of the +- entry in the symbol table, the SEC number is the section number, +- the FL value are the symbol's flag bits, the TY number is the +- symbol's type, the SCL number is the symbol's storage class and +- the NX value is the number of auxilary entries associated with the +- symbol. The last two fields are the symbol's value and its name. +- +- The other common output format, usually seen with ELF based files, +- looks like this: +- +- 00000000 l d .bss 00000000 .bss +- 00000000 g .text 00000000 fred +- +- Here the first number is the symbol's value (sometimes refered to +- as its address). The next field is actually a set of characters +- and spaces indicating the flag bits that are set on the symbol. +- These characters are described below. Next is the section with +- which the symbol is associated or _*ABS*_ if the section is +- absolute (ie not connected with any section), or _*UND*_ if the +- section is referenced in the file being dumped, but not defined +- there. +- +- After the section name comes another field, a number, which for +- common symbols is the alignment and for other symbol is the size. +- Finally the symbol's name is displayed. +- +- The flag characters are divided into 7 groups as follows: +- `l' +- `g' +- `u' +- `!' +- The symbol is a local (l), global (g), unique global (u), +- neither global nor local (a space) or both global and local +- (!). A symbol can be neither local or global for a variety +- of reasons, e.g., because it is used for debugging, but it is +- probably an indication of a bug if it is ever both local and +- global. Unique global symbols are a GNU extension to the +- standard set of ELF symbol bindings. For such a symbol the +- dynamic linker will make sure that in the entire process +- there is just one symbol with this name and type in use. +- +- `w' +- The symbol is weak (w) or strong (a space). +- +- `C' +- The symbol denotes a constructor (C) or an ordinary symbol (a +- space). +- +- `W' +- The symbol is a warning (W) or a normal symbol (a space). A +- warning symbol's name is a message to be displayed if the +- symbol following the warning symbol is ever referenced. +- +- `I' +- +- `i' +- The symbol is an indirect reference to another symbol (I), a +- function to be evaluated during reloc processing (i) or a +- normal symbol (a space). +- +- `d' +- `D' +- The symbol is a debugging symbol (d) or a dynamic symbol (D) +- or a normal symbol (a space). +- +- `F' +- +- `f' +- +- `O' +- The symbol is the name of a function (F) or a file (f) or an +- object (O) or just a normal symbol (a space). +- +-`-T' +-`--dynamic-syms' +- Print the dynamic symbol table entries of the file. This is only +- meaningful for dynamic objects, such as certain types of shared +- libraries. This is similar to the information provided by the `nm' +- program when given the `-D' (`--dynamic') option. +- +-`--special-syms' +- When displaying symbols include those which the target considers +- to be special in some way and which would not normally be of +- interest to the user. +- +-`-V' +-`--version' +- Print the version number of `objdump' and exit. +- +-`-x' +-`--all-headers' +- Display all available header information, including the symbol +- table and relocation entries. Using `-x' is equivalent to +- specifying all of `-a -f -h -p -r -t'. +- +-`-w' +-`--wide' +- Format some lines for output devices that have more than 80 +- columns. Also do not truncate symbol names when they are +- displayed. +- +-`-z' +-`--disassemble-zeroes' +- Normally the disassembly output will skip blocks of zeroes. This +- option directs the disassembler to disassemble those blocks, just +- like any other data. +- +- +-File: binutils.info, Node: ranlib, Next: size, Prev: objdump, Up: Top +- +-5 ranlib +-******** +- +- ranlib [`--plugin' NAME] [`-DhHvVt'] ARCHIVE +- +- `ranlib' generates an index to the contents of an archive and stores +-it in the archive. The index lists each symbol defined by a member of +-an archive that is a relocatable object file. +- +- You may use `nm -s' or `nm --print-armap' to list this index. +- +- An archive with such an index speeds up linking to the library and +-allows routines in the library to call each other without regard to +-their placement in the archive. +- +- The GNU `ranlib' program is another form of GNU `ar'; running +-`ranlib' is completely equivalent to executing `ar -s'. *Note ar::. +- +-`-h' +-`-H' +-`--help' +- Show usage information for `ranlib'. +- +-`-v' +-`-V' +-`--version' +- Show the version number of `ranlib'. +- +-`-D' +- Operate in _deterministic_ mode. The symbol map archive member's +- header will show zero for the UID, GID, and timestamp. When this +- option is used, multiple runs will produce identical output files. +- +- If `binutils' was configured with +- `--enable-deterministic-archives', then this mode is on by +- default. It can be disabled with the `-U' option, described below. +- +-`-t' +- Update the timestamp of the symbol map of an archive. +- +-`-U' +- Do _not_ operate in _deterministic_ mode. This is the inverse of +- the `-D' option, above: the archive index will get actual UID, +- GID, timestamp, and file mode values. +- +- If `binutils' was configured _without_ +- `--enable-deterministic-archives', then this mode is on by default. +- +- +- +-File: binutils.info, Node: size, Next: strings, Prev: ranlib, Up: Top +- +-6 size +-****** +- +- size [`-A'|`-B'|`--format='COMPATIBILITY] +- [`--help'] +- [`-d'|`-o'|`-x'|`--radix='NUMBER] +- [`--common'] +- [`-t'|`--totals'] +- [`--target='BFDNAME] [`-V'|`--version'] +- [OBJFILE...] +- +- The GNU `size' utility lists the section sizes--and the total +-size--for each of the object or archive files OBJFILE in its argument +-list. By default, one line of output is generated for each object file +-or each module in an archive. +- +- OBJFILE... are the object files to be examined. If none are +-specified, the file `a.out' will be used. +- +- The command line options have the following meanings: +- +-`-A' +-`-B' +-`--format=COMPATIBILITY' +- Using one of these options, you can choose whether the output from +- GNU `size' resembles output from System V `size' (using `-A', or +- `--format=sysv'), or Berkeley `size' (using `-B', or +- `--format=berkeley'). The default is the one-line format similar +- to Berkeley's. +- +- Here is an example of the Berkeley (default) format of output from +- `size': +- $ size --format=Berkeley ranlib size +- text data bss dec hex filename +- 294880 81920 11592 388392 5ed28 ranlib +- 294880 81920 11888 388688 5ee50 size +- +- This is the same data, but displayed closer to System V +- conventions: +- +- $ size --format=SysV ranlib size +- ranlib : +- section size addr +- .text 294880 8192 +- .data 81920 303104 +- .bss 11592 385024 +- Total 388392 +- +- +- size : +- section size addr +- .text 294880 8192 +- .data 81920 303104 +- .bss 11888 385024 +- Total 388688 +- +-`--help' +- Show a summary of acceptable arguments and options. +- +-`-d' +-`-o' +-`-x' +-`--radix=NUMBER' +- Using one of these options, you can control whether the size of +- each section is given in decimal (`-d', or `--radix=10'); octal +- (`-o', or `--radix=8'); or hexadecimal (`-x', or `--radix=16'). +- In `--radix=NUMBER', only the three values (8, 10, 16) are +- supported. The total size is always given in two radices; decimal +- and hexadecimal for `-d' or `-x' output, or octal and hexadecimal +- if you're using `-o'. +- +-`--common' +- Print total size of common symbols in each file. When using +- Berkeley format these are included in the bss size. +- +-`-t' +-`--totals' +- Show totals of all objects listed (Berkeley format listing mode +- only). +- +-`--target=BFDNAME' +- Specify that the object-code format for OBJFILE is BFDNAME. This +- option may not be necessary; `size' can automatically recognize +- many formats. *Note Target Selection::, for more information. +- +-`-V' +-`--version' +- Display the version number of `size'. +- +- +-File: binutils.info, Node: strings, Next: strip, Prev: size, Up: Top +- +-7 strings +-********* +- +- strings [`-afovV'] [`-'MIN-LEN] +- [`-n' MIN-LEN] [`--bytes='MIN-LEN] +- [`-t' RADIX] [`--radix='RADIX] +- [`-e' ENCODING] [`--encoding='ENCODING] +- [`-'] [`--all'] [`--print-file-name'] +- [`-T' BFDNAME] [`--target='BFDNAME] +- [`--help'] [`--version'] FILE... +- +- For each FILE given, GNU `strings' prints the printable character +-sequences that are at least 4 characters long (or the number given with +-the options below) and are followed by an unprintable character. By +-default, it only prints the strings from the initialized and loaded +-sections of object files; for other types of files, it prints the +-strings from the whole file. +- +- `strings' is mainly useful for determining the contents of non-text +-files. +- +-`-a' +-`--all' +-`-' +- Do not scan only the initialized and loaded sections of object +- files; scan the whole files. +- +-`-f' +-`--print-file-name' +- Print the name of the file before each string. +- +-`--help' +- Print a summary of the program usage on the standard output and +- exit. +- +-`-MIN-LEN' +-`-n MIN-LEN' +-`--bytes=MIN-LEN' +- Print sequences of characters that are at least MIN-LEN characters +- long, instead of the default 4. +- +-`-o' +- Like `-t o'. Some other versions of `strings' have `-o' act like +- `-t d' instead. Since we can not be compatible with both ways, we +- simply chose one. +- +-`-t RADIX' +-`--radix=RADIX' +- Print the offset within the file before each string. The single +- character argument specifies the radix of the offset--`o' for +- octal, `x' for hexadecimal, or `d' for decimal. +- +-`-e ENCODING' +-`--encoding=ENCODING' +- Select the character encoding of the strings that are to be found. +- Possible values for ENCODING are: `s' = single-7-bit-byte +- characters (ASCII, ISO 8859, etc., default), `S' = +- single-8-bit-byte characters, `b' = 16-bit bigendian, `l' = 16-bit +- littleendian, `B' = 32-bit bigendian, `L' = 32-bit littleendian. +- Useful for finding wide character strings. (`l' and `b' apply to, +- for example, Unicode UTF-16/UCS-2 encodings). +- +-`-T BFDNAME' +-`--target=BFDNAME' +- Specify an object code format other than your system's default +- format. *Note Target Selection::, for more information. +- +-`-v' +-`-V' +-`--version' +- Print the program version number on the standard output and exit. +- +- +-File: binutils.info, Node: strip, Next: c++filt, Prev: strings, Up: Top +- +-8 strip +-******* +- +- strip [`-F' BFDNAME |`--target='BFDNAME] +- [`-I' BFDNAME |`--input-target='BFDNAME] +- [`-O' BFDNAME |`--output-target='BFDNAME] +- [`-s'|`--strip-all'] +- [`-S'|`-g'|`-d'|`--strip-debug'] +- [`--strip-dwo'] +- [`-K' SYMBOLNAME |`--keep-symbol='SYMBOLNAME] +- [`-N' SYMBOLNAME |`--strip-symbol='SYMBOLNAME] +- [`-w'|`--wildcard'] +- [`-x'|`--discard-all'] [`-X' |`--discard-locals'] +- [`-R' SECTIONNAME |`--remove-section='SECTIONNAME] +- [`-o' FILE] [`-p'|`--preserve-dates'] +- [`-D'|`--enable-deterministic-archives'] +- [`-U'|`--disable-deterministic-archives'] +- [`--keep-file-symbols'] +- [`--only-keep-debug'] +- [`-v' |`--verbose'] [`-V'|`--version'] +- [`--help'] [`--info'] +- OBJFILE... +- +- GNU `strip' discards all symbols from object files OBJFILE. The +-list of object files may include archives. At least one object file +-must be given. +- +- `strip' modifies the files named in its argument, rather than +-writing modified copies under different names. +- +-`-F BFDNAME' +-`--target=BFDNAME' +- Treat the original OBJFILE as a file with the object code format +- BFDNAME, and rewrite it in the same format. *Note Target +- Selection::, for more information. +- +-`--help' +- Show a summary of the options to `strip' and exit. +- +-`--info' +- Display a list showing all architectures and object formats +- available. +- +-`-I BFDNAME' +-`--input-target=BFDNAME' +- Treat the original OBJFILE as a file with the object code format +- BFDNAME. *Note Target Selection::, for more information. +- +-`-O BFDNAME' +-`--output-target=BFDNAME' +- Replace OBJFILE with a file in the output format BFDNAME. *Note +- Target Selection::, for more information. +- +-`-R SECTIONNAME' +-`--remove-section=SECTIONNAME' +- Remove any section named SECTIONNAME from the output file. This +- option may be given more than once. Note that using this option +- inappropriately may make the output file unusable. The wildcard +- character `*' may be given at the end of SECTIONNAME. If so, then +- any section starting with SECTIONNAME will be removed. +- +-`-s' +-`--strip-all' +- Remove all symbols. +- +-`-g' +-`-S' +-`-d' +-`--strip-debug' +- Remove debugging symbols only. +- +-`--strip-dwo' +- Remove the contents of all DWARF .dwo sections, leaving the +- remaining debugging sections and all symbols intact. See the +- description of this option in the `objcopy' section for more +- information. +- +-`--strip-unneeded' +- Remove all symbols that are not needed for relocation processing. +- +-`-K SYMBOLNAME' +-`--keep-symbol=SYMBOLNAME' +- When stripping symbols, keep symbol SYMBOLNAME even if it would +- normally be stripped. This option may be given more than once. +- +-`-N SYMBOLNAME' +-`--strip-symbol=SYMBOLNAME' +- Remove symbol SYMBOLNAME from the source file. This option may be +- given more than once, and may be combined with strip options other +- than `-K'. +- +-`-o FILE' +- Put the stripped output in FILE, rather than replacing the +- existing file. When this argument is used, only one OBJFILE +- argument may be specified. +- +-`-p' +-`--preserve-dates' +- Preserve the access and modification dates of the file. +- +-`-D' +-`--enable-deterministic-archives' +- Operate in _deterministic_ mode. When copying archive members and +- writing the archive index, use zero for UIDs, GIDs, timestamps, +- and use consistent file modes for all files. +- +- If `binutils' was configured with +- `--enable-deterministic-archives', then this mode is on by default. +- It can be disabled with the `-U' option, below. +- +-`-U' +-`--disable-deterministic-archives' +- Do _not_ operate in _deterministic_ mode. This is the inverse of +- the `-D' option, above: when copying archive members and writing +- the archive index, use their actual UID, GID, timestamp, and file +- mode values. +- +- This is the default unless `binutils' was configured with +- `--enable-deterministic-archives'. +- +-`-w' +-`--wildcard' +- Permit regular expressions in SYMBOLNAMEs used in other command +- line options. The question mark (?), asterisk (*), backslash (\) +- and square brackets ([]) operators can be used anywhere in the +- symbol name. If the first character of the symbol name is the +- exclamation point (!) then the sense of the switch is reversed for +- that symbol. For example: +- +- -w -K !foo -K fo* +- +- would cause strip to only keep symbols that start with the letters +- "fo", but to discard the symbol "foo". +- +-`-x' +-`--discard-all' +- Remove non-global symbols. +- +-`-X' +-`--discard-locals' +- Remove compiler-generated local symbols. (These usually start +- with `L' or `.'.) +- +-`--keep-file-symbols' +- When stripping a file, perhaps with `--strip-debug' or +- `--strip-unneeded', retain any symbols specifying source file +- names, which would otherwise get stripped. +- +-`--only-keep-debug' +- Strip a file, removing contents of any sections that would not be +- stripped by `--strip-debug' and leaving the debugging sections +- intact. In ELF files, this preserves all note sections in the +- output. +- +- The intention is that this option will be used in conjunction with +- `--add-gnu-debuglink' to create a two part executable. One a +- stripped binary which will occupy less space in RAM and in a +- distribution and the second a debugging information file which is +- only needed if debugging abilities are required. The suggested +- procedure to create these files is as follows: +- +- 1. Link the executable as normal. Assuming that is is called +- `foo' then... +- +- 2. Run `objcopy --only-keep-debug foo foo.dbg' to create a file +- containing the debugging info. +- +- 3. Run `objcopy --strip-debug foo' to create a stripped +- executable. +- +- 4. Run `objcopy --add-gnu-debuglink=foo.dbg foo' to add a link +- to the debugging info into the stripped executable. +- +- Note--the choice of `.dbg' as an extension for the debug info file +- is arbitrary. Also the `--only-keep-debug' step is optional. You +- could instead do this: +- +- 1. Link the executable as normal. +- +- 2. Copy `foo' to `foo.full' +- +- 3. Run `strip --strip-debug foo' +- +- 4. Run `objcopy --add-gnu-debuglink=foo.full foo' +- +- i.e., the file pointed to by the `--add-gnu-debuglink' can be the +- full executable. It does not have to be a file created by the +- `--only-keep-debug' switch. +- +- Note--this switch is only intended for use on fully linked files. +- It does not make sense to use it on object files where the +- debugging information may be incomplete. Besides the +- gnu_debuglink feature currently only supports the presence of one +- filename containing debugging information, not multiple filenames +- on a one-per-object-file basis. +- +-`-V' +-`--version' +- Show the version number for `strip'. +- +-`-v' +-`--verbose' +- Verbose output: list all object files modified. In the case of +- archives, `strip -v' lists all members of the archive. +- +- +-File: binutils.info, Node: c++filt, Next: addr2line, Prev: strip, Up: Top +- +-9 c++filt +-********* +- +- c++filt [`-_'|`--strip-underscore'] +- [`-n'|`--no-strip-underscore'] +- [`-p'|`--no-params'] +- [`-t'|`--types'] +- [`-i'|`--no-verbose'] +- [`-s' FORMAT|`--format='FORMAT] +- [`--help'] [`--version'] [SYMBOL...] +- +- The C++ and Java languages provide function overloading, which means +-that you can write many functions with the same name, providing that +-each function takes parameters of different types. In order to be able +-to distinguish these similarly named functions C++ and Java encode them +-into a low-level assembler name which uniquely identifies each +-different version. This process is known as "mangling". The `c++filt' +-(1) program does the inverse mapping: it decodes ("demangles") low-level +-names into user-level names so that they can be read. +- +- Every alphanumeric word (consisting of letters, digits, underscores, +-dollars, or periods) seen in the input is a potential mangled name. If +-the name decodes into a C++ name, the C++ name replaces the low-level +-name in the output, otherwise the original word is output. In this way +-you can pass an entire assembler source file, containing mangled names, +-through `c++filt' and see the same source file containing demangled +-names. +- +- You can also use `c++filt' to decipher individual symbols by passing +-them on the command line: +- +- c++filt SYMBOL +- +- If no SYMBOL arguments are given, `c++filt' reads symbol names from +-the standard input instead. All the results are printed on the +-standard output. The difference between reading names from the command +-line versus reading names from the standard input is that command line +-arguments are expected to be just mangled names and no checking is +-performed to separate them from surrounding text. Thus for example: +- +- c++filt -n _Z1fv +- +- will work and demangle the name to "f()" whereas: +- +- c++filt -n _Z1fv, +- +- will not work. (Note the extra comma at the end of the mangled name +-which makes it invalid). This command however will work: +- +- echo _Z1fv, | c++filt -n +- +- and will display "f(),", i.e., the demangled name followed by a +-trailing comma. This behaviour is because when the names are read from +-the standard input it is expected that they might be part of an +-assembler source file where there might be extra, extraneous characters +-trailing after a mangled name. For example: +- +- .type _Z1fv, @function +- +-`-_' +-`--strip-underscore' +- On some systems, both the C and C++ compilers put an underscore in +- front of every name. For example, the C name `foo' gets the +- low-level name `_foo'. This option removes the initial +- underscore. Whether `c++filt' removes the underscore by default +- is target dependent. +- +-`-n' +-`--no-strip-underscore' +- Do not remove the initial underscore. +- +-`-p' +-`--no-params' +- When demangling the name of a function, do not display the types of +- the function's parameters. +- +-`-t' +-`--types' +- Attempt to demangle types as well as function names. This is +- disabled by default since mangled types are normally only used +- internally in the compiler, and they can be confused with +- non-mangled names. For example, a function called "a" treated as +- a mangled type name would be demangled to "signed char". +- +-`-i' +-`--no-verbose' +- Do not include implementation details (if any) in the demangled +- output. +- +-`-s FORMAT' +-`--format=FORMAT' +- `c++filt' can decode various methods of mangling, used by +- different compilers. The argument to this option selects which +- method it uses: +- +- `auto' +- Automatic selection based on executable (the default method) +- +- `gnu' +- the one used by the GNU C++ compiler (g++) +- +- `lucid' +- the one used by the Lucid compiler (lcc) +- +- `arm' +- the one specified by the C++ Annotated Reference Manual +- +- `hp' +- the one used by the HP compiler (aCC) +- +- `edg' +- the one used by the EDG compiler +- +- `gnu-v3' +- the one used by the GNU C++ compiler (g++) with the V3 ABI. +- +- `java' +- the one used by the GNU Java compiler (gcj) +- +- `gnat' +- the one used by the GNU Ada compiler (GNAT). +- +-`--help' +- Print a summary of the options to `c++filt' and exit. +- +-`--version' +- Print the version number of `c++filt' and exit. +- +- _Warning:_ `c++filt' is a new utility, and the details of its user +- interface are subject to change in future releases. In particular, +- a command-line option may be required in the future to decode a +- name passed as an argument on the command line; in other words, +- +- c++filt SYMBOL +- +- may in a future release become +- +- c++filt OPTION SYMBOL +- +- ---------- Footnotes ---------- +- +- (1) MS-DOS does not allow `+' characters in file names, so on MS-DOS +-this program is named `CXXFILT'. +- +- +-File: binutils.info, Node: addr2line, Next: nlmconv, Prev: c++filt, Up: Top +- +-10 addr2line +-************ +- +- addr2line [`-a'|`--addresses'] +- [`-b' BFDNAME|`--target='BFDNAME] +- [`-C'|`--demangle'[=STYLE]] +- [`-e' FILENAME|`--exe='FILENAME] +- [`-f'|`--functions'] [`-s'|`--basename'] +- [`-i'|`--inlines'] +- [`-p'|`--pretty-print'] +- [`-j'|`--section='NAME] +- [`-H'|`--help'] [`-V'|`--version'] +- [addr addr ...] +- +- `addr2line' translates addresses into file names and line numbers. +-Given an address in an executable or an offset in a section of a +-relocatable object, it uses the debugging information to figure out +-which file name and line number are associated with it. +- +- The executable or relocatable object to use is specified with the +-`-e' option. The default is the file `a.out'. The section in the +-relocatable object to use is specified with the `-j' option. +- +- `addr2line' has two modes of operation. +- +- In the first, hexadecimal addresses are specified on the command +-line, and `addr2line' displays the file name and line number for each +-address. +- +- In the second, `addr2line' reads hexadecimal addresses from standard +-input, and prints the file name and line number for each address on +-standard output. In this mode, `addr2line' may be used in a pipe to +-convert dynamically chosen addresses. +- +- The format of the output is `FILENAME:LINENO'. The file name and +-line number for each input address is printed on separate lines. +- +- If the `-f' option is used, then each `FILENAME:LINENO' line is +-preceded by `FUNCTIONNAME' which is the name of the function containing +-the address. +- +- If the `-i' option is used and the code at the given address is +-present there because of inlining by the compiler then the +-`{FUNCTIONNAME} FILENAME:LINENO' information for the inlining function +-will be displayed afterwards. This continues recursively until there +-is no more inlining to report. +- +- If the `-a' option is used then the output is prefixed by the input +-address. +- +- If the `-p' option is used then the output for each input address is +-displayed on one, possibly quite long, line. If `-p' is not used then +-the output is broken up into multiple lines, based on the paragraphs +-above. +- +- If the file name or function name can not be determined, `addr2line' +-will print two question marks in their place. If the line number can +-not be determined, `addr2line' will print 0. +- +- The long and short forms of options, shown here as alternatives, are +-equivalent. +- +-`-a' +-`--addresses' +- Display the address before the function name, file and line number +- information. The address is printed with a `0x' prefix to easily +- identify it. +- +-`-b BFDNAME' +-`--target=BFDNAME' +- Specify that the object-code format for the object files is +- BFDNAME. +- +-`-C' +-`--demangle[=STYLE]' +- Decode ("demangle") low-level symbol names into user-level names. +- Besides removing any initial underscore prepended by the system, +- this makes C++ function names readable. Different compilers have +- different mangling styles. The optional demangling style argument +- can be used to choose an appropriate demangling style for your +- compiler. *Note c++filt::, for more information on demangling. +- +-`-e FILENAME' +-`--exe=FILENAME' +- Specify the name of the executable for which addresses should be +- translated. The default file is `a.out'. +- +-`-f' +-`--functions' +- Display function names as well as file and line number information. +- +-`-s' +-`--basenames' +- Display only the base of each file name. +- +-`-i' +-`--inlines' +- If the address belongs to a function that was inlined, the source +- information for all enclosing scopes back to the first non-inlined +- function will also be printed. For example, if `main' inlines +- `callee1' which inlines `callee2', and address is from `callee2', +- the source information for `callee1' and `main' will also be +- printed. +- +-`-j' +-`--section' +- Read offsets relative to the specified section instead of absolute +- addresses. +- +-`-p' +-`--pretty-print' +- Make the output more human friendly: each location are printed on +- one line. If option `-i' is specified, lines for all enclosing +- scopes are prefixed with `(inlined by)'. +- +- +-File: binutils.info, Node: nlmconv, Next: windmc, Prev: addr2line, Up: Top +- +-11 nlmconv +-********** +- +-`nlmconv' converts a relocatable object file into a NetWare Loadable +-Module. +- +- _Warning:_ `nlmconv' is not always built as part of the binary +- utilities, since it is only useful for NLM targets. +- +- nlmconv [`-I' BFDNAME|`--input-target='BFDNAME] +- [`-O' BFDNAME|`--output-target='BFDNAME] +- [`-T' HEADERFILE|`--header-file='HEADERFILE] +- [`-d'|`--debug'] [`-l' LINKER|`--linker='LINKER] +- [`-h'|`--help'] [`-V'|`--version'] +- INFILE OUTFILE +- +- `nlmconv' converts the relocatable `i386' object file INFILE into +-the NetWare Loadable Module OUTFILE, optionally reading HEADERFILE for +-NLM header information. For instructions on writing the NLM command +-file language used in header files, see the `linkers' section, +-`NLMLINK' in particular, of the `NLM Development and Tools Overview', +-which is part of the NLM Software Developer's Kit ("NLM SDK"), +-available from Novell, Inc. `nlmconv' uses the GNU Binary File +-Descriptor library to read INFILE; see *Note BFD: (ld.info)BFD, for +-more information. +- +- `nlmconv' can perform a link step. In other words, you can list +-more than one object file for input if you list them in the definitions +-file (rather than simply specifying one input file on the command line). +-In this case, `nlmconv' calls the linker for you. +- +-`-I BFDNAME' +-`--input-target=BFDNAME' +- Object format of the input file. `nlmconv' can usually determine +- the format of a given file (so no default is necessary). *Note +- Target Selection::, for more information. +- +-`-O BFDNAME' +-`--output-target=BFDNAME' +- Object format of the output file. `nlmconv' infers the output +- format based on the input format, e.g. for a `i386' input file the +- output format is `nlm32-i386'. *Note Target Selection::, for more +- information. +- +-`-T HEADERFILE' +-`--header-file=HEADERFILE' +- Reads HEADERFILE for NLM header information. For instructions on +- writing the NLM command file language used in header files, see +- see the `linkers' section, of the `NLM Development and Tools +- Overview', which is part of the NLM Software Developer's Kit, +- available from Novell, Inc. +- +-`-d' +-`--debug' +- Displays (on standard error) the linker command line used by +- `nlmconv'. +- +-`-l LINKER' +-`--linker=LINKER' +- Use LINKER for any linking. LINKER can be an absolute or a +- relative pathname. +- +-`-h' +-`--help' +- Prints a usage summary. +- +-`-V' +-`--version' +- Prints the version number for `nlmconv'. +- +- +-File: binutils.info, Node: windmc, Next: windres, Prev: nlmconv, Up: Top +- +-12 windmc +-********* +- +-`windmc' may be used to generator Windows message resources. +- +- _Warning:_ `windmc' is not always built as part of the binary +- utilities, since it is only useful for Windows targets. +- +- windmc [options] input-file +- +- `windmc' reads message definitions from an input file (.mc) and +-translate them into a set of output files. The output files may be of +-four kinds: +- +-`h' +- A C header file containing the message definitions. +- +-`rc' +- A resource file compilable by the `windres' tool. +- +-`bin' +- One or more binary files containing the resource data for a +- specific message language. +- +-`dbg' +- A C include file that maps message id's to their symbolic name. +- +- The exact description of these different formats is available in +-documentation from Microsoft. +- +- When `windmc' converts from the `mc' format to the `bin' format, +-`rc', `h', and optional `dbg' it is acting like the Windows Message +-Compiler. +- +-`-a' +-`--ascii_in' +- Specifies that the input file specified is ASCII. This is the +- default behaviour. +- +-`-A' +-`--ascii_out' +- Specifies that messages in the output `bin' files should be in +- ASCII format. +- +-`-b' +-`--binprefix' +- Specifies that `bin' filenames should have to be prefixed by the +- basename of the source file. +- +-`-c' +-`--customflag' +- Sets the customer bit in all message id's. +- +-`-C CODEPAGE' +-`--codepage_in CODEPAGE' +- Sets the default codepage to be used to convert input file to +- UTF16. The default is ocdepage 1252. +- +-`-d' +-`--decimal_values' +- Outputs the constants in the header file in decimal. Default is +- using hexadecimal output. +- +-`-e EXT' +-`--extension EXT' +- The extension for the header file. The default is .h extension. +- +-`-F TARGET' +-`--target TARGET' +- Specify the BFD format to use for a bin file as output. This is a +- BFD target name; you can use the `--help' option to see a list of +- supported targets. Normally `windmc' will use the default format, +- which is the first one listed by the `--help' option. *Note +- Target Selection::. +- +-`-h PATH' +-`--headerdir PATH' +- The target directory of the generated header file. The default is +- the current directory. +- +-`-H' +-`--help' +- Displays a list of command line options and then exits. +- +-`-m CHARACTERS' +-`--maxlength CHARACTERS' +- Instructs `windmc' to generate a warning if the length of any +- message exceeds the number specified. +- +-`-n' +-`--nullterminate' +- Terminate message text in `bin' files by zero. By default they are +- terminated by CR/LF. +- +-`-o' +-`--hresult_use' +- Not yet implemented. Instructs `windmc' to generate an OLE2 header +- file, using HRESULT definitions. Status codes are used if the flag +- is not specified. +- +-`-O CODEPAGE' +-`--codepage_out CODEPAGE' +- Sets the default codepage to be used to output text files. The +- default is ocdepage 1252. +- +-`-r PATH' +-`--rcdir PATH' +- The target directory for the generated `rc' script and the +- generated `bin' files that the resource compiler script includes. +- The default is the current directory. +- +-`-u' +-`--unicode_in' +- Specifies that the input file is UTF16. +- +-`-U' +-`--unicode_out' +- Specifies that messages in the output `bin' file should be in UTF16 +- format. This is the default behaviour. +- +-`-v' +- +-`--verbose' +- Enable verbose mode. +- +-`-V' +- +-`--version' +- Prints the version number for `windmc'. +- +-`-x PATH' +-`--xdgb PATH' +- The path of the `dbg' C include file that maps message id's to the +- symbolic name. No such file is generated without specifying the +- switch. +- +- +-File: binutils.info, Node: windres, Next: dlltool, Prev: windmc, Up: Top +- +-13 windres +-********** +- +-`windres' may be used to manipulate Windows resources. +- +- _Warning:_ `windres' is not always built as part of the binary +- utilities, since it is only useful for Windows targets. +- +- windres [options] [input-file] [output-file] +- +- `windres' reads resources from an input file and copies them into an +-output file. Either file may be in one of three formats: +- +-`rc' +- A text format read by the Resource Compiler. +- +-`res' +- A binary format generated by the Resource Compiler. +- +-`coff' +- A COFF object or executable. +- +- The exact description of these different formats is available in +-documentation from Microsoft. +- +- When `windres' converts from the `rc' format to the `res' format, it +-is acting like the Windows Resource Compiler. When `windres' converts +-from the `res' format to the `coff' format, it is acting like the +-Windows `CVTRES' program. +- +- When `windres' generates an `rc' file, the output is similar but not +-identical to the format expected for the input. When an input `rc' +-file refers to an external filename, an output `rc' file will instead +-include the file contents. +- +- If the input or output format is not specified, `windres' will guess +-based on the file name, or, for the input file, the file contents. A +-file with an extension of `.rc' will be treated as an `rc' file, a file +-with an extension of `.res' will be treated as a `res' file, and a file +-with an extension of `.o' or `.exe' will be treated as a `coff' file. +- +- If no output file is specified, `windres' will print the resources +-in `rc' format to standard output. +- +- The normal use is for you to write an `rc' file, use `windres' to +-convert it to a COFF object file, and then link the COFF file into your +-application. This will make the resources described in the `rc' file +-available to Windows. +- +-`-i FILENAME' +-`--input FILENAME' +- The name of the input file. If this option is not used, then +- `windres' will use the first non-option argument as the input file +- name. If there are no non-option arguments, then `windres' will +- read from standard input. `windres' can not read a COFF file from +- standard input. +- +-`-o FILENAME' +-`--output FILENAME' +- The name of the output file. If this option is not used, then +- `windres' will use the first non-option argument, after any used +- for the input file name, as the output file name. If there is no +- non-option argument, then `windres' will write to standard output. +- `windres' can not write a COFF file to standard output. Note, for +- compatibility with `rc' the option `-fo' is also accepted, but its +- use is not recommended. +- +-`-J FORMAT' +-`--input-format FORMAT' +- The input format to read. FORMAT may be `res', `rc', or `coff'. +- If no input format is specified, `windres' will guess, as +- described above. +- +-`-O FORMAT' +-`--output-format FORMAT' +- The output format to generate. FORMAT may be `res', `rc', or +- `coff'. If no output format is specified, `windres' will guess, +- as described above. +- +-`-F TARGET' +-`--target TARGET' +- Specify the BFD format to use for a COFF file as input or output. +- This is a BFD target name; you can use the `--help' option to see +- a list of supported targets. Normally `windres' will use the +- default format, which is the first one listed by the `--help' +- option. *Note Target Selection::. +- +-`--preprocessor PROGRAM' +- When `windres' reads an `rc' file, it runs it through the C +- preprocessor first. This option may be used to specify the +- preprocessor to use, including any leading arguments. The default +- preprocessor argument is `gcc -E -xc-header -DRC_INVOKED'. +- +-`--preprocessor-arg OPTION' +- When `windres' reads an `rc' file, it runs it through the C +- preprocessor first. This option may be used to specify additional +- text to be passed to preprocessor on its command line. This +- option can be used multiple times to add multiple options to the +- preprocessor command line. +- +-`-I DIRECTORY' +-`--include-dir DIRECTORY' +- Specify an include directory to use when reading an `rc' file. +- `windres' will pass this to the preprocessor as an `-I' option. +- `windres' will also search this directory when looking for files +- named in the `rc' file. If the argument passed to this command +- matches any of the supported FORMATS (as described in the `-J' +- option), it will issue a deprecation warning, and behave just like +- the `-J' option. New programs should not use this behaviour. If a +- directory happens to match a FORMAT, simple prefix it with `./' to +- disable the backward compatibility. +- +-`-D TARGET' +-`--define SYM[=VAL]' +- Specify a `-D' option to pass to the preprocessor when reading an +- `rc' file. +- +-`-U TARGET' +-`--undefine SYM' +- Specify a `-U' option to pass to the preprocessor when reading an +- `rc' file. +- +-`-r' +- Ignored for compatibility with rc. +- +-`-v' +- Enable verbose mode. This tells you what the preprocessor is if +- you didn't specify one. +- +-`-c VAL' +- +-`--codepage VAL' +- Specify the default codepage to use when reading an `rc' file. +- VAL should be a hexadecimal prefixed by `0x' or decimal codepage +- code. The valid range is from zero up to 0xffff, but the validity +- of the codepage is host and configuration dependent. +- +-`-l VAL' +- +-`--language VAL' +- Specify the default language to use when reading an `rc' file. +- VAL should be a hexadecimal language code. The low eight bits are +- the language, and the high eight bits are the sublanguage. +- +-`--use-temp-file' +- Use a temporary file to instead of using popen to read the output +- of the preprocessor. Use this option if the popen implementation +- is buggy on the host (eg., certain non-English language versions +- of Windows 95 and Windows 98 are known to have buggy popen where +- the output will instead go the console). +- +-`--no-use-temp-file' +- Use popen, not a temporary file, to read the output of the +- preprocessor. This is the default behaviour. +- +-`-h' +- +-`--help' +- Prints a usage summary. +- +-`-V' +- +-`--version' +- Prints the version number for `windres'. +- +-`--yydebug' +- If `windres' is compiled with `YYDEBUG' defined as `1', this will +- turn on parser debugging. +- +- +-File: binutils.info, Node: dlltool, Next: readelf, Prev: windres, Up: Top +- +-14 dlltool +-********** +- +-`dlltool' is used to create the files needed to create dynamic link +-libraries (DLLs) on systems which understand PE format image files such +-as Windows. A DLL contains an export table which contains information +-that the runtime loader needs to resolve references from a referencing +-program. +- +- The export table is generated by this program by reading in a `.def' +-file or scanning the `.a' and `.o' files which will be in the DLL. A +-`.o' file can contain information in special `.drectve' sections with +-export information. +- +- _Note:_ `dlltool' is not always built as part of the binary +- utilities, since it is only useful for those targets which support +- DLLs. +- +- dlltool [`-d'|`--input-def' DEF-FILE-NAME] +- [`-b'|`--base-file' BASE-FILE-NAME] +- [`-e'|`--output-exp' EXPORTS-FILE-NAME] +- [`-z'|`--output-def' DEF-FILE-NAME] +- [`-l'|`--output-lib' LIBRARY-FILE-NAME] +- [`-y'|`--output-delaylib' LIBRARY-FILE-NAME] +- [`--export-all-symbols'] [`--no-export-all-symbols'] +- [`--exclude-symbols' LIST] +- [`--no-default-excludes'] +- [`-S'|`--as' PATH-TO-ASSEMBLER] [`-f'|`--as-flags' OPTIONS] +- [`-D'|`--dllname' NAME] [`-m'|`--machine' MACHINE] +- [`-a'|`--add-indirect'] +- [`-U'|`--add-underscore'] [`--add-stdcall-underscore'] +- [`-k'|`--kill-at'] [`-A'|`--add-stdcall-alias'] +- [`-p'|`--ext-prefix-alias' PREFIX] +- [`-x'|`--no-idata4'] [`-c'|`--no-idata5'] +- [`--use-nul-prefixed-import-tables'] +- [`-I'|`--identify' LIBRARY-FILE-NAME] [`--identify-strict'] +- [`-i'|`--interwork'] +- [`-n'|`--nodelete'] [`-t'|`--temp-prefix' PREFIX] +- [`-v'|`--verbose'] +- [`-h'|`--help'] [`-V'|`--version'] +- [`--no-leading-underscore'] [`--leading-underscore'] +- [object-file ...] +- +- `dlltool' reads its inputs, which can come from the `-d' and `-b' +-options as well as object files specified on the command line. It then +-processes these inputs and if the `-e' option has been specified it +-creates a exports file. If the `-l' option has been specified it +-creates a library file and if the `-z' option has been specified it +-creates a def file. Any or all of the `-e', `-l' and `-z' options can +-be present in one invocation of dlltool. +- +- When creating a DLL, along with the source for the DLL, it is +-necessary to have three other files. `dlltool' can help with the +-creation of these files. +- +- The first file is a `.def' file which specifies which functions are +-exported from the DLL, which functions the DLL imports, and so on. This +-is a text file and can be created by hand, or `dlltool' can be used to +-create it using the `-z' option. In this case `dlltool' will scan the +-object files specified on its command line looking for those functions +-which have been specially marked as being exported and put entries for +-them in the `.def' file it creates. +- +- In order to mark a function as being exported from a DLL, it needs to +-have an `-export:' entry in the `.drectve' section of +-the object file. This can be done in C by using the asm() operator: +- +- asm (".section .drectve"); +- asm (".ascii \"-export:my_func\""); +- +- int my_func (void) { ... } +- +- The second file needed for DLL creation is an exports file. This +-file is linked with the object files that make up the body of the DLL +-and it handles the interface between the DLL and the outside world. +-This is a binary file and it can be created by giving the `-e' option to +-`dlltool' when it is creating or reading in a `.def' file. +- +- The third file needed for DLL creation is the library file that +-programs will link with in order to access the functions in the DLL (an +-`import library'). This file can be created by giving the `-l' option +-to dlltool when it is creating or reading in a `.def' file. +- +- If the `-y' option is specified, dlltool generates a delay-import +-library that can be used instead of the normal import library to allow +-a program to link to the dll only as soon as an imported function is +-called for the first time. The resulting executable will need to be +-linked to the static delayimp library containing __delayLoadHelper2(), +-which in turn will import LoadLibraryA and GetProcAddress from kernel32. +- +- `dlltool' builds the library file by hand, but it builds the exports +-file by creating temporary files containing assembler statements and +-then assembling these. The `-S' command line option can be used to +-specify the path to the assembler that dlltool will use, and the `-f' +-option can be used to pass specific flags to that assembler. The `-n' +-can be used to prevent dlltool from deleting these temporary assembler +-files when it is done, and if `-n' is specified twice then this will +-prevent dlltool from deleting the temporary object files it used to +-build the library. +- +- Here is an example of creating a DLL from a source file `dll.c' and +-also creating a program (from an object file called `program.o') that +-uses that DLL: +- +- gcc -c dll.c +- dlltool -e exports.o -l dll.lib dll.o +- gcc dll.o exports.o -o dll.dll +- gcc program.o dll.lib -o program +- +- `dlltool' may also be used to query an existing import library to +-determine the name of the DLL to which it is associated. See the +-description of the `-I' or `--identify' option. +- +- The command line options have the following meanings: +- +-`-d FILENAME' +-`--input-def FILENAME' +- Specifies the name of a `.def' file to be read in and processed. +- +-`-b FILENAME' +-`--base-file FILENAME' +- Specifies the name of a base file to be read in and processed. The +- contents of this file will be added to the relocation section in +- the exports file generated by dlltool. +- +-`-e FILENAME' +-`--output-exp FILENAME' +- Specifies the name of the export file to be created by dlltool. +- +-`-z FILENAME' +-`--output-def FILENAME' +- Specifies the name of the `.def' file to be created by dlltool. +- +-`-l FILENAME' +-`--output-lib FILENAME' +- Specifies the name of the library file to be created by dlltool. +- +-`-y FILENAME' +-`--output-delaylib FILENAME' +- Specifies the name of the delay-import library file to be created +- by dlltool. +- +-`--export-all-symbols' +- Treat all global and weak defined symbols found in the input object +- files as symbols to be exported. There is a small list of symbols +- which are not exported by default; see the `--no-default-excludes' +- option. You may add to the list of symbols to not export by using +- the `--exclude-symbols' option. +- +-`--no-export-all-symbols' +- Only export symbols explicitly listed in an input `.def' file or in +- `.drectve' sections in the input object files. This is the default +- behaviour. The `.drectve' sections are created by `dllexport' +- attributes in the source code. +- +-`--exclude-symbols LIST' +- Do not export the symbols in LIST. This is a list of symbol names +- separated by comma or colon characters. The symbol names should +- not contain a leading underscore. This is only meaningful when +- `--export-all-symbols' is used. +- +-`--no-default-excludes' +- When `--export-all-symbols' is used, it will by default avoid +- exporting certain special symbols. The current list of symbols to +- avoid exporting is `DllMain@12', `DllEntryPoint@0', `impure_ptr'. +- You may use the `--no-default-excludes' option to go ahead and +- export these special symbols. This is only meaningful when +- `--export-all-symbols' is used. +- +-`-S PATH' +-`--as PATH' +- Specifies the path, including the filename, of the assembler to be +- used to create the exports file. +- +-`-f OPTIONS' +-`--as-flags OPTIONS' +- Specifies any specific command line options to be passed to the +- assembler when building the exports file. This option will work +- even if the `-S' option is not used. This option only takes one +- argument, and if it occurs more than once on the command line, +- then later occurrences will override earlier occurrences. So if +- it is necessary to pass multiple options to the assembler they +- should be enclosed in double quotes. +- +-`-D NAME' +-`--dll-name NAME' +- Specifies the name to be stored in the `.def' file as the name of +- the DLL when the `-e' option is used. If this option is not +- present, then the filename given to the `-e' option will be used +- as the name of the DLL. +- +-`-m MACHINE' +-`-machine MACHINE' +- Specifies the type of machine for which the library file should be +- built. `dlltool' has a built in default type, depending upon how +- it was created, but this option can be used to override that. +- This is normally only useful when creating DLLs for an ARM +- processor, when the contents of the DLL are actually encode using +- Thumb instructions. +- +-`-a' +-`--add-indirect' +- Specifies that when `dlltool' is creating the exports file it +- should add a section which allows the exported functions to be +- referenced without using the import library. Whatever the hell +- that means! +- +-`-U' +-`--add-underscore' +- Specifies that when `dlltool' is creating the exports file it +- should prepend an underscore to the names of _all_ exported +- symbols. +- +-`--no-leading-underscore' +- +-`--leading-underscore' +- Specifies whether standard symbol should be forced to be prefixed, +- or not. +- +-`--add-stdcall-underscore' +- Specifies that when `dlltool' is creating the exports file it +- should prepend an underscore to the names of exported _stdcall_ +- functions. Variable names and non-stdcall function names are not +- modified. This option is useful when creating GNU-compatible +- import libs for third party DLLs that were built with MS-Windows +- tools. +- +-`-k' +-`--kill-at' +- Specifies that when `dlltool' is creating the exports file it +- should not append the string `@ '. These numbers are +- called ordinal numbers and they represent another way of accessing +- the function in a DLL, other than by name. +- +-`-A' +-`--add-stdcall-alias' +- Specifies that when `dlltool' is creating the exports file it +- should add aliases for stdcall symbols without `@ ' in +- addition to the symbols with `@ '. +- +-`-p' +-`--ext-prefix-alias PREFIX' +- Causes `dlltool' to create external aliases for all DLL imports +- with the specified prefix. The aliases are created for both +- external and import symbols with no leading underscore. +- +-`-x' +-`--no-idata4' +- Specifies that when `dlltool' is creating the exports and library +- files it should omit the `.idata4' section. This is for +- compatibility with certain operating systems. +- +-`--use-nul-prefixed-import-tables' +- Specifies that when `dlltool' is creating the exports and library +- files it should prefix the `.idata4' and `.idata5' by zero an +- element. This emulates old gnu import library generation of +- `dlltool'. By default this option is turned off. +- +-`-c' +-`--no-idata5' +- Specifies that when `dlltool' is creating the exports and library +- files it should omit the `.idata5' section. This is for +- compatibility with certain operating systems. +- +-`-I FILENAME' +-`--identify FILENAME' +- Specifies that `dlltool' should inspect the import library +- indicated by FILENAME and report, on `stdout', the name(s) of the +- associated DLL(s). This can be performed in addition to any other +- operations indicated by the other options and arguments. +- `dlltool' fails if the import library does not exist or is not +- actually an import library. See also `--identify-strict'. +- +-`--identify-strict' +- Modifies the behavior of the `--identify' option, such that an +- error is reported if FILENAME is associated with more than one DLL. +- +-`-i' +-`--interwork' +- Specifies that `dlltool' should mark the objects in the library +- file and exports file that it produces as supporting interworking +- between ARM and Thumb code. +- +-`-n' +-`--nodelete' +- Makes `dlltool' preserve the temporary assembler files it used to +- create the exports file. If this option is repeated then dlltool +- will also preserve the temporary object files it uses to create +- the library file. +- +-`-t PREFIX' +-`--temp-prefix PREFIX' +- Makes `dlltool' use PREFIX when constructing the names of +- temporary assembler and object files. By default, the temp file +- prefix is generated from the pid. +- +-`-v' +-`--verbose' +- Make dlltool describe what it is doing. +- +-`-h' +-`--help' +- Displays a list of command line options and then exits. +- +-`-V' +-`--version' +- Displays dlltool's version number and then exits. +- +- +-* Menu: +- +-* def file format:: The format of the dlltool `.def' file +- +- +-File: binutils.info, Node: def file format, Up: dlltool +- +-14.1 The format of the `dlltool' `.def' file +-============================================ +- +-A `.def' file contains any number of the following commands: +- +-`NAME' NAME `[ ,' BASE `]' +- The result is going to be named NAME`.exe'. +- +-`LIBRARY' NAME `[ ,' BASE `]' +- The result is going to be named NAME`.dll'. Note: If you want to +- use LIBRARY as name then you need to quote. Otherwise this will +- fail due a necessary hack for libtool (see PR binutils/13710 for +- more details). +- +-`EXPORTS ( ( (' NAME1 `[ = ' NAME2 `] ) | ( ' NAME1 `=' MODULE-NAME `.' EXTERNAL-NAME `) ) [ == ' ITS_NAME `]' +- +-`[' INTEGER `] [ NONAME ] [ CONSTANT ] [ DATA ] [ PRIVATE ] ) *' +- Declares NAME1 as an exported symbol from the DLL, with optional +- ordinal number INTEGER, or declares NAME1 as an alias (forward) of +- the function EXTERNAL-NAME in the DLL. If ITS_NAME is specified, +- this name is used as string in export table. MODULE-NAME. Note: +- The `EXPORTS' has to be the last command in .def file, as keywords +- are treated - beside `LIBRARY' - as simple name-identifiers. If +- you want to use LIBRARY as name then you need to quote it. +- +-`IMPORTS ( (' INTERNAL-NAME `=' MODULE-NAME `.' INTEGER `) | [' INTERNAL-NAME `= ]' MODULE-NAME `.' EXTERNAL-NAME `) [ == ) ITS_NAME `]' *' +- Declares that EXTERNAL-NAME or the exported function whose ordinal +- number is INTEGER is to be imported from the file MODULE-NAME. If +- INTERNAL-NAME is specified then this is the name that the imported +- function will be referred to in the body of the DLL. If ITS_NAME +- is specified, this name is used as string in import table. Note: +- The `IMPORTS' has to be the last command in .def file, as keywords +- are treated - beside `LIBRARY' - as simple name-identifiers. If +- you want to use LIBRARY as name then you need to quote it. +- +-`DESCRIPTION' STRING +- Puts STRING into the output `.exp' file in the `.rdata' section. +- +-`STACKSIZE' NUMBER-RESERVE `[, ' NUMBER-COMMIT `]' +- +-`HEAPSIZE' NUMBER-RESERVE `[, ' NUMBER-COMMIT `]' +- Generates `--stack' or `--heap' NUMBER-RESERVE,NUMBER-COMMIT in +- the output `.drectve' section. The linker will see this and act +- upon it. +- +-`CODE' ATTR `+' +- +-`DATA' ATTR `+' +- +-`SECTIONS (' SECTION-NAME ATTR` + ) *' +- Generates `--attr' SECTION-NAME ATTR in the output `.drectve' +- section, where ATTR is one of `READ', `WRITE', `EXECUTE' or +- `SHARED'. The linker will see this and act upon it. +- +- +- +-File: binutils.info, Node: readelf, Next: elfedit, Prev: dlltool, Up: Top +- +-15 readelf +-********** +- +- readelf [`-a'|`--all'] +- [`-h'|`--file-header'] +- [`-l'|`--program-headers'|`--segments'] +- [`-S'|`--section-headers'|`--sections'] +- [`-g'|`--section-groups'] +- [`-t'|`--section-details'] +- [`-e'|`--headers'] +- [`-s'|`--syms'|`--symbols'] +- [`--dyn-syms'] +- [`-n'|`--notes'] +- [`-r'|`--relocs'] +- [`-u'|`--unwind'] +- [`-d'|`--dynamic'] +- [`-V'|`--version-info'] +- [`-A'|`--arch-specific'] +- [`-D'|`--use-dynamic'] +- [`-x' |`--hex-dump='] +- [`-p' |`--string-dump='] +- [`-R' |`--relocated-dump='] +- [`-c'|`--archive-index'] +- [`-w[lLiaprmfFsoRt]'| +- `--debug-dump'[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]] +- [`--dwarf-depth=N'] +- [`--dwarf-start=N'] +- [`-I'|`--histogram'] +- [`-v'|`--version'] +- [`-W'|`--wide'] +- [`-H'|`--help'] +- ELFFILE... +- +- `readelf' displays information about one or more ELF format object +-files. The options control what particular information to display. +- +- ELFFILE... are the object files to be examined. 32-bit and 64-bit +-ELF files are supported, as are archives containing ELF files. +- +- This program performs a similar function to `objdump' but it goes +-into more detail and it exists independently of the BFD library, so if +-there is a bug in BFD then readelf will not be affected. +- +- The long and short forms of options, shown here as alternatives, are +-equivalent. At least one option besides `-v' or `-H' must be given. +- +-`-a' +-`--all' +- Equivalent to specifying `--file-header', `--program-headers', +- `--sections', `--symbols', `--relocs', `--dynamic', `--notes' and +- `--version-info'. +- +-`-h' +-`--file-header' +- Displays the information contained in the ELF header at the start +- of the file. +- +-`-l' +-`--program-headers' +-`--segments' +- Displays the information contained in the file's segment headers, +- if it has any. +- +-`-S' +-`--sections' +-`--section-headers' +- Displays the information contained in the file's section headers, +- if it has any. +- +-`-g' +-`--section-groups' +- Displays the information contained in the file's section groups, +- if it has any. +- +-`-t' +-`--section-details' +- Displays the detailed section information. Implies `-S'. +- +-`-s' +-`--symbols' +-`--syms' +- Displays the entries in symbol table section of the file, if it +- has one. +- +-`--dyn-syms' +- Displays the entries in dynamic symbol table section of the file, +- if it has one. +- +-`-e' +-`--headers' +- Display all the headers in the file. Equivalent to `-h -l -S'. +- +-`-n' +-`--notes' +- Displays the contents of the NOTE segments and/or sections, if any. +- +-`-r' +-`--relocs' +- Displays the contents of the file's relocation section, if it has +- one. +- +-`-u' +-`--unwind' +- Displays the contents of the file's unwind section, if it has one. +- Only the unwind sections for IA64 ELF files, as well as ARM +- unwind tables (`.ARM.exidx' / `.ARM.extab') are currently +- supported. +- +-`-d' +-`--dynamic' +- Displays the contents of the file's dynamic section, if it has one. +- +-`-V' +-`--version-info' +- Displays the contents of the version sections in the file, it they +- exist. +- +-`-A' +-`--arch-specific' +- Displays architecture-specific information in the file, if there +- is any. +- +-`-D' +-`--use-dynamic' +- When displaying symbols, this option makes `readelf' use the +- symbol hash tables in the file's dynamic section, rather than the +- symbol table sections. +- +-`-x ' +-`--hex-dump=' +- Displays the contents of the indicated section as a hexadecimal +- bytes. A number identifies a particular section by index in the +- section table; any other string identifies all sections with that +- name in the object file. +- +-`-R ' +-`--relocated-dump=' +- Displays the contents of the indicated section as a hexadecimal +- bytes. A number identifies a particular section by index in the +- section table; any other string identifies all sections with that +- name in the object file. The contents of the section will be +- relocated before they are displayed. +- +-`-p ' +-`--string-dump=' +- Displays the contents of the indicated section as printable +- strings. A number identifies a particular section by index in the +- section table; any other string identifies all sections with that +- name in the object file. +- +-`-c' +-`--archive-index' +- Displays the file symbol index information contained in the header +- part of binary archives. Performs the same function as the `t' +- command to `ar', but without using the BFD library. *Note ar::. +- +-`-w[lLiaprmfFsoRt]' +-`--debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]' +- Displays the contents of the debug sections in the file, if any are +- present. If one of the optional letters or words follows the +- switch then only data found in those specific sections will be +- dumped. +- +- Note that there is no single letter option to display the content +- of trace sections or .gdb_index. +- +- Note: the `=decodedline' option will display the interpreted +- contents of a .debug_line section whereas the `=rawline' option +- dumps the contents in a raw format. +- +- Note: the `=frames-interp' option will display the interpreted +- contents of a .debug_frame section whereas the `=frames' option +- dumps the contents in a raw format. +- +- Note: the output from the `=info' option can also be affected by +- the options `--dwarf-depth' and `--dwarf-start'. +- +-`--dwarf-depth=N' +- Limit the dump of the `.debug_info' section to N children. This +- is only useful with `--debug-dump=info'. The default is to print +- all DIEs; the special value 0 for N will also have this effect. +- +- With a non-zero value for N, DIEs at or deeper than N levels will +- not be printed. The range for N is zero-based. +- +-`--dwarf-start=N' +- Print only DIEs beginning with the DIE numbered N. This is only +- useful with `--debug-dump=info'. +- +- If specified, this option will suppress printing of any header +- information and all DIEs before the DIE numbered N. Only siblings +- and children of the specified DIE will be printed. +- +- This can be used in conjunction with `--dwarf-depth'. +- +-`-I' +-`--histogram' +- Display a histogram of bucket list lengths when displaying the +- contents of the symbol tables. +- +-`-v' +-`--version' +- Display the version number of readelf. +- +-`-W' +-`--wide' +- Don't break output lines to fit into 80 columns. By default +- `readelf' breaks section header and segment listing lines for +- 64-bit ELF files, so that they fit into 80 columns. This option +- causes `readelf' to print each section header resp. each segment +- one a single line, which is far more readable on terminals wider +- than 80 columns. +- +-`-H' +-`--help' +- Display the command line options understood by `readelf'. +- +- +- +-File: binutils.info, Node: elfedit, Next: Common Options, Prev: readelf, Up: Top +- +-16 elfedit +-********** +- +- elfedit [`--input-mach='MACHINE] +- [`--input-type='TYPE] +- [`--input-osabi='OSABI] +- `--output-mach='MACHINE +- `--output-type='TYPE +- `--output-osabi='OSABI +- [`-v'|`--version'] +- [`-h'|`--help'] +- ELFFILE... +- +- `elfedit' updates the ELF header of ELF files which have the +-matching ELF machine and file types. The options control how and which +-fields in the ELF header should be updated. +- +- ELFFILE... are the ELF files to be updated. 32-bit and 64-bit ELF +-files are supported, as are archives containing ELF files. +- +- The long and short forms of options, shown here as alternatives, are +-equivalent. At least one of the `--output-mach', `--output-type' and +-`--output-osabi' options must be given. +- +-`--input-mach=MACHINE' +- Set the matching input ELF machine type to MACHINE. If +- `--input-mach' isn't specified, it will match any ELF machine +- types. +- +- The supported ELF machine types are, L1OM, K1OM and X86-64. +- +-`--output-mach=MACHINE' +- Change the ELF machine type in the ELF header to MACHINE. The +- supported ELF machine types are the same as `--input-mach'. +- +-`--input-type=TYPE' +- Set the matching input ELF file type to TYPE. If `--input-type' +- isn't specified, it will match any ELF file types. +- +- The supported ELF file types are, REL, EXEC and DYN. +- +-`--output-type=TYPE' +- Change the ELF file type in the ELF header to TYPE. The supported +- ELF types are the same as `--input-type'. +- +-`--input-osabi=OSABI' +- Set the matching input ELF file OSABI to OSABI. If +- `--input-osabi' isn't specified, it will match any ELF OSABIs. +- +- The supported ELF OSABIs are, NONE, HPUX, NETBSD, GNU, LINUX +- (alias for GNU), SOLARIS, AIX, IRIX, FREEBSD, TRU64, MODESTO, +- OPENBSD, OPENVMS, NSK, AROS and FENIXOS. +- +-`--output-osabi=OSABI' +- Change the ELF OSABI in the ELF header to OSABI. The supported +- ELF OSABI are the same as `--input-osabi'. +- +-`-v' +-`--version' +- Display the version number of `elfedit'. +- +-`-h' +-`--help' +- Display the command line options understood by `elfedit'. +- +- +- +-File: binutils.info, Node: Common Options, Next: Selecting the Target System, Prev: elfedit, Up: Top +- +-17 Common Options +-***************** +- +-The following command-line options are supported by all of the programs +-described in this manual. +- +-`@FILE' +- Read command-line options from FILE. The options read are +- inserted in place of the original @FILE option. If FILE does not +- exist, or cannot be read, then the option will be treated +- literally, and not removed. +- +- Options in FILE are separated by whitespace. A whitespace +- character may be included in an option by surrounding the entire +- option in either single or double quotes. Any character +- (including a backslash) may be included by prefixing the character +- to be included with a backslash. The FILE may itself contain +- additional @FILE options; any such options will be processed +- recursively. +- +-`--help' +- Display the command-line options supported by the program. +- +-`--version' +- Display the version number of the program. +- +- +- +-File: binutils.info, Node: Selecting the Target System, Next: Reporting Bugs, Prev: Common Options, Up: Top +- +-18 Selecting the Target System +-****************************** +- +-You can specify two aspects of the target system to the GNU binary file +-utilities, each in several ways: +- +- * the target +- +- * the architecture +- +- In the following summaries, the lists of ways to specify values are +-in order of decreasing precedence. The ways listed first override those +-listed later. +- +- The commands to list valid values only list the values for which the +-programs you are running were configured. If they were configured with +-`--enable-targets=all', the commands list most of the available values, +-but a few are left out; not all targets can be configured in at once +-because some of them can only be configured "native" (on hosts with the +-same type as the target system). +- +-* Menu: +- +-* Target Selection:: +-* Architecture Selection:: +- +- +-File: binutils.info, Node: Target Selection, Next: Architecture Selection, Up: Selecting the Target System +- +-18.1 Target Selection +-===================== +- +-A "target" is an object file format. A given target may be supported +-for multiple architectures (*note Architecture Selection::). A target +-selection may also have variations for different operating systems or +-architectures. +- +- The command to list valid target values is `objdump -i' (the first +-column of output contains the relevant information). +- +- Some sample values are: `a.out-hp300bsd', `ecoff-littlemips', +-`a.out-sunos-big'. +- +- You can also specify a target using a configuration triplet. This is +-the same sort of name that is passed to `configure' to specify a +-target. When you use a configuration triplet as an argument, it must be +-fully canonicalized. You can see the canonical version of a triplet by +-running the shell script `config.sub' which is included with the +-sources. +- +- Some sample configuration triplets are: `m68k-hp-bsd', +-`mips-dec-ultrix', `sparc-sun-sunos'. +- +-`objdump' Target +----------------- +- +-Ways to specify: +- +- 1. command line option: `-b' or `--target' +- +- 2. environment variable `GNUTARGET' +- +- 3. deduced from the input file +- +-`objcopy' and `strip' Input Target +----------------------------------- +- +-Ways to specify: +- +- 1. command line options: `-I' or `--input-target', or `-F' or +- `--target' +- +- 2. environment variable `GNUTARGET' +- +- 3. deduced from the input file +- +-`objcopy' and `strip' Output Target +------------------------------------ +- +-Ways to specify: +- +- 1. command line options: `-O' or `--output-target', or `-F' or +- `--target' +- +- 2. the input target (see "`objcopy' and `strip' Input Target" above) +- +- 3. environment variable `GNUTARGET' +- +- 4. deduced from the input file +- +-`nm', `size', and `strings' Target +----------------------------------- +- +-Ways to specify: +- +- 1. command line option: `--target' +- +- 2. environment variable `GNUTARGET' +- +- 3. deduced from the input file +- +- +-File: binutils.info, Node: Architecture Selection, Prev: Target Selection, Up: Selecting the Target System +- +-18.2 Architecture Selection +-=========================== +- +-An "architecture" is a type of CPU on which an object file is to run. +-Its name may contain a colon, separating the name of the processor +-family from the name of the particular CPU. +- +- The command to list valid architecture values is `objdump -i' (the +-second column contains the relevant information). +- +- Sample values: `m68k:68020', `mips:3000', `sparc'. +- +-`objdump' Architecture +----------------------- +- +-Ways to specify: +- +- 1. command line option: `-m' or `--architecture' +- +- 2. deduced from the input file +- +-`objcopy', `nm', `size', `strings' Architecture +------------------------------------------------ +- +-Ways to specify: +- +- 1. deduced from the input file +- +- +-File: binutils.info, Node: Reporting Bugs, Next: GNU Free Documentation License, Prev: Selecting the Target System, Up: Top +- +-19 Reporting Bugs +-***************** +- +-Your bug reports play an essential role in making the binary utilities +-reliable. +- +- Reporting a bug may help you by bringing a solution to your problem, +-or it may not. But in any case the principal function of a bug report +-is to help the entire community by making the next version of the binary +-utilities work better. Bug reports are your contribution to their +-maintenance. +- +- In order for a bug report to serve its purpose, you must include the +-information that enables us to fix the bug. +- +-* Menu: +- +-* Bug Criteria:: Have you found a bug? +-* Bug Reporting:: How to report bugs +- +- +-File: binutils.info, Node: Bug Criteria, Next: Bug Reporting, Up: Reporting Bugs +- +-19.1 Have You Found a Bug? +-========================== +- +-If you are not sure whether you have found a bug, here are some +-guidelines: +- +- * If a binary utility gets a fatal signal, for any input whatever, +- that is a bug. Reliable utilities never crash. +- +- * If a binary utility produces an error message for valid input, +- that is a bug. +- +- * If you are an experienced user of binary utilities, your +- suggestions for improvement are welcome in any case. +- +- +-File: binutils.info, Node: Bug Reporting, Prev: Bug Criteria, Up: Reporting Bugs +- +-19.2 How to Report Bugs +-======================= +- +-A number of companies and individuals offer support for GNU products. +-If you obtained the binary utilities from a support organization, we +-recommend you contact that organization first. +- +- You can find contact information for many support companies and +-individuals in the file `etc/SERVICE' in the GNU Emacs distribution. +- +- In any event, we also recommend that you send bug reports for the +-binary utilities to `http://www.sourceware.org/bugzilla/'. +- +- The fundamental principle of reporting bugs usefully is this: +-*report all the facts*. If you are not sure whether to state a fact or +-leave it out, state it! +- +- Often people omit facts because they think they know what causes the +-problem and assume that some details do not matter. Thus, you might +-assume that the name of a file you use in an example does not matter. +-Well, probably it does not, but one cannot be sure. Perhaps the bug is +-a stray memory reference which happens to fetch from the location where +-that pathname is stored in memory; perhaps, if the pathname were +-different, the contents of that location would fool the utility into +-doing the right thing despite the bug. Play it safe and give a +-specific, complete example. That is the easiest thing for you to do, +-and the most helpful. +- +- Keep in mind that the purpose of a bug report is to enable us to fix +-the bug if it is new to us. Therefore, always write your bug reports +-on the assumption that the bug has not been reported previously. +- +- Sometimes people give a few sketchy facts and ask, "Does this ring a +-bell?" This cannot help us fix a bug, so it is basically useless. We +-respond by asking for enough details to enable us to investigate. You +-might as well expedite matters by sending them to begin with. +- +- To enable us to fix the bug, you should include all these things: +- +- * The version of the utility. Each utility announces it if you +- start it with the `--version' argument. +- +- Without this, we will not know whether there is any point in +- looking for the bug in the current version of the binary utilities. +- +- * Any patches you may have applied to the source, including any +- patches made to the `BFD' library. +- +- * The type of machine you are using, and the operating system name +- and version number. +- +- * What compiler (and its version) was used to compile the +- utilities--e.g. "`gcc-2.7'". +- +- * The command arguments you gave the utility to observe the bug. To +- guarantee you will not omit something important, list them all. A +- copy of the Makefile (or the output from make) is sufficient. +- +- If we were to try to guess the arguments, we would probably guess +- wrong and then we might not encounter the bug. +- +- * A complete input file, or set of input files, that will reproduce +- the bug. If the utility is reading an object file or files, then +- it is generally most helpful to send the actual object files. +- +- If the source files were produced exclusively using GNU programs +- (e.g., `gcc', `gas', and/or the GNU `ld'), then it may be OK to +- send the source files rather than the object files. In this case, +- be sure to say exactly what version of `gcc', or whatever, was +- used to produce the object files. Also say how `gcc', or +- whatever, was configured. +- +- * A description of what behavior you observe that you believe is +- incorrect. For example, "It gets a fatal signal." +- +- Of course, if the bug is that the utility gets a fatal signal, +- then we will certainly notice it. But if the bug is incorrect +- output, we might not notice unless it is glaringly wrong. You +- might as well not give us a chance to make a mistake. +- +- Even if the problem you experience is a fatal signal, you should +- still say so explicitly. Suppose something strange is going on, +- such as your copy of the utility is out of sync, or you have +- encountered a bug in the C library on your system. (This has +- happened!) Your copy might crash and ours would not. If you told +- us to expect a crash, then when ours fails to crash, we would know +- that the bug was not happening for us. If you had not told us to +- expect a crash, then we would not be able to draw any conclusion +- from our observations. +- +- * If you wish to suggest changes to the source, send us context +- diffs, as generated by `diff' with the `-u', `-c', or `-p' option. +- Always send diffs from the old file to the new file. If you wish +- to discuss something in the `ld' source, refer to it by context, +- not by line number. +- +- The line numbers in our development sources will not match those +- in your sources. Your line numbers would convey no useful +- information to us. +- +- Here are some things that are not necessary: +- +- * A description of the envelope of the bug. +- +- Often people who encounter a bug spend a lot of time investigating +- which changes to the input file will make the bug go away and which +- changes will not affect it. +- +- This is often time consuming and not very useful, because the way +- we will find the bug is by running a single example under the +- debugger with breakpoints, not by pure deduction from a series of +- examples. We recommend that you save your time for something else. +- +- Of course, if you can find a simpler example to report _instead_ +- of the original one, that is a convenience for us. Errors in the +- output will be easier to spot, running under the debugger will take +- less time, and so on. +- +- However, simplification is not vital; if you do not want to do +- this, report the bug anyway and send us the entire test case you +- used. +- +- * A patch for the bug. +- +- A patch for the bug does help us if it is a good one. But do not +- omit the necessary information, such as the test case, on the +- assumption that a patch is all we need. We might see problems +- with your patch and decide to fix the problem another way, or we +- might not understand it at all. +- +- Sometimes with programs as complicated as the binary utilities it +- is very hard to construct an example that will make the program +- follow a certain path through the code. If you do not send us the +- example, we will not be able to construct one, so we will not be +- able to verify that the bug is fixed. +- +- And if we cannot understand what bug you are trying to fix, or why +- your patch should be an improvement, we will not install it. A +- test case will help us to understand. +- +- * A guess about what the bug is or what it depends on. +- +- Such guesses are usually wrong. Even we cannot guess right about +- such things without first using the debugger to find the facts. +- +- +-File: binutils.info, Node: GNU Free Documentation License, Next: Binutils Index, Prev: Reporting Bugs, Up: Top +- +-Appendix A GNU Free Documentation License +-***************************************** +- +- Version 1.3, 3 November 2008 +- +- Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. +- `http://fsf.org/' +- +- Everyone is permitted to copy and distribute verbatim copies +- of this license document, but changing it is not allowed. +- +- 0. PREAMBLE +- +- The purpose of this License is to make a manual, textbook, or other +- functional and useful document "free" in the sense of freedom: to +- assure everyone the effective freedom to copy and redistribute it, +- with or without modifying it, either commercially or +- noncommercially. Secondarily, this License preserves for the +- author and publisher a way to get credit for their work, while not +- being considered responsible for modifications made by others. +- +- This License is a kind of "copyleft", which means that derivative +- works of the document must themselves be free in the same sense. +- It complements the GNU General Public License, which is a copyleft +- license designed for free software. +- +- We have designed this License in order to use it for manuals for +- free software, because free software needs free documentation: a +- free program should come with manuals providing the same freedoms +- that the software does. But this License is not limited to +- software manuals; it can be used for any textual work, regardless +- of subject matter or whether it is published as a printed book. +- We recommend this License principally for works whose purpose is +- instruction or reference. +- +- 1. APPLICABILITY AND DEFINITIONS +- +- This License applies to any manual or other work, in any medium, +- that contains a notice placed by the copyright holder saying it +- can be distributed under the terms of this License. Such a notice +- grants a world-wide, royalty-free license, unlimited in duration, +- to use that work under the conditions stated herein. The +- "Document", below, refers to any such manual or work. Any member +- of the public is a licensee, and is addressed as "you". You +- accept the license if you copy, modify or distribute the work in a +- way requiring permission under copyright law. +- +- A "Modified Version" of the Document means any work containing the +- Document or a portion of it, either copied verbatim, or with +- modifications and/or translated into another language. +- +- A "Secondary Section" is a named appendix or a front-matter section +- of the Document that deals exclusively with the relationship of the +- publishers or authors of the Document to the Document's overall +- subject (or to related matters) and contains nothing that could +- fall directly within that overall subject. (Thus, if the Document +- is in part a textbook of mathematics, a Secondary Section may not +- explain any mathematics.) The relationship could be a matter of +- historical connection with the subject or with related matters, or +- of legal, commercial, philosophical, ethical or political position +- regarding them. +- +- The "Invariant Sections" are certain Secondary Sections whose +- titles are designated, as being those of Invariant Sections, in +- the notice that says that the Document is released under this +- License. If a section does not fit the above definition of +- Secondary then it is not allowed to be designated as Invariant. +- The Document may contain zero Invariant Sections. If the Document +- does not identify any Invariant Sections then there are none. +- +- The "Cover Texts" are certain short passages of text that are +- listed, as Front-Cover Texts or Back-Cover Texts, in the notice +- that says that the Document is released under this License. A +- Front-Cover Text may be at most 5 words, and a Back-Cover Text may +- be at most 25 words. +- +- A "Transparent" copy of the Document means a machine-readable copy, +- represented in a format whose specification is available to the +- general public, that is suitable for revising the document +- straightforwardly with generic text editors or (for images +- composed of pixels) generic paint programs or (for drawings) some +- widely available drawing editor, and that is suitable for input to +- text formatters or for automatic translation to a variety of +- formats suitable for input to text formatters. A copy made in an +- otherwise Transparent file format whose markup, or absence of +- markup, has been arranged to thwart or discourage subsequent +- modification by readers is not Transparent. An image format is +- not Transparent if used for any substantial amount of text. A +- copy that is not "Transparent" is called "Opaque". +- +- Examples of suitable formats for Transparent copies include plain +- ASCII without markup, Texinfo input format, LaTeX input format, +- SGML or XML using a publicly available DTD, and +- standard-conforming simple HTML, PostScript or PDF designed for +- human modification. Examples of transparent image formats include +- PNG, XCF and JPG. Opaque formats include proprietary formats that +- can be read and edited only by proprietary word processors, SGML or +- XML for which the DTD and/or processing tools are not generally +- available, and the machine-generated HTML, PostScript or PDF +- produced by some word processors for output purposes only. +- +- The "Title Page" means, for a printed book, the title page itself, +- plus such following pages as are needed to hold, legibly, the +- material this License requires to appear in the title page. For +- works in formats which do not have any title page as such, "Title +- Page" means the text near the most prominent appearance of the +- work's title, preceding the beginning of the body of the text. +- +- The "publisher" means any person or entity that distributes copies +- of the Document to the public. +- +- A section "Entitled XYZ" means a named subunit of the Document +- whose title either is precisely XYZ or contains XYZ in parentheses +- following text that translates XYZ in another language. (Here XYZ +- stands for a specific section name mentioned below, such as +- "Acknowledgements", "Dedications", "Endorsements", or "History".) +- To "Preserve the Title" of such a section when you modify the +- Document means that it remains a section "Entitled XYZ" according +- to this definition. +- +- The Document may include Warranty Disclaimers next to the notice +- which states that this License applies to the Document. These +- Warranty Disclaimers are considered to be included by reference in +- this License, but only as regards disclaiming warranties: any other +- implication that these Warranty Disclaimers may have is void and +- has no effect on the meaning of this License. +- +- 2. VERBATIM COPYING +- +- You may copy and distribute the Document in any medium, either +- commercially or noncommercially, provided that this License, the +- copyright notices, and the license notice saying this License +- applies to the Document are reproduced in all copies, and that you +- add no other conditions whatsoever to those of this License. You +- may not use technical measures to obstruct or control the reading +- or further copying of the copies you make or distribute. However, +- you may accept compensation in exchange for copies. If you +- distribute a large enough number of copies you must also follow +- the conditions in section 3. +- +- You may also lend copies, under the same conditions stated above, +- and you may publicly display copies. +- +- 3. COPYING IN QUANTITY +- +- If you publish printed copies (or copies in media that commonly +- have printed covers) of the Document, numbering more than 100, and +- the Document's license notice requires Cover Texts, you must +- enclose the copies in covers that carry, clearly and legibly, all +- these Cover Texts: Front-Cover Texts on the front cover, and +- Back-Cover Texts on the back cover. Both covers must also clearly +- and legibly identify you as the publisher of these copies. The +- front cover must present the full title with all words of the +- title equally prominent and visible. You may add other material +- on the covers in addition. Copying with changes limited to the +- covers, as long as they preserve the title of the Document and +- satisfy these conditions, can be treated as verbatim copying in +- other respects. +- +- If the required texts for either cover are too voluminous to fit +- legibly, you should put the first ones listed (as many as fit +- reasonably) on the actual cover, and continue the rest onto +- adjacent pages. +- +- If you publish or distribute Opaque copies of the Document +- numbering more than 100, you must either include a +- machine-readable Transparent copy along with each Opaque copy, or +- state in or with each Opaque copy a computer-network location from +- which the general network-using public has access to download +- using public-standard network protocols a complete Transparent +- copy of the Document, free of added material. If you use the +- latter option, you must take reasonably prudent steps, when you +- begin distribution of Opaque copies in quantity, to ensure that +- this Transparent copy will remain thus accessible at the stated +- location until at least one year after the last time you +- distribute an Opaque copy (directly or through your agents or +- retailers) of that edition to the public. +- +- It is requested, but not required, that you contact the authors of +- the Document well before redistributing any large number of +- copies, to give them a chance to provide you with an updated +- version of the Document. +- +- 4. MODIFICATIONS +- +- You may copy and distribute a Modified Version of the Document +- under the conditions of sections 2 and 3 above, provided that you +- release the Modified Version under precisely this License, with +- the Modified Version filling the role of the Document, thus +- licensing distribution and modification of the Modified Version to +- whoever possesses a copy of it. In addition, you must do these +- things in the Modified Version: +- +- A. Use in the Title Page (and on the covers, if any) a title +- distinct from that of the Document, and from those of +- previous versions (which should, if there were any, be listed +- in the History section of the Document). You may use the +- same title as a previous version if the original publisher of +- that version gives permission. +- +- B. List on the Title Page, as authors, one or more persons or +- entities responsible for authorship of the modifications in +- the Modified Version, together with at least five of the +- principal authors of the Document (all of its principal +- authors, if it has fewer than five), unless they release you +- from this requirement. +- +- C. State on the Title page the name of the publisher of the +- Modified Version, as the publisher. +- +- D. Preserve all the copyright notices of the Document. +- +- E. Add an appropriate copyright notice for your modifications +- adjacent to the other copyright notices. +- +- F. Include, immediately after the copyright notices, a license +- notice giving the public permission to use the Modified +- Version under the terms of this License, in the form shown in +- the Addendum below. +- +- G. Preserve in that license notice the full lists of Invariant +- Sections and required Cover Texts given in the Document's +- license notice. +- +- H. Include an unaltered copy of this License. +- +- I. Preserve the section Entitled "History", Preserve its Title, +- and add to it an item stating at least the title, year, new +- authors, and publisher of the Modified Version as given on +- the Title Page. If there is no section Entitled "History" in +- the Document, create one stating the title, year, authors, +- and publisher of the Document as given on its Title Page, +- then add an item describing the Modified Version as stated in +- the previous sentence. +- +- J. Preserve the network location, if any, given in the Document +- for public access to a Transparent copy of the Document, and +- likewise the network locations given in the Document for +- previous versions it was based on. These may be placed in +- the "History" section. You may omit a network location for a +- work that was published at least four years before the +- Document itself, or if the original publisher of the version +- it refers to gives permission. +- +- K. For any section Entitled "Acknowledgements" or "Dedications", +- Preserve the Title of the section, and preserve in the +- section all the substance and tone of each of the contributor +- acknowledgements and/or dedications given therein. +- +- L. Preserve all the Invariant Sections of the Document, +- unaltered in their text and in their titles. Section numbers +- or the equivalent are not considered part of the section +- titles. +- +- M. Delete any section Entitled "Endorsements". Such a section +- may not be included in the Modified Version. +- +- N. Do not retitle any existing section to be Entitled +- "Endorsements" or to conflict in title with any Invariant +- Section. +- +- O. Preserve any Warranty Disclaimers. +- +- If the Modified Version includes new front-matter sections or +- appendices that qualify as Secondary Sections and contain no +- material copied from the Document, you may at your option +- designate some or all of these sections as invariant. To do this, +- add their titles to the list of Invariant Sections in the Modified +- Version's license notice. These titles must be distinct from any +- other section titles. +- +- You may add a section Entitled "Endorsements", provided it contains +- nothing but endorsements of your Modified Version by various +- parties--for example, statements of peer review or that the text +- has been approved by an organization as the authoritative +- definition of a standard. +- +- You may add a passage of up to five words as a Front-Cover Text, +- and a passage of up to 25 words as a Back-Cover Text, to the end +- of the list of Cover Texts in the Modified Version. Only one +- passage of Front-Cover Text and one of Back-Cover Text may be +- added by (or through arrangements made by) any one entity. If the +- Document already includes a cover text for the same cover, +- previously added by you or by arrangement made by the same entity +- you are acting on behalf of, you may not add another; but you may +- replace the old one, on explicit permission from the previous +- publisher that added the old one. +- +- The author(s) and publisher(s) of the Document do not by this +- License give permission to use their names for publicity for or to +- assert or imply endorsement of any Modified Version. +- +- 5. COMBINING DOCUMENTS +- +- You may combine the Document with other documents released under +- this License, under the terms defined in section 4 above for +- modified versions, provided that you include in the combination +- all of the Invariant Sections of all of the original documents, +- unmodified, and list them all as Invariant Sections of your +- combined work in its license notice, and that you preserve all +- their Warranty Disclaimers. +- +- The combined work need only contain one copy of this License, and +- multiple identical Invariant Sections may be replaced with a single +- copy. If there are multiple Invariant Sections with the same name +- but different contents, make the title of each such section unique +- by adding at the end of it, in parentheses, the name of the +- original author or publisher of that section if known, or else a +- unique number. Make the same adjustment to the section titles in +- the list of Invariant Sections in the license notice of the +- combined work. +- +- In the combination, you must combine any sections Entitled +- "History" in the various original documents, forming one section +- Entitled "History"; likewise combine any sections Entitled +- "Acknowledgements", and any sections Entitled "Dedications". You +- must delete all sections Entitled "Endorsements." +- +- 6. COLLECTIONS OF DOCUMENTS +- +- You may make a collection consisting of the Document and other +- documents released under this License, and replace the individual +- copies of this License in the various documents with a single copy +- that is included in the collection, provided that you follow the +- rules of this License for verbatim copying of each of the +- documents in all other respects. +- +- You may extract a single document from such a collection, and +- distribute it individually under this License, provided you insert +- a copy of this License into the extracted document, and follow +- this License in all other respects regarding verbatim copying of +- that document. +- +- 7. AGGREGATION WITH INDEPENDENT WORKS +- +- A compilation of the Document or its derivatives with other +- separate and independent documents or works, in or on a volume of +- a storage or distribution medium, is called an "aggregate" if the +- copyright resulting from the compilation is not used to limit the +- legal rights of the compilation's users beyond what the individual +- works permit. When the Document is included in an aggregate, this +- License does not apply to the other works in the aggregate which +- are not themselves derivative works of the Document. +- +- If the Cover Text requirement of section 3 is applicable to these +- copies of the Document, then if the Document is less than one half +- of the entire aggregate, the Document's Cover Texts may be placed +- on covers that bracket the Document within the aggregate, or the +- electronic equivalent of covers if the Document is in electronic +- form. Otherwise they must appear on printed covers that bracket +- the whole aggregate. +- +- 8. TRANSLATION +- +- Translation is considered a kind of modification, so you may +- distribute translations of the Document under the terms of section +- 4. Replacing Invariant Sections with translations requires special +- permission from their copyright holders, but you may include +- translations of some or all Invariant Sections in addition to the +- original versions of these Invariant Sections. You may include a +- translation of this License, and all the license notices in the +- Document, and any Warranty Disclaimers, provided that you also +- include the original English version of this License and the +- original versions of those notices and disclaimers. In case of a +- disagreement between the translation and the original version of +- this License or a notice or disclaimer, the original version will +- prevail. +- +- If a section in the Document is Entitled "Acknowledgements", +- "Dedications", or "History", the requirement (section 4) to +- Preserve its Title (section 1) will typically require changing the +- actual title. +- +- 9. TERMINATION +- +- You may not copy, modify, sublicense, or distribute the Document +- except as expressly provided under this License. Any attempt +- otherwise to copy, modify, sublicense, or distribute it is void, +- and will automatically terminate your rights under this License. +- +- However, if you cease all violation of this License, then your +- license from a particular copyright holder is reinstated (a) +- provisionally, unless and until the copyright holder explicitly +- and finally terminates your license, and (b) permanently, if the +- copyright holder fails to notify you of the violation by some +- reasonable means prior to 60 days after the cessation. +- +- Moreover, your license from a particular copyright holder is +- reinstated permanently if the copyright holder notifies you of the +- violation by some reasonable means, this is the first time you have +- received notice of violation of this License (for any work) from +- that copyright holder, and you cure the violation prior to 30 days +- after your receipt of the notice. +- +- Termination of your rights under this section does not terminate +- the licenses of parties who have received copies or rights from +- you under this License. If your rights have been terminated and +- not permanently reinstated, receipt of a copy of some or all of +- the same material does not give you any rights to use it. +- +- 10. FUTURE REVISIONS OF THIS LICENSE +- +- The Free Software Foundation may publish new, revised versions of +- the GNU Free Documentation 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. See +- `http://www.gnu.org/copyleft/'. +- +- Each version of the License is given a distinguishing version +- number. If the Document specifies that a particular numbered +- version of this License "or any later version" applies to it, you +- have the option of following the terms and conditions either of +- that specified version or of any later version that has been +- published (not as a draft) by the Free Software Foundation. If +- the Document does not specify a version number of this License, +- you may choose any version ever published (not as a draft) by the +- Free Software Foundation. If the Document specifies that a proxy +- can decide which future versions of this License can be used, that +- proxy's public statement of acceptance of a version permanently +- authorizes you to choose that version for the Document. +- +- 11. RELICENSING +- +- "Massive Multiauthor Collaboration Site" (or "MMC Site") means any +- World Wide Web server that publishes copyrightable works and also +- provides prominent facilities for anybody to edit those works. A +- public wiki that anybody can edit is an example of such a server. +- A "Massive Multiauthor Collaboration" (or "MMC") contained in the +- site means any set of copyrightable works thus published on the MMC +- site. +- +- "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 +- license published by Creative Commons Corporation, a not-for-profit +- corporation with a principal place of business in San Francisco, +- California, as well as future copyleft versions of that license +- published by that same organization. +- +- "Incorporate" means to publish or republish a Document, in whole or +- in part, as part of another Document. +- +- An MMC is "eligible for relicensing" if it is licensed under this +- License, and if all works that were first published under this +- License somewhere other than this MMC, and subsequently +- incorporated in whole or in part into the MMC, (1) had no cover +- texts or invariant sections, and (2) were thus incorporated prior +- to November 1, 2008. +- +- The operator of an MMC Site may republish an MMC contained in the +- site under CC-BY-SA on the same site at any time before August 1, +- 2009, provided the MMC is eligible for relicensing. +- +- +-ADDENDUM: How to use this License for your documents +-==================================================== +- +-To use this License in a document you have written, include a copy of +-the License in the document and put the following copyright and license +-notices just after the title page: +- +- Copyright (C) YEAR YOUR NAME. +- Permission is granted to copy, distribute and/or modify this document +- under the terms of the GNU Free Documentation License, Version 1.3 +- or any later version published by the Free Software Foundation; +- with no Invariant Sections, no Front-Cover Texts, and no Back-Cover +- Texts. A copy of the license is included in the section entitled ``GNU +- Free Documentation License''. +- +- If you have Invariant Sections, Front-Cover Texts and Back-Cover +-Texts, replace the "with...Texts." line with this: +- +- with the Invariant Sections being LIST THEIR TITLES, with +- the Front-Cover Texts being LIST, and with the Back-Cover Texts +- being LIST. +- +- If you have Invariant Sections without Cover Texts, or some other +-combination of the three, merge those two alternatives to suit the +-situation. +- +- If your document contains nontrivial examples of program code, we +-recommend releasing these examples in parallel under your choice of +-free software license, such as the GNU General Public License, to +-permit their use in free software. +- +- +-File: binutils.info, Node: Binutils Index, Prev: GNU Free Documentation License, Up: Top +- +-Binutils Index +-************** +- +-[index] +-* Menu: +- +-* --enable-deterministic-archives <1>: objcopy. (line 302) +-* --enable-deterministic-archives <2>: ranlib. (line 44) +-* --enable-deterministic-archives <3>: ar cmdline. (line 151) +-* --enable-deterministic-archives <4>: strip. (line 115) +-* --enable-deterministic-archives <5>: ar cmdline. (line 224) +-* --enable-deterministic-archives: objcopy. (line 292) +-* .stab: objdump. (line 413) +-* Add prefix to absolute paths: objdump. (line 356) +-* addr2line: addr2line. (line 6) +-* address to file name and line number: addr2line. (line 6) +-* all header information, object file: objdump. (line 531) +-* ar: ar. (line 6) +-* ar compatibility: ar. (line 60) +-* architecture: objdump. (line 197) +-* architectures available: objdump. (line 182) +-* archive contents: ranlib. (line 6) +-* Archive file symbol index information: readelf. (line 155) +-* archive headers: objdump. (line 67) +-* archives: ar. (line 6) +-* base files: dlltool. (line 124) +-* bug criteria: Bug Criteria. (line 6) +-* bug reports: Bug Reporting. (line 6) +-* bugs: Reporting Bugs. (line 6) +-* bugs, reporting: Bug Reporting. (line 6) +-* c++filt: c++filt. (line 6) +-* changing object addresses: objcopy. (line 337) +-* changing section address: objcopy. (line 347) +-* changing section LMA: objcopy. (line 356) +-* changing section VMA: objcopy. (line 369) +-* changing start address: objcopy. (line 332) +-* collections of files: ar. (line 6) +-* compatibility, ar: ar. (line 60) +-* contents of archive: ar cmdline. (line 97) +-* crash: Bug Criteria. (line 9) +-* creating archives: ar cmdline. (line 145) +-* creating thin archive: ar cmdline. (line 210) +-* cxxfilt: c++filt. (line 14) +-* dates in archive: ar cmdline. (line 184) +-* debug symbols: objdump. (line 413) +-* debugging symbols: nm. (line 147) +-* deleting from archive: ar cmdline. (line 26) +-* demangling C++ symbols: c++filt. (line 6) +-* demangling in nm: nm. (line 155) +-* demangling in objdump <1>: objdump. (line 95) +-* demangling in objdump: addr2line. (line 78) +-* deterministic archives <1>: ranlib. (line 32) +-* deterministic archives <2>: objcopy. (line 292) +-* deterministic archives <3>: ar cmdline. (line 224) +-* deterministic archives <4>: strip. (line 105) +-* deterministic archives <5>: ar cmdline. (line 151) +-* deterministic archives <6>: ranlib. (line 44) +-* deterministic archives: objcopy. (line 302) +-* disassembling object code: objdump. (line 117) +-* disassembly architecture: objdump. (line 197) +-* disassembly endianness: objdump. (line 137) +-* disassembly, with source: objdump. (line 352) +-* discarding symbols: strip. (line 6) +-* DLL: dlltool. (line 6) +-* dlltool: dlltool. (line 6) +-* DWARF: objdump. (line 378) +-* dynamic relocation entries, in object file: objdump. (line 340) +-* dynamic symbol table entries, printing: objdump. (line 515) +-* dynamic symbols: nm. (line 167) +-* ELF dynamic section information: readelf. (line 113) +-* ELF dynamic symbol table information: readelf. (line 88) +-* ELF file header information: readelf. (line 57) +-* ELF file information: readelf. (line 6) +-* ELF notes: readelf. (line 97) +-* ELF object file format: objdump. (line 413) +-* ELF program header information: readelf. (line 63) +-* ELF reloc information: readelf. (line 101) +-* ELF section group information: readelf. (line 74) +-* ELF section information: readelf. (line 79) +-* ELF segment information: readelf. (line 63) +-* ELF symbol table information: readelf. (line 84) +-* ELF version sections information: readelf. (line 117) +-* elfedit: elfedit. (line 6) +-* endianness: objdump. (line 137) +-* error on valid input: Bug Criteria. (line 12) +-* external symbols: nm. (line 179) +-* extract from archive: ar cmdline. (line 112) +-* fatal signal: Bug Criteria. (line 9) +-* file name: nm. (line 141) +-* header information, all: objdump. (line 531) +-* input .def file: dlltool. (line 120) +-* input file name: nm. (line 141) +-* Instruction width: objdump. (line 373) +-* libraries: ar. (line 25) +-* listings strings: strings. (line 6) +-* load plugin: nm. (line 252) +-* machine instructions: objdump. (line 117) +-* moving in archive: ar cmdline. (line 34) +-* MRI compatibility, ar: ar scripts. (line 8) +-* name duplication in archive: ar cmdline. (line 106) +-* name length: ar. (line 18) +-* nm: nm. (line 6) +-* nm compatibility: nm. (line 173) +-* nm format: nm. (line 173) +-* not writing archive index: ar cmdline. (line 203) +-* objdump: objdump. (line 6) +-* object code format <1>: strings. (line 67) +-* object code format <2>: nm. (line 278) +-* object code format <3>: addr2line. (line 73) +-* object code format <4>: objdump. (line 81) +-* object code format: size. (line 84) +-* object file header: objdump. (line 143) +-* object file information: objdump. (line 6) +-* object file offsets: objdump. (line 148) +-* object file sections: objdump. (line 347) +-* object formats available: objdump. (line 182) +-* operations on archive: ar cmdline. (line 22) +-* printing from archive: ar cmdline. (line 46) +-* printing strings: strings. (line 6) +-* quick append to archive: ar cmdline. (line 54) +-* radix for section sizes: size. (line 66) +-* ranlib <1>: ranlib. (line 6) +-* ranlib: ar cmdline. (line 91) +-* readelf: readelf. (line 6) +-* relative placement in archive: ar cmdline. (line 133) +-* relocation entries, in object file: objdump. (line 334) +-* removing symbols: strip. (line 6) +-* repeated names in archive: ar cmdline. (line 106) +-* replacement in archive: ar cmdline. (line 73) +-* reporting bugs: Reporting Bugs. (line 6) +-* scripts, ar: ar scripts. (line 8) +-* section addresses in objdump: objdump. (line 73) +-* section headers: objdump. (line 164) +-* section information: objdump. (line 187) +-* section sizes: size. (line 6) +-* sections, full contents: objdump. (line 347) +-* size: size. (line 6) +-* size display format: size. (line 27) +-* size number format: size. (line 66) +-* sorting symbols: nm. (line 202) +-* source code context: objdump. (line 157) +-* source disassembly: objdump. (line 352) +-* source file name: nm. (line 141) +-* source filenames for object files: objdump. (line 191) +-* stab: objdump. (line 413) +-* start-address: objdump. (line 422) +-* stop-address: objdump. (line 426) +-* strings: strings. (line 6) +-* strings, printing: strings. (line 6) +-* strip: strip. (line 6) +-* Strip absolute paths: objdump. (line 359) +-* symbol index <1>: ar. (line 28) +-* symbol index: ranlib. (line 6) +-* symbol index, listing: nm. (line 224) +-* symbol line numbers: nm. (line 187) +-* symbol table entries, printing: objdump. (line 431) +-* symbols: nm. (line 6) +-* symbols, discarding: strip. (line 6) +-* thin archives: ar. (line 40) +-* undefined symbols: nm. (line 235) +-* Unix compatibility, ar: ar cmdline. (line 8) +-* unwind information: readelf. (line 106) +-* Update ELF header: elfedit. (line 6) +-* updating an archive: ar cmdline. (line 215) +-* version: Top. (line 6) +-* VMA in objdump: objdump. (line 73) +-* wide output, printing: objdump. (line 537) +-* writing archive index: ar cmdline. (line 197) +- +- +- +-Tag Table: +-Node: Top1896 +-Node: ar3609 +-Node: ar cmdline6747 +-Node: ar scripts17089 +-Node: nm22777 +-Node: objcopy32671 +-Node: objdump64440 +-Node: ranlib86571 +-Node: size88176 +-Node: strings91180 +-Node: strip93638 +-Node: c++filt100870 +-Ref: c++filt-Footnote-1105711 +-Node: addr2line105817 +-Node: nlmconv110154 +-Node: windmc112759 +-Node: windres116408 +-Node: dlltool122769 +-Node: def file format135649 +-Node: readelf138188 +-Node: elfedit145743 +-Node: Common Options147997 +-Node: Selecting the Target System149037 +-Node: Target Selection149969 +-Node: Architecture Selection151951 +-Node: Reporting Bugs152779 +-Node: Bug Criteria153558 +-Node: Bug Reporting154111 +-Node: GNU Free Documentation License160981 +-Node: Binutils Index186160 +- +-End Tag Table +diff -Nur binutils-2.24.orig/binutils/doc/cxxfilt.man binutils-2.24/binutils/doc/cxxfilt.man +--- binutils-2.24.orig/binutils/doc/cxxfilt.man 2013-11-18 09:49:32.000000000 +0100 ++++ binutils-2.24/binutils/doc/cxxfilt.man 1970-01-01 01:00:00.000000000 +0100 +@@ -1,336 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "C++FILT 1" +-.TH C++FILT 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-cxxfilt \- Demangle C++ and Java symbols. +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-c++filt [\fB\-_\fR|\fB\-\-strip\-underscore\fR] +- [\fB\-n\fR|\fB\-\-no\-strip\-underscore\fR] +- [\fB\-p\fR|\fB\-\-no\-params\fR] +- [\fB\-t\fR|\fB\-\-types\fR] +- [\fB\-i\fR|\fB\-\-no\-verbose\fR] +- [\fB\-s\fR \fIformat\fR|\fB\-\-format=\fR\fIformat\fR] +- [\fB\-\-help\fR] [\fB\-\-version\fR] [\fIsymbol\fR...] +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-The \*(C+ and Java languages provide function overloading, which means +-that you can write many functions with the same name, providing that +-each function takes parameters of different types. In order to be +-able to distinguish these similarly named functions \*(C+ and Java +-encode them into a low-level assembler name which uniquely identifies +-each different version. This process is known as \fImangling\fR. The +-\&\fBc++filt\fR +-[1] +-program does the inverse mapping: it decodes (\fIdemangles\fR) low-level +-names into user-level names so that they can be read. +-.PP +-Every alphanumeric word (consisting of letters, digits, underscores, +-dollars, or periods) seen in the input is a potential mangled name. +-If the name decodes into a \*(C+ name, the \*(C+ name replaces the +-low-level name in the output, otherwise the original word is output. +-In this way you can pass an entire assembler source file, containing +-mangled names, through \fBc++filt\fR and see the same source file +-containing demangled names. +-.PP +-You can also use \fBc++filt\fR to decipher individual symbols by +-passing them on the command line: +-.PP +-.Vb 1 +-\& c++filt +-.Ve +-.PP +-If no \fIsymbol\fR arguments are given, \fBc++filt\fR reads symbol +-names from the standard input instead. All the results are printed on +-the standard output. The difference between reading names from the +-command line versus reading names from the standard input is that +-command line arguments are expected to be just mangled names and no +-checking is performed to separate them from surrounding text. Thus +-for example: +-.PP +-.Vb 1 +-\& c++filt \-n _Z1fv +-.Ve +-.PP +-will work and demangle the name to \*(L"f()\*(R" whereas: +-.PP +-.Vb 1 +-\& c++filt \-n _Z1fv, +-.Ve +-.PP +-will not work. (Note the extra comma at the end of the mangled +-name which makes it invalid). This command however will work: +-.PP +-.Vb 1 +-\& echo _Z1fv, | c++filt \-n +-.Ve +-.PP +-and will display \*(L"f(),\*(R", i.e., the demangled name followed by a +-trailing comma. This behaviour is because when the names are read +-from the standard input it is expected that they might be part of an +-assembler source file where there might be extra, extraneous +-characters trailing after a mangled name. For example: +-.PP +-.Vb 1 +-\& .type _Z1fv, @function +-.Ve +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-.IP "\fB\-_\fR" 4 +-.IX Item "-_" +-.PD 0 +-.IP "\fB\-\-strip\-underscore\fR" 4 +-.IX Item "--strip-underscore" +-.PD +-On some systems, both the C and \*(C+ compilers put an underscore in front +-of every name. For example, the C name \f(CW\*(C`foo\*(C'\fR gets the low-level +-name \f(CW\*(C`_foo\*(C'\fR. This option removes the initial underscore. Whether +-\&\fBc++filt\fR removes the underscore by default is target dependent. +-.IP "\fB\-n\fR" 4 +-.IX Item "-n" +-.PD 0 +-.IP "\fB\-\-no\-strip\-underscore\fR" 4 +-.IX Item "--no-strip-underscore" +-.PD +-Do not remove the initial underscore. +-.IP "\fB\-p\fR" 4 +-.IX Item "-p" +-.PD 0 +-.IP "\fB\-\-no\-params\fR" 4 +-.IX Item "--no-params" +-.PD +-When demangling the name of a function, do not display the types of +-the function's parameters. +-.IP "\fB\-t\fR" 4 +-.IX Item "-t" +-.PD 0 +-.IP "\fB\-\-types\fR" 4 +-.IX Item "--types" +-.PD +-Attempt to demangle types as well as function names. This is disabled +-by default since mangled types are normally only used internally in +-the compiler, and they can be confused with non-mangled names. For example, +-a function called \*(L"a\*(R" treated as a mangled type name would be +-demangled to \*(L"signed char\*(R". +-.IP "\fB\-i\fR" 4 +-.IX Item "-i" +-.PD 0 +-.IP "\fB\-\-no\-verbose\fR" 4 +-.IX Item "--no-verbose" +-.PD +-Do not include implementation details (if any) in the demangled +-output. +-.IP "\fB\-s\fR \fIformat\fR" 4 +-.IX Item "-s format" +-.PD 0 +-.IP "\fB\-\-format=\fR\fIformat\fR" 4 +-.IX Item "--format=format" +-.PD +-\&\fBc++filt\fR can decode various methods of mangling, used by +-different compilers. The argument to this option selects which +-method it uses: +-.RS 4 +-.ie n .IP """auto""" 4 +-.el .IP "\f(CWauto\fR" 4 +-.IX Item "auto" +-Automatic selection based on executable (the default method) +-.ie n .IP """gnu""" 4 +-.el .IP "\f(CWgnu\fR" 4 +-.IX Item "gnu" +-the one used by the \s-1GNU\s0 \*(C+ compiler (g++) +-.ie n .IP """lucid""" 4 +-.el .IP "\f(CWlucid\fR" 4 +-.IX Item "lucid" +-the one used by the Lucid compiler (lcc) +-.ie n .IP """arm""" 4 +-.el .IP "\f(CWarm\fR" 4 +-.IX Item "arm" +-the one specified by the \*(C+ Annotated Reference Manual +-.ie n .IP """hp""" 4 +-.el .IP "\f(CWhp\fR" 4 +-.IX Item "hp" +-the one used by the \s-1HP\s0 compiler (aCC) +-.ie n .IP """edg""" 4 +-.el .IP "\f(CWedg\fR" 4 +-.IX Item "edg" +-the one used by the \s-1EDG\s0 compiler +-.ie n .IP """gnu\-v3""" 4 +-.el .IP "\f(CWgnu\-v3\fR" 4 +-.IX Item "gnu-v3" +-the one used by the \s-1GNU\s0 \*(C+ compiler (g++) with the V3 \s-1ABI\s0. +-.ie n .IP """java""" 4 +-.el .IP "\f(CWjava\fR" 4 +-.IX Item "java" +-the one used by the \s-1GNU\s0 Java compiler (gcj) +-.ie n .IP """gnat""" 4 +-.el .IP "\f(CWgnat\fR" 4 +-.IX Item "gnat" +-the one used by the \s-1GNU\s0 Ada compiler (\s-1GNAT\s0). +-.RE +-.RS 4 +-.RE +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-Print a summary of the options to \fBc++filt\fR and exit. +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-Print the version number of \fBc++filt\fR and exit. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "FOOTNOTES" +-.IX Header "FOOTNOTES" +-.IP "1." 4 +-MS-DOS does not allow \f(CW\*(C`+\*(C'\fR characters in file names, so on +-MS-DOS this program is named \fB\s-1CXXFILT\s0\fR. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/dlltool.1 binutils-2.24/binutils/doc/dlltool.1 +--- binutils-2.24.orig/binutils/doc/dlltool.1 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/doc/dlltool.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,529 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "DLLTOOL 1" +-.TH DLLTOOL 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-dlltool \- Create files needed to build and use DLLs. +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-dlltool [\fB\-d\fR|\fB\-\-input\-def\fR \fIdef-file-name\fR] +- [\fB\-b\fR|\fB\-\-base\-file\fR \fIbase-file-name\fR] +- [\fB\-e\fR|\fB\-\-output\-exp\fR \fIexports-file-name\fR] +- [\fB\-z\fR|\fB\-\-output\-def\fR \fIdef-file-name\fR] +- [\fB\-l\fR|\fB\-\-output\-lib\fR \fIlibrary-file-name\fR] +- [\fB\-y\fR|\fB\-\-output\-delaylib\fR \fIlibrary-file-name\fR] +- [\fB\-\-export\-all\-symbols\fR] [\fB\-\-no\-export\-all\-symbols\fR] +- [\fB\-\-exclude\-symbols\fR \fIlist\fR] +- [\fB\-\-no\-default\-excludes\fR] +- [\fB\-S\fR|\fB\-\-as\fR \fIpath-to-assembler\fR] [\fB\-f\fR|\fB\-\-as\-flags\fR \fIoptions\fR] +- [\fB\-D\fR|\fB\-\-dllname\fR \fIname\fR] [\fB\-m\fR|\fB\-\-machine\fR \fImachine\fR] +- [\fB\-a\fR|\fB\-\-add\-indirect\fR] +- [\fB\-U\fR|\fB\-\-add\-underscore\fR] [\fB\-\-add\-stdcall\-underscore\fR] +- [\fB\-k\fR|\fB\-\-kill\-at\fR] [\fB\-A\fR|\fB\-\-add\-stdcall\-alias\fR] +- [\fB\-p\fR|\fB\-\-ext\-prefix\-alias\fR \fIprefix\fR] +- [\fB\-x\fR|\fB\-\-no\-idata4\fR] [\fB\-c\fR|\fB\-\-no\-idata5\fR] +- [\fB\-\-use\-nul\-prefixed\-import\-tables\fR] +- [\fB\-I\fR|\fB\-\-identify\fR \fIlibrary-file-name\fR] [\fB\-\-identify\-strict\fR] +- [\fB\-i\fR|\fB\-\-interwork\fR] +- [\fB\-n\fR|\fB\-\-nodelete\fR] [\fB\-t\fR|\fB\-\-temp\-prefix\fR \fIprefix\fR] +- [\fB\-v\fR|\fB\-\-verbose\fR] +- [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] +- [\fB\-\-no\-leading\-underscore\fR] [\fB\-\-leading\-underscore\fR] +- [object\-file ...] +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-\&\fBdlltool\fR reads its inputs, which can come from the \fB\-d\fR and +-\&\fB\-b\fR options as well as object files specified on the command +-line. It then processes these inputs and if the \fB\-e\fR option has +-been specified it creates a exports file. If the \fB\-l\fR option +-has been specified it creates a library file and if the \fB\-z\fR option +-has been specified it creates a def file. Any or all of the \fB\-e\fR, +-\&\fB\-l\fR and \fB\-z\fR options can be present in one invocation of +-dlltool. +-.PP +-When creating a \s-1DLL\s0, along with the source for the \s-1DLL\s0, it is necessary +-to have three other files. \fBdlltool\fR can help with the creation of +-these files. +-.PP +-The first file is a \fI.def\fR file which specifies which functions are +-exported from the \s-1DLL\s0, which functions the \s-1DLL\s0 imports, and so on. This +-is a text file and can be created by hand, or \fBdlltool\fR can be used +-to create it using the \fB\-z\fR option. In this case \fBdlltool\fR +-will scan the object files specified on its command line looking for +-those functions which have been specially marked as being exported and +-put entries for them in the \fI.def\fR file it creates. +-.PP +-In order to mark a function as being exported from a \s-1DLL\s0, it needs to +-have an \fB\-export:\fR entry in the \fB.drectve\fR +-section of the object file. This can be done in C by using the +-\&\fIasm()\fR operator: +-.PP +-.Vb 2 +-\& asm (".section .drectve"); +-\& asm (".ascii \e"\-export:my_func\e""); +-\& +-\& int my_func (void) { ... } +-.Ve +-.PP +-The second file needed for \s-1DLL\s0 creation is an exports file. This file +-is linked with the object files that make up the body of the \s-1DLL\s0 and it +-handles the interface between the \s-1DLL\s0 and the outside world. This is a +-binary file and it can be created by giving the \fB\-e\fR option to +-\&\fBdlltool\fR when it is creating or reading in a \fI.def\fR file. +-.PP +-The third file needed for \s-1DLL\s0 creation is the library file that programs +-will link with in order to access the functions in the \s-1DLL\s0 (an `import +-library'). This file can be created by giving the \fB\-l\fR option to +-dlltool when it is creating or reading in a \fI.def\fR file. +-.PP +-If the \fB\-y\fR option is specified, dlltool generates a delay-import +-library that can be used instead of the normal import library to allow +-a program to link to the dll only as soon as an imported function is +-called for the first time. The resulting executable will need to be +-linked to the static delayimp library containing _\|\fI_delayLoadHelper2()\fR, +-which in turn will import LoadLibraryA and GetProcAddress from kernel32. +-.PP +-\&\fBdlltool\fR builds the library file by hand, but it builds the +-exports file by creating temporary files containing assembler statements +-and then assembling these. The \fB\-S\fR command line option can be +-used to specify the path to the assembler that dlltool will use, +-and the \fB\-f\fR option can be used to pass specific flags to that +-assembler. The \fB\-n\fR can be used to prevent dlltool from deleting +-these temporary assembler files when it is done, and if \fB\-n\fR is +-specified twice then this will prevent dlltool from deleting the +-temporary object files it used to build the library. +-.PP +-Here is an example of creating a \s-1DLL\s0 from a source file \fBdll.c\fR and +-also creating a program (from an object file called \fBprogram.o\fR) +-that uses that \s-1DLL:\s0 +-.PP +-.Vb 4 +-\& gcc \-c dll.c +-\& dlltool \-e exports.o \-l dll.lib dll.o +-\& gcc dll.o exports.o \-o dll.dll +-\& gcc program.o dll.lib \-o program +-.Ve +-.PP +-\&\fBdlltool\fR may also be used to query an existing import library +-to determine the name of the \s-1DLL\s0 to which it is associated. See the +-description of the \fB\-I\fR or \fB\-\-identify\fR option. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-The command line options have the following meanings: +-.IP "\fB\-d\fR \fIfilename\fR" 4 +-.IX Item "-d filename" +-.PD 0 +-.IP "\fB\-\-input\-def\fR \fIfilename\fR" 4 +-.IX Item "--input-def filename" +-.PD +-Specifies the name of a \fI.def\fR file to be read in and processed. +-.IP "\fB\-b\fR \fIfilename\fR" 4 +-.IX Item "-b filename" +-.PD 0 +-.IP "\fB\-\-base\-file\fR \fIfilename\fR" 4 +-.IX Item "--base-file filename" +-.PD +-Specifies the name of a base file to be read in and processed. The +-contents of this file will be added to the relocation section in the +-exports file generated by dlltool. +-.IP "\fB\-e\fR \fIfilename\fR" 4 +-.IX Item "-e filename" +-.PD 0 +-.IP "\fB\-\-output\-exp\fR \fIfilename\fR" 4 +-.IX Item "--output-exp filename" +-.PD +-Specifies the name of the export file to be created by dlltool. +-.IP "\fB\-z\fR \fIfilename\fR" 4 +-.IX Item "-z filename" +-.PD 0 +-.IP "\fB\-\-output\-def\fR \fIfilename\fR" 4 +-.IX Item "--output-def filename" +-.PD +-Specifies the name of the \fI.def\fR file to be created by dlltool. +-.IP "\fB\-l\fR \fIfilename\fR" 4 +-.IX Item "-l filename" +-.PD 0 +-.IP "\fB\-\-output\-lib\fR \fIfilename\fR" 4 +-.IX Item "--output-lib filename" +-.PD +-Specifies the name of the library file to be created by dlltool. +-.IP "\fB\-y\fR \fIfilename\fR" 4 +-.IX Item "-y filename" +-.PD 0 +-.IP "\fB\-\-output\-delaylib\fR \fIfilename\fR" 4 +-.IX Item "--output-delaylib filename" +-.PD +-Specifies the name of the delay-import library file to be created by dlltool. +-.IP "\fB\-\-export\-all\-symbols\fR" 4 +-.IX Item "--export-all-symbols" +-Treat all global and weak defined symbols found in the input object +-files as symbols to be exported. There is a small list of symbols which +-are not exported by default; see the \fB\-\-no\-default\-excludes\fR +-option. You may add to the list of symbols to not export by using the +-\&\fB\-\-exclude\-symbols\fR option. +-.IP "\fB\-\-no\-export\-all\-symbols\fR" 4 +-.IX Item "--no-export-all-symbols" +-Only export symbols explicitly listed in an input \fI.def\fR file or in +-\&\fB.drectve\fR sections in the input object files. This is the default +-behaviour. The \fB.drectve\fR sections are created by \fBdllexport\fR +-attributes in the source code. +-.IP "\fB\-\-exclude\-symbols\fR \fIlist\fR" 4 +-.IX Item "--exclude-symbols list" +-Do not export the symbols in \fIlist\fR. This is a list of symbol names +-separated by comma or colon characters. The symbol names should not +-contain a leading underscore. This is only meaningful when +-\&\fB\-\-export\-all\-symbols\fR is used. +-.IP "\fB\-\-no\-default\-excludes\fR" 4 +-.IX Item "--no-default-excludes" +-When \fB\-\-export\-all\-symbols\fR is used, it will by default avoid +-exporting certain special symbols. The current list of symbols to avoid +-exporting is \fBDllMain@12\fR, \fBDllEntryPoint@0\fR, +-\&\fBimpure_ptr\fR. You may use the \fB\-\-no\-default\-excludes\fR option +-to go ahead and export these special symbols. This is only meaningful +-when \fB\-\-export\-all\-symbols\fR is used. +-.IP "\fB\-S\fR \fIpath\fR" 4 +-.IX Item "-S path" +-.PD 0 +-.IP "\fB\-\-as\fR \fIpath\fR" 4 +-.IX Item "--as path" +-.PD +-Specifies the path, including the filename, of the assembler to be used +-to create the exports file. +-.IP "\fB\-f\fR \fIoptions\fR" 4 +-.IX Item "-f options" +-.PD 0 +-.IP "\fB\-\-as\-flags\fR \fIoptions\fR" 4 +-.IX Item "--as-flags options" +-.PD +-Specifies any specific command line options to be passed to the +-assembler when building the exports file. This option will work even if +-the \fB\-S\fR option is not used. This option only takes one argument, +-and if it occurs more than once on the command line, then later +-occurrences will override earlier occurrences. So if it is necessary to +-pass multiple options to the assembler they should be enclosed in +-double quotes. +-.IP "\fB\-D\fR \fIname\fR" 4 +-.IX Item "-D name" +-.PD 0 +-.IP "\fB\-\-dll\-name\fR \fIname\fR" 4 +-.IX Item "--dll-name name" +-.PD +-Specifies the name to be stored in the \fI.def\fR file as the name of +-the \s-1DLL\s0 when the \fB\-e\fR option is used. If this option is not +-present, then the filename given to the \fB\-e\fR option will be +-used as the name of the \s-1DLL\s0. +-.IP "\fB\-m\fR \fImachine\fR" 4 +-.IX Item "-m machine" +-.PD 0 +-.IP "\fB\-machine\fR \fImachine\fR" 4 +-.IX Item "-machine machine" +-.PD +-Specifies the type of machine for which the library file should be +-built. \fBdlltool\fR has a built in default type, depending upon how +-it was created, but this option can be used to override that. This is +-normally only useful when creating DLLs for an \s-1ARM\s0 processor, when the +-contents of the \s-1DLL\s0 are actually encode using Thumb instructions. +-.IP "\fB\-a\fR" 4 +-.IX Item "-a" +-.PD 0 +-.IP "\fB\-\-add\-indirect\fR" 4 +-.IX Item "--add-indirect" +-.PD +-Specifies that when \fBdlltool\fR is creating the exports file it +-should add a section which allows the exported functions to be +-referenced without using the import library. Whatever the hell that +-means! +-.IP "\fB\-U\fR" 4 +-.IX Item "-U" +-.PD 0 +-.IP "\fB\-\-add\-underscore\fR" 4 +-.IX Item "--add-underscore" +-.PD +-Specifies that when \fBdlltool\fR is creating the exports file it +-should prepend an underscore to the names of \fIall\fR exported symbols. +-.IP "\fB\-\-no\-leading\-underscore\fR" 4 +-.IX Item "--no-leading-underscore" +-.PD 0 +-.IP "\fB\-\-leading\-underscore\fR" 4 +-.IX Item "--leading-underscore" +-.PD +-Specifies whether standard symbol should be forced to be prefixed, or +-not. +-.IP "\fB\-\-add\-stdcall\-underscore\fR" 4 +-.IX Item "--add-stdcall-underscore" +-Specifies that when \fBdlltool\fR is creating the exports file it +-should prepend an underscore to the names of exported \fIstdcall\fR +-functions. Variable names and non-stdcall function names are not modified. +-This option is useful when creating GNU-compatible import libs for third +-party DLLs that were built with MS-Windows tools. +-.IP "\fB\-k\fR" 4 +-.IX Item "-k" +-.PD 0 +-.IP "\fB\-\-kill\-at\fR" 4 +-.IX Item "--kill-at" +-.PD +-Specifies that when \fBdlltool\fR is creating the exports file it +-should not append the string \fB@ \fR. These numbers are +-called ordinal numbers and they represent another way of accessing the +-function in a \s-1DLL\s0, other than by name. +-.IP "\fB\-A\fR" 4 +-.IX Item "-A" +-.PD 0 +-.IP "\fB\-\-add\-stdcall\-alias\fR" 4 +-.IX Item "--add-stdcall-alias" +-.PD +-Specifies that when \fBdlltool\fR is creating the exports file it +-should add aliases for stdcall symbols without \fB@ \fR +-in addition to the symbols with \fB@ \fR. +-.IP "\fB\-p\fR" 4 +-.IX Item "-p" +-.PD 0 +-.IP "\fB\-\-ext\-prefix\-alias\fR \fIprefix\fR" 4 +-.IX Item "--ext-prefix-alias prefix" +-.PD +-Causes \fBdlltool\fR to create external aliases for all \s-1DLL\s0 +-imports with the specified prefix. The aliases are created for both +-external and import symbols with no leading underscore. +-.IP "\fB\-x\fR" 4 +-.IX Item "-x" +-.PD 0 +-.IP "\fB\-\-no\-idata4\fR" 4 +-.IX Item "--no-idata4" +-.PD +-Specifies that when \fBdlltool\fR is creating the exports and library +-files it should omit the \f(CW\*(C`.idata4\*(C'\fR section. This is for compatibility +-with certain operating systems. +-.IP "\fB\-\-use\-nul\-prefixed\-import\-tables\fR" 4 +-.IX Item "--use-nul-prefixed-import-tables" +-Specifies that when \fBdlltool\fR is creating the exports and library +-files it should prefix the \f(CW\*(C`.idata4\*(C'\fR and \f(CW\*(C`.idata5\*(C'\fR by zero an +-element. This emulates old gnu import library generation of +-\&\f(CW\*(C`dlltool\*(C'\fR. By default this option is turned off. +-.IP "\fB\-c\fR" 4 +-.IX Item "-c" +-.PD 0 +-.IP "\fB\-\-no\-idata5\fR" 4 +-.IX Item "--no-idata5" +-.PD +-Specifies that when \fBdlltool\fR is creating the exports and library +-files it should omit the \f(CW\*(C`.idata5\*(C'\fR section. This is for compatibility +-with certain operating systems. +-.IP "\fB\-I\fR \fIfilename\fR" 4 +-.IX Item "-I filename" +-.PD 0 +-.IP "\fB\-\-identify\fR \fIfilename\fR" 4 +-.IX Item "--identify filename" +-.PD +-Specifies that \fBdlltool\fR should inspect the import library +-indicated by \fIfilename\fR and report, on \f(CW\*(C`stdout\*(C'\fR, the name(s) +-of the associated \s-1DLL\s0(s). This can be performed in addition to any +-other operations indicated by the other options and arguments. +-\&\fBdlltool\fR fails if the import library does not exist or is not +-actually an import library. See also \fB\-\-identify\-strict\fR. +-.IP "\fB\-\-identify\-strict\fR" 4 +-.IX Item "--identify-strict" +-Modifies the behavior of the \fB\-\-identify\fR option, such +-that an error is reported if \fIfilename\fR is associated with +-more than one \s-1DLL\s0. +-.IP "\fB\-i\fR" 4 +-.IX Item "-i" +-.PD 0 +-.IP "\fB\-\-interwork\fR" 4 +-.IX Item "--interwork" +-.PD +-Specifies that \fBdlltool\fR should mark the objects in the library +-file and exports file that it produces as supporting interworking +-between \s-1ARM\s0 and Thumb code. +-.IP "\fB\-n\fR" 4 +-.IX Item "-n" +-.PD 0 +-.IP "\fB\-\-nodelete\fR" 4 +-.IX Item "--nodelete" +-.PD +-Makes \fBdlltool\fR preserve the temporary assembler files it used to +-create the exports file. If this option is repeated then dlltool will +-also preserve the temporary object files it uses to create the library +-file. +-.IP "\fB\-t\fR \fIprefix\fR" 4 +-.IX Item "-t prefix" +-.PD 0 +-.IP "\fB\-\-temp\-prefix\fR \fIprefix\fR" 4 +-.IX Item "--temp-prefix prefix" +-.PD +-Makes \fBdlltool\fR use \fIprefix\fR when constructing the names of +-temporary assembler and object files. By default, the temp file prefix +-is generated from the pid. +-.IP "\fB\-v\fR" 4 +-.IX Item "-v" +-.PD 0 +-.IP "\fB\-\-verbose\fR" 4 +-.IX Item "--verbose" +-.PD +-Make dlltool describe what it is doing. +-.IP "\fB\-h\fR" 4 +-.IX Item "-h" +-.PD 0 +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-.PD +-Displays a list of command line options and then exits. +-.IP "\fB\-V\fR" 4 +-.IX Item "-V" +-.PD 0 +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-.PD +-Displays dlltool's version number and then exits. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-The Info pages for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/elfedit.1 binutils-2.24/binutils/doc/elfedit.1 +--- binutils-2.24.orig/binutils/doc/elfedit.1 2013-11-18 09:49:31.000000000 +0100 ++++ binutils-2.24/binutils/doc/elfedit.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,233 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "ELFEDIT 1" +-.TH ELFEDIT 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-elfedit \- Update the ELF header of ELF files. +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-elfedit [\fB\-\-input\-mach=\fR\fImachine\fR] +- [\fB\-\-input\-type=\fR\fItype\fR] +- [\fB\-\-input\-osabi=\fR\fIosabi\fR] +- \fB\-\-output\-mach=\fR\fImachine\fR +- \fB\-\-output\-type=\fR\fItype\fR +- \fB\-\-output\-osabi=\fR\fIosabi\fR +- [\fB\-v\fR|\fB\-\-version\fR] +- [\fB\-h\fR|\fB\-\-help\fR] +- \fIelffile\fR... +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-\&\fBelfedit\fR updates the \s-1ELF\s0 header of \s-1ELF\s0 files which have +-the matching \s-1ELF\s0 machine and file types. The options control how and +-which fields in the \s-1ELF\s0 header should be updated. +-.PP +-\&\fIelffile\fR... are the \s-1ELF\s0 files to be updated. 32\-bit and +-64\-bit \s-1ELF\s0 files are supported, as are archives containing \s-1ELF\s0 files. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-The long and short forms of options, shown here as alternatives, are +-equivalent. At least one of the \fB\-\-output\-mach\fR, +-\&\fB\-\-output\-type\fR and \fB\-\-output\-osabi\fR options must be given. +-.IP "\fB\-\-input\-mach=\fR\fImachine\fR" 4 +-.IX Item "--input-mach=machine" +-Set the matching input \s-1ELF\s0 machine type to \fImachine\fR. If +-\&\fB\-\-input\-mach\fR isn't specified, it will match any \s-1ELF\s0 +-machine types. +-.Sp +-The supported \s-1ELF\s0 machine types are, \fIL1OM\fR, \fIK1OM\fR and +-\&\fIx86\-64\fR. +-.IP "\fB\-\-output\-mach=\fR\fImachine\fR" 4 +-.IX Item "--output-mach=machine" +-Change the \s-1ELF\s0 machine type in the \s-1ELF\s0 header to \fImachine\fR. The +-supported \s-1ELF\s0 machine types are the same as \fB\-\-input\-mach\fR. +-.IP "\fB\-\-input\-type=\fR\fItype\fR" 4 +-.IX Item "--input-type=type" +-Set the matching input \s-1ELF\s0 file type to \fItype\fR. If +-\&\fB\-\-input\-type\fR isn't specified, it will match any \s-1ELF\s0 file types. +-.Sp +-The supported \s-1ELF\s0 file types are, \fIrel\fR, \fIexec\fR and \fIdyn\fR. +-.IP "\fB\-\-output\-type=\fR\fItype\fR" 4 +-.IX Item "--output-type=type" +-Change the \s-1ELF\s0 file type in the \s-1ELF\s0 header to \fItype\fR. The +-supported \s-1ELF\s0 types are the same as \fB\-\-input\-type\fR. +-.IP "\fB\-\-input\-osabi=\fR\fIosabi\fR" 4 +-.IX Item "--input-osabi=osabi" +-Set the matching input \s-1ELF\s0 file \s-1OSABI\s0 to \fIosabi\fR. If +-\&\fB\-\-input\-osabi\fR isn't specified, it will match any \s-1ELF\s0 OSABIs. +-.Sp +-The supported \s-1ELF\s0 OSABIs are, \fInone\fR, \fI\s-1HPUX\s0\fR, \fINetBSD\fR, +-\&\fI\s-1GNU\s0\fR, \fILinux\fR (alias for \fI\s-1GNU\s0\fR), +-\&\fISolaris\fR, \fI\s-1AIX\s0\fR, \fIIrix\fR, +-\&\fIFreeBSD\fR, \fI\s-1TRU64\s0\fR, \fIModesto\fR, \fIOpenBSD\fR, \fIOpenVMS\fR, +-\&\fI\s-1NSK\s0\fR, \fI\s-1AROS\s0\fR and \fIFenixOS\fR. +-.IP "\fB\-\-output\-osabi=\fR\fIosabi\fR" 4 +-.IX Item "--output-osabi=osabi" +-Change the \s-1ELF\s0 \s-1OSABI\s0 in the \s-1ELF\s0 header to \fIosabi\fR. The +-supported \s-1ELF\s0 \s-1OSABI\s0 are the same as \fB\-\-input\-osabi\fR. +-.IP "\fB\-v\fR" 4 +-.IX Item "-v" +-.PD 0 +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-.PD +-Display the version number of \fBelfedit\fR. +-.IP "\fB\-h\fR" 4 +-.IX Item "-h" +-.PD 0 +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-.PD +-Display the command line options understood by \fBelfedit\fR. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-\&\fIreadelf\fR\|(1), and the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/nlmconv.1 binutils-2.24/binutils/doc/nlmconv.1 +--- binutils-2.24.orig/binutils/doc/nlmconv.1 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/doc/nlmconv.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,242 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "NLMCONV 1" +-.TH NLMCONV 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-nlmconv \- converts object code into an NLM. +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-nlmconv [\fB\-I\fR \fIbfdname\fR|\fB\-\-input\-target=\fR\fIbfdname\fR] +- [\fB\-O\fR \fIbfdname\fR|\fB\-\-output\-target=\fR\fIbfdname\fR] +- [\fB\-T\fR \fIheaderfile\fR|\fB\-\-header\-file=\fR\fIheaderfile\fR] +- [\fB\-d\fR|\fB\-\-debug\fR] [\fB\-l\fR \fIlinker\fR|\fB\-\-linker=\fR\fIlinker\fR] +- [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] +- \fIinfile\fR \fIoutfile\fR +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-\&\fBnlmconv\fR converts the relocatable \fBi386\fR object file +-\&\fIinfile\fR into the NetWare Loadable Module \fIoutfile\fR, optionally +-reading \fIheaderfile\fR for \s-1NLM\s0 header information. For instructions +-on writing the \s-1NLM\s0 command file language used in header files, see the +-\&\fBlinkers\fR section, \fB\s-1NLMLINK\s0\fR in particular, of the \fI\s-1NLM\s0 +-Development and Tools Overview\fR, which is part of the \s-1NLM\s0 Software +-Developer's Kit (\*(L"\s-1NLM\s0 \s-1SDK\s0\*(R"), available from Novell, Inc. +-\&\fBnlmconv\fR uses the \s-1GNU\s0 Binary File Descriptor library to read +-\&\fIinfile\fR; +-.PP +-\&\fBnlmconv\fR can perform a link step. In other words, you can list +-more than one object file for input if you list them in the definitions +-file (rather than simply specifying one input file on the command line). +-In this case, \fBnlmconv\fR calls the linker for you. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-.IP "\fB\-I\fR \fIbfdname\fR" 4 +-.IX Item "-I bfdname" +-.PD 0 +-.IP "\fB\-\-input\-target=\fR\fIbfdname\fR" 4 +-.IX Item "--input-target=bfdname" +-.PD +-Object format of the input file. \fBnlmconv\fR can usually determine +-the format of a given file (so no default is necessary). +-.IP "\fB\-O\fR \fIbfdname\fR" 4 +-.IX Item "-O bfdname" +-.PD 0 +-.IP "\fB\-\-output\-target=\fR\fIbfdname\fR" 4 +-.IX Item "--output-target=bfdname" +-.PD +-Object format of the output file. \fBnlmconv\fR infers the output +-format based on the input format, e.g. for a \fBi386\fR input file the +-output format is \fBnlm32\-i386\fR. +-.IP "\fB\-T\fR \fIheaderfile\fR" 4 +-.IX Item "-T headerfile" +-.PD 0 +-.IP "\fB\-\-header\-file=\fR\fIheaderfile\fR" 4 +-.IX Item "--header-file=headerfile" +-.PD +-Reads \fIheaderfile\fR for \s-1NLM\s0 header information. For instructions on +-writing the \s-1NLM\s0 command file language used in header files, see see the +-\&\fBlinkers\fR section, of the \fI\s-1NLM\s0 Development and Tools +-Overview\fR, which is part of the \s-1NLM\s0 Software Developer's Kit, available +-from Novell, Inc. +-.IP "\fB\-d\fR" 4 +-.IX Item "-d" +-.PD 0 +-.IP "\fB\-\-debug\fR" 4 +-.IX Item "--debug" +-.PD +-Displays (on standard error) the linker command line used by \fBnlmconv\fR. +-.IP "\fB\-l\fR \fIlinker\fR" 4 +-.IX Item "-l linker" +-.PD 0 +-.IP "\fB\-\-linker=\fR\fIlinker\fR" 4 +-.IX Item "--linker=linker" +-.PD +-Use \fIlinker\fR for any linking. \fIlinker\fR can be an absolute or a +-relative pathname. +-.IP "\fB\-h\fR" 4 +-.IX Item "-h" +-.PD 0 +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-.PD +-Prints a usage summary. +-.IP "\fB\-V\fR" 4 +-.IX Item "-V" +-.PD 0 +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-.PD +-Prints the version number for \fBnlmconv\fR. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/nm.1 binutils-2.24/binutils/doc/nm.1 +--- binutils-2.24.orig/binutils/doc/nm.1 2013-11-18 09:49:31.000000000 +0100 ++++ binutils-2.24/binutils/doc/nm.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,530 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "NM 1" +-.TH NM 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-nm \- list symbols from object files +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-nm [\fB\-A\fR|\fB\-o\fR|\fB\-\-print\-file\-name\fR] [\fB\-a\fR|\fB\-\-debug\-syms\fR] +- [\fB\-B\fR|\fB\-\-format=bsd\fR] [\fB\-C\fR|\fB\-\-demangle\fR[=\fIstyle\fR]] +- [\fB\-D\fR|\fB\-\-dynamic\fR] [\fB\-f\fR\fIformat\fR|\fB\-\-format=\fR\fIformat\fR] +- [\fB\-g\fR|\fB\-\-extern\-only\fR] [\fB\-h\fR|\fB\-\-help\fR] +- [\fB\-l\fR|\fB\-\-line\-numbers\fR] [\fB\-n\fR|\fB\-v\fR|\fB\-\-numeric\-sort\fR] +- [\fB\-P\fR|\fB\-\-portability\fR] [\fB\-p\fR|\fB\-\-no\-sort\fR] +- [\fB\-r\fR|\fB\-\-reverse\-sort\fR] [\fB\-S\fR|\fB\-\-print\-size\fR] +- [\fB\-s\fR|\fB\-\-print\-armap\fR] [\fB\-t\fR \fIradix\fR|\fB\-\-radix=\fR\fIradix\fR] +- [\fB\-u\fR|\fB\-\-undefined\-only\fR] [\fB\-V\fR|\fB\-\-version\fR] +- [\fB\-X 32_64\fR] [\fB\-\-defined\-only\fR] [\fB\-\-no\-demangle\fR] +- [\fB\-\-plugin\fR \fIname\fR] [\fB\-\-size\-sort\fR] [\fB\-\-special\-syms\fR] +- [\fB\-\-synthetic\fR] [\fB\-\-target=\fR\fIbfdname\fR] +- [\fIobjfile\fR...] +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-\&\s-1GNU\s0 \fBnm\fR lists the symbols from object files \fIobjfile\fR.... +-If no object files are listed as arguments, \fBnm\fR assumes the file +-\&\fIa.out\fR. +-.PP +-For each symbol, \fBnm\fR shows: +-.IP "\(bu" 4 +-The symbol value, in the radix selected by options (see below), or +-hexadecimal by default. +-.IP "\(bu" 4 +-The symbol type. At least the following types are used; others are, as +-well, depending on the object file format. If lowercase, the symbol is +-usually local; if uppercase, the symbol is global (external). There +-are however a few lowercase symbols that are shown for special global +-symbols (\f(CW\*(C`u\*(C'\fR, \f(CW\*(C`v\*(C'\fR and \f(CW\*(C`w\*(C'\fR). +-.RS 4 +-.ie n .IP """A""" 4 +-.el .IP "\f(CWA\fR" 4 +-.IX Item "A" +-The symbol's value is absolute, and will not be changed by further +-linking. +-.ie n .IP """B""" 4 +-.el .IP "\f(CWB\fR" 4 +-.IX Item "B" +-.PD 0 +-.ie n .IP """b""" 4 +-.el .IP "\f(CWb\fR" 4 +-.IX Item "b" +-.PD +-The symbol is in the uninitialized data section (known as \s-1BSS\s0). +-.ie n .IP """C""" 4 +-.el .IP "\f(CWC\fR" 4 +-.IX Item "C" +-The symbol is common. Common symbols are uninitialized data. When +-linking, multiple common symbols may appear with the same name. If the +-symbol is defined anywhere, the common symbols are treated as undefined +-references. +-.ie n .IP """D""" 4 +-.el .IP "\f(CWD\fR" 4 +-.IX Item "D" +-.PD 0 +-.ie n .IP """d""" 4 +-.el .IP "\f(CWd\fR" 4 +-.IX Item "d" +-.PD +-The symbol is in the initialized data section. +-.ie n .IP """G""" 4 +-.el .IP "\f(CWG\fR" 4 +-.IX Item "G" +-.PD 0 +-.ie n .IP """g""" 4 +-.el .IP "\f(CWg\fR" 4 +-.IX Item "g" +-.PD +-The symbol is in an initialized data section for small objects. Some +-object file formats permit more efficient access to small data objects, +-such as a global int variable as opposed to a large global array. +-.ie n .IP """i""" 4 +-.el .IP "\f(CWi\fR" 4 +-.IX Item "i" +-For \s-1PE\s0 format files this indicates that the symbol is in a section +-specific to the implementation of DLLs. For \s-1ELF\s0 format files this +-indicates that the symbol is an indirect function. This is a \s-1GNU\s0 +-extension to the standard set of \s-1ELF\s0 symbol types. It indicates a +-symbol which if referenced by a relocation does not evaluate to its +-address, but instead must be invoked at runtime. The runtime +-execution will then return the value to be used in the relocation. +-.ie n .IP """I""" 4 +-.el .IP "\f(CWI\fR" 4 +-.IX Item "I" +-The symbol is an indirect reference to another symbol. +-.ie n .IP """N""" 4 +-.el .IP "\f(CWN\fR" 4 +-.IX Item "N" +-The symbol is a debugging symbol. +-.ie n .IP """p""" 4 +-.el .IP "\f(CWp\fR" 4 +-.IX Item "p" +-The symbols is in a stack unwind section. +-.ie n .IP """R""" 4 +-.el .IP "\f(CWR\fR" 4 +-.IX Item "R" +-.PD 0 +-.ie n .IP """r""" 4 +-.el .IP "\f(CWr\fR" 4 +-.IX Item "r" +-.PD +-The symbol is in a read only data section. +-.ie n .IP """S""" 4 +-.el .IP "\f(CWS\fR" 4 +-.IX Item "S" +-.PD 0 +-.ie n .IP """s""" 4 +-.el .IP "\f(CWs\fR" 4 +-.IX Item "s" +-.PD +-The symbol is in an uninitialized data section for small objects. +-.ie n .IP """T""" 4 +-.el .IP "\f(CWT\fR" 4 +-.IX Item "T" +-.PD 0 +-.ie n .IP """t""" 4 +-.el .IP "\f(CWt\fR" 4 +-.IX Item "t" +-.PD +-The symbol is in the text (code) section. +-.ie n .IP """U""" 4 +-.el .IP "\f(CWU\fR" 4 +-.IX Item "U" +-The symbol is undefined. +-.ie n .IP """u""" 4 +-.el .IP "\f(CWu\fR" 4 +-.IX Item "u" +-The symbol is a unique global symbol. This is a \s-1GNU\s0 extension to the +-standard set of \s-1ELF\s0 symbol bindings. For such a symbol the dynamic linker +-will make sure that in the entire process there is just one symbol with +-this name and type in use. +-.ie n .IP """V""" 4 +-.el .IP "\f(CWV\fR" 4 +-.IX Item "V" +-.PD 0 +-.ie n .IP """v""" 4 +-.el .IP "\f(CWv\fR" 4 +-.IX Item "v" +-.PD +-The symbol is a weak object. When a weak defined symbol is linked with +-a normal defined symbol, the normal defined symbol is used with no error. +-When a weak undefined symbol is linked and the symbol is not defined, +-the value of the weak symbol becomes zero with no error. On some +-systems, uppercase indicates that a default value has been specified. +-.ie n .IP """W""" 4 +-.el .IP "\f(CWW\fR" 4 +-.IX Item "W" +-.PD 0 +-.ie n .IP """w""" 4 +-.el .IP "\f(CWw\fR" 4 +-.IX Item "w" +-.PD +-The symbol is a weak symbol that has not been specifically tagged as a +-weak object symbol. When a weak defined symbol is linked with a normal +-defined symbol, the normal defined symbol is used with no error. +-When a weak undefined symbol is linked and the symbol is not defined, +-the value of the symbol is determined in a system-specific manner without +-error. On some systems, uppercase indicates that a default value has been +-specified. +-.ie n .IP """\-""" 4 +-.el .IP "\f(CW\-\fR" 4 +-.IX Item "-" +-The symbol is a stabs symbol in an a.out object file. In this case, the +-next values printed are the stabs other field, the stabs desc field, and +-the stab type. Stabs symbols are used to hold debugging information. +-.ie n .IP """?""" 4 +-.el .IP "\f(CW?\fR" 4 +-.IX Item "?" +-The symbol type is unknown, or object file format specific. +-.RE +-.RS 4 +-.RE +-.IP "\(bu" 4 +-The symbol name. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-The long and short forms of options, shown here as alternatives, are +-equivalent. +-.IP "\fB\-A\fR" 4 +-.IX Item "-A" +-.PD 0 +-.IP "\fB\-o\fR" 4 +-.IX Item "-o" +-.IP "\fB\-\-print\-file\-name\fR" 4 +-.IX Item "--print-file-name" +-.PD +-Precede each symbol by the name of the input file (or archive member) +-in which it was found, rather than identifying the input file once only, +-before all of its symbols. +-.IP "\fB\-a\fR" 4 +-.IX Item "-a" +-.PD 0 +-.IP "\fB\-\-debug\-syms\fR" 4 +-.IX Item "--debug-syms" +-.PD +-Display all symbols, even debugger-only symbols; normally these are not +-listed. +-.IP "\fB\-B\fR" 4 +-.IX Item "-B" +-The same as \fB\-\-format=bsd\fR (for compatibility with the \s-1MIPS\s0 \fBnm\fR). +-.IP "\fB\-C\fR" 4 +-.IX Item "-C" +-.PD 0 +-.IP "\fB\-\-demangle[=\fR\fIstyle\fR\fB]\fR" 4 +-.IX Item "--demangle[=style]" +-.PD +-Decode (\fIdemangle\fR) low-level symbol names into user-level names. +-Besides removing any initial underscore prepended by the system, this +-makes \*(C+ function names readable. Different compilers have different +-mangling styles. The optional demangling style argument can be used to +-choose an appropriate demangling style for your compiler. +-.IP "\fB\-\-no\-demangle\fR" 4 +-.IX Item "--no-demangle" +-Do not demangle low-level symbol names. This is the default. +-.IP "\fB\-D\fR" 4 +-.IX Item "-D" +-.PD 0 +-.IP "\fB\-\-dynamic\fR" 4 +-.IX Item "--dynamic" +-.PD +-Display the dynamic symbols rather than the normal symbols. This is +-only meaningful for dynamic objects, such as certain types of shared +-libraries. +-.IP "\fB\-f\fR \fIformat\fR" 4 +-.IX Item "-f format" +-.PD 0 +-.IP "\fB\-\-format=\fR\fIformat\fR" 4 +-.IX Item "--format=format" +-.PD +-Use the output format \fIformat\fR, which can be \f(CW\*(C`bsd\*(C'\fR, +-\&\f(CW\*(C`sysv\*(C'\fR, or \f(CW\*(C`posix\*(C'\fR. The default is \f(CW\*(C`bsd\*(C'\fR. +-Only the first character of \fIformat\fR is significant; it can be +-either upper or lower case. +-.IP "\fB\-g\fR" 4 +-.IX Item "-g" +-.PD 0 +-.IP "\fB\-\-extern\-only\fR" 4 +-.IX Item "--extern-only" +-.PD +-Display only external symbols. +-.IP "\fB\-h\fR" 4 +-.IX Item "-h" +-.PD 0 +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-.PD +-Show a summary of the options to \fBnm\fR and exit. +-.IP "\fB\-l\fR" 4 +-.IX Item "-l" +-.PD 0 +-.IP "\fB\-\-line\-numbers\fR" 4 +-.IX Item "--line-numbers" +-.PD +-For each symbol, use debugging information to try to find a filename and +-line number. For a defined symbol, look for the line number of the +-address of the symbol. For an undefined symbol, look for the line +-number of a relocation entry which refers to the symbol. If line number +-information can be found, print it after the other symbol information. +-.IP "\fB\-n\fR" 4 +-.IX Item "-n" +-.PD 0 +-.IP "\fB\-v\fR" 4 +-.IX Item "-v" +-.IP "\fB\-\-numeric\-sort\fR" 4 +-.IX Item "--numeric-sort" +-.PD +-Sort symbols numerically by their addresses, rather than alphabetically +-by their names. +-.IP "\fB\-p\fR" 4 +-.IX Item "-p" +-.PD 0 +-.IP "\fB\-\-no\-sort\fR" 4 +-.IX Item "--no-sort" +-.PD +-Do not bother to sort the symbols in any order; print them in the order +-encountered. +-.IP "\fB\-P\fR" 4 +-.IX Item "-P" +-.PD 0 +-.IP "\fB\-\-portability\fR" 4 +-.IX Item "--portability" +-.PD +-Use the \s-1POSIX\s0.2 standard output format instead of the default format. +-Equivalent to \fB\-f posix\fR. +-.IP "\fB\-r\fR" 4 +-.IX Item "-r" +-.PD 0 +-.IP "\fB\-\-reverse\-sort\fR" 4 +-.IX Item "--reverse-sort" +-.PD +-Reverse the order of the sort (whether numeric or alphabetic); let the +-last come first. +-.IP "\fB\-S\fR" 4 +-.IX Item "-S" +-.PD 0 +-.IP "\fB\-\-print\-size\fR" 4 +-.IX Item "--print-size" +-.PD +-Print both value and size of defined symbols for the \f(CW\*(C`bsd\*(C'\fR output style. +-This option has no effect for object formats that do not record symbol +-sizes, unless \fB\-\-size\-sort\fR is also used in which case a +-calculated size is displayed. +-.IP "\fB\-s\fR" 4 +-.IX Item "-s" +-.PD 0 +-.IP "\fB\-\-print\-armap\fR" 4 +-.IX Item "--print-armap" +-.PD +-When listing symbols from archive members, include the index: a mapping +-(stored in the archive by \fBar\fR or \fBranlib\fR) of which modules +-contain definitions for which names. +-.IP "\fB\-t\fR \fIradix\fR" 4 +-.IX Item "-t radix" +-.PD 0 +-.IP "\fB\-\-radix=\fR\fIradix\fR" 4 +-.IX Item "--radix=radix" +-.PD +-Use \fIradix\fR as the radix for printing the symbol values. It must be +-\&\fBd\fR for decimal, \fBo\fR for octal, or \fBx\fR for hexadecimal. +-.IP "\fB\-u\fR" 4 +-.IX Item "-u" +-.PD 0 +-.IP "\fB\-\-undefined\-only\fR" 4 +-.IX Item "--undefined-only" +-.PD +-Display only undefined symbols (those external to each object file). +-.IP "\fB\-V\fR" 4 +-.IX Item "-V" +-.PD 0 +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-.PD +-Show the version number of \fBnm\fR and exit. +-.IP "\fB\-X\fR" 4 +-.IX Item "-X" +-This option is ignored for compatibility with the \s-1AIX\s0 version of +-\&\fBnm\fR. It takes one parameter which must be the string +-\&\fB32_64\fR. The default mode of \s-1AIX\s0 \fBnm\fR corresponds +-to \fB\-X 32\fR, which is not supported by \s-1GNU\s0 \fBnm\fR. +-.IP "\fB\-\-defined\-only\fR" 4 +-.IX Item "--defined-only" +-Display only defined symbols for each object file. +-.IP "\fB\-\-plugin\fR \fIname\fR" 4 +-.IX Item "--plugin name" +-Load the plugin called \fIname\fR to add support for extra target +-types. This option is only available if the toolchain has been built +-with plugin support enabled. +-.IP "\fB\-\-size\-sort\fR" 4 +-.IX Item "--size-sort" +-Sort symbols by size. The size is computed as the difference between +-the value of the symbol and the value of the symbol with the next higher +-value. If the \f(CW\*(C`bsd\*(C'\fR output format is used the size of the symbol +-is printed, rather than the value, and \fB\-S\fR must be used in order +-both size and value to be printed. +-.IP "\fB\-\-special\-syms\fR" 4 +-.IX Item "--special-syms" +-Display symbols which have a target-specific special meaning. These +-symbols are usually used by the target for some special processing and +-are not normally helpful when included in the normal symbol lists. +-For example for \s-1ARM\s0 targets this option would skip the mapping symbols +-used to mark transitions between \s-1ARM\s0 code, \s-1THUMB\s0 code and data. +-.IP "\fB\-\-synthetic\fR" 4 +-.IX Item "--synthetic" +-Include synthetic symbols in the output. These are special symbols +-created by the linker for various purposes. They are not shown by +-default since they are not part of the binary's original source code. +-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4 +-.IX Item "--target=bfdname" +-Specify an object code format other than your system's default format. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-\&\fIar\fR\|(1), \fIobjdump\fR\|(1), \fIranlib\fR\|(1), and the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/objcopy.1 binutils-2.24/binutils/doc/objcopy.1 +--- binutils-2.24.orig/binutils/doc/objcopy.1 2013-11-18 09:49:31.000000000 +0100 ++++ binutils-2.24/binutils/doc/objcopy.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,1012 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "OBJCOPY 1" +-.TH OBJCOPY 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-objcopy \- copy and translate object files +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-objcopy [\fB\-F\fR \fIbfdname\fR|\fB\-\-target=\fR\fIbfdname\fR] +- [\fB\-I\fR \fIbfdname\fR|\fB\-\-input\-target=\fR\fIbfdname\fR] +- [\fB\-O\fR \fIbfdname\fR|\fB\-\-output\-target=\fR\fIbfdname\fR] +- [\fB\-B\fR \fIbfdarch\fR|\fB\-\-binary\-architecture=\fR\fIbfdarch\fR] +- [\fB\-S\fR|\fB\-\-strip\-all\fR] +- [\fB\-g\fR|\fB\-\-strip\-debug\fR] +- [\fB\-K\fR \fIsymbolname\fR|\fB\-\-keep\-symbol=\fR\fIsymbolname\fR] +- [\fB\-N\fR \fIsymbolname\fR|\fB\-\-strip\-symbol=\fR\fIsymbolname\fR] +- [\fB\-\-strip\-unneeded\-symbol=\fR\fIsymbolname\fR] +- [\fB\-G\fR \fIsymbolname\fR|\fB\-\-keep\-global\-symbol=\fR\fIsymbolname\fR] +- [\fB\-\-localize\-hidden\fR] +- [\fB\-L\fR \fIsymbolname\fR|\fB\-\-localize\-symbol=\fR\fIsymbolname\fR] +- [\fB\-\-globalize\-symbol=\fR\fIsymbolname\fR] +- [\fB\-W\fR \fIsymbolname\fR|\fB\-\-weaken\-symbol=\fR\fIsymbolname\fR] +- [\fB\-w\fR|\fB\-\-wildcard\fR] +- [\fB\-x\fR|\fB\-\-discard\-all\fR] +- [\fB\-X\fR|\fB\-\-discard\-locals\fR] +- [\fB\-b\fR \fIbyte\fR|\fB\-\-byte=\fR\fIbyte\fR] +- [\fB\-i\fR [\fIbreadth\fR]|\fB\-\-interleave\fR[=\fIbreadth\fR]] +- [\fB\-\-interleave\-width=\fR\fIwidth\fR] +- [\fB\-j\fR \fIsectionpattern\fR|\fB\-\-only\-section=\fR\fIsectionpattern\fR] +- [\fB\-R\fR \fIsectionpattern\fR|\fB\-\-remove\-section=\fR\fIsectionpattern\fR] +- [\fB\-p\fR|\fB\-\-preserve\-dates\fR] +- [\fB\-D\fR|\fB\-\-enable\-deterministic\-archives\fR] +- [\fB\-U\fR|\fB\-\-disable\-deterministic\-archives\fR] +- [\fB\-\-debugging\fR] +- [\fB\-\-gap\-fill=\fR\fIval\fR] +- [\fB\-\-pad\-to=\fR\fIaddress\fR] +- [\fB\-\-set\-start=\fR\fIval\fR] +- [\fB\-\-adjust\-start=\fR\fIincr\fR] +- [\fB\-\-change\-addresses=\fR\fIincr\fR] +- [\fB\-\-change\-section\-address\fR \fIsectionpattern\fR{=,+,\-}\fIval\fR] +- [\fB\-\-change\-section\-lma\fR \fIsectionpattern\fR{=,+,\-}\fIval\fR] +- [\fB\-\-change\-section\-vma\fR \fIsectionpattern\fR{=,+,\-}\fIval\fR] +- [\fB\-\-change\-warnings\fR] [\fB\-\-no\-change\-warnings\fR] +- [\fB\-\-set\-section\-flags\fR \fIsectionpattern\fR=\fIflags\fR] +- [\fB\-\-add\-section\fR \fIsectionname\fR=\fIfilename\fR] +- [\fB\-\-rename\-section\fR \fIoldname\fR=\fInewname\fR[,\fIflags\fR]] +- [\fB\-\-long\-section\-names\fR {enable,disable,keep}] +- [\fB\-\-change\-leading\-char\fR] [\fB\-\-remove\-leading\-char\fR] +- [\fB\-\-reverse\-bytes=\fR\fInum\fR] +- [\fB\-\-srec\-len=\fR\fIival\fR] [\fB\-\-srec\-forceS3\fR] +- [\fB\-\-redefine\-sym\fR \fIold\fR=\fInew\fR] +- [\fB\-\-redefine\-syms=\fR\fIfilename\fR] +- [\fB\-\-weaken\fR] +- [\fB\-\-keep\-symbols=\fR\fIfilename\fR] +- [\fB\-\-strip\-symbols=\fR\fIfilename\fR] +- [\fB\-\-strip\-unneeded\-symbols=\fR\fIfilename\fR] +- [\fB\-\-keep\-global\-symbols=\fR\fIfilename\fR] +- [\fB\-\-localize\-symbols=\fR\fIfilename\fR] +- [\fB\-\-globalize\-symbols=\fR\fIfilename\fR] +- [\fB\-\-weaken\-symbols=\fR\fIfilename\fR] +- [\fB\-\-alt\-machine\-code=\fR\fIindex\fR] +- [\fB\-\-prefix\-symbols=\fR\fIstring\fR] +- [\fB\-\-prefix\-sections=\fR\fIstring\fR] +- [\fB\-\-prefix\-alloc\-sections=\fR\fIstring\fR] +- [\fB\-\-add\-gnu\-debuglink=\fR\fIpath-to-file\fR] +- [\fB\-\-keep\-file\-symbols\fR] +- [\fB\-\-only\-keep\-debug\fR] +- [\fB\-\-strip\-dwo\fR] +- [\fB\-\-extract\-dwo\fR] +- [\fB\-\-extract\-symbol\fR] +- [\fB\-\-writable\-text\fR] +- [\fB\-\-readonly\-text\fR] +- [\fB\-\-pure\fR] +- [\fB\-\-impure\fR] +- [\fB\-\-file\-alignment=\fR\fInum\fR] +- [\fB\-\-heap=\fR\fIsize\fR] +- [\fB\-\-image\-base=\fR\fIaddress\fR] +- [\fB\-\-section\-alignment=\fR\fInum\fR] +- [\fB\-\-stack=\fR\fIsize\fR] +- [\fB\-\-subsystem=\fR\fIwhich\fR:\fImajor\fR.\fIminor\fR] +- [\fB\-\-compress\-debug\-sections\fR] +- [\fB\-\-decompress\-debug\-sections\fR] +- [\fB\-\-dwarf\-depth=\fR\fIn\fR] +- [\fB\-\-dwarf\-start=\fR\fIn\fR] +- [\fB\-v\fR|\fB\-\-verbose\fR] +- [\fB\-V\fR|\fB\-\-version\fR] +- [\fB\-\-help\fR] [\fB\-\-info\fR] +- \fIinfile\fR [\fIoutfile\fR] +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-The \s-1GNU\s0 \fBobjcopy\fR utility copies the contents of an object +-file to another. \fBobjcopy\fR uses the \s-1GNU\s0 \s-1BFD\s0 Library to +-read and write the object files. It can write the destination object +-file in a format different from that of the source object file. The +-exact behavior of \fBobjcopy\fR is controlled by command-line options. +-Note that \fBobjcopy\fR should be able to copy a fully linked file +-between any two formats. However, copying a relocatable object file +-between any two formats may not work as expected. +-.PP +-\&\fBobjcopy\fR creates temporary files to do its translations and +-deletes them afterward. \fBobjcopy\fR uses \s-1BFD\s0 to do all its +-translation work; it has access to all the formats described in \s-1BFD\s0 +-and thus is able to recognize most formats without being told +-explicitly. +-.PP +-\&\fBobjcopy\fR can be used to generate S\-records by using an output +-target of \fBsrec\fR (e.g., use \fB\-O srec\fR). +-.PP +-\&\fBobjcopy\fR can be used to generate a raw binary file by using an +-output target of \fBbinary\fR (e.g., use \fB\-O binary\fR). When +-\&\fBobjcopy\fR generates a raw binary file, it will essentially produce +-a memory dump of the contents of the input object file. All symbols and +-relocation information will be discarded. The memory dump will start at +-the load address of the lowest section copied into the output file. +-.PP +-When generating an S\-record or a raw binary file, it may be helpful to +-use \fB\-S\fR to remove sections containing debugging information. In +-some cases \fB\-R\fR will be useful to remove sections which contain +-information that is not needed by the binary file. +-.PP +-Note\-\-\-\fBobjcopy\fR is not able to change the endianness of its input +-files. If the input format has an endianness (some formats do not), +-\&\fBobjcopy\fR can only copy the inputs into file formats that have the +-same endianness or which have no endianness (e.g., \fBsrec\fR). +-(However, see the \fB\-\-reverse\-bytes\fR option.) +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-.IP "\fIinfile\fR" 4 +-.IX Item "infile" +-.PD 0 +-.IP "\fIoutfile\fR" 4 +-.IX Item "outfile" +-.PD +-The input and output files, respectively. +-If you do not specify \fIoutfile\fR, \fBobjcopy\fR creates a +-temporary file and destructively renames the result with +-the name of \fIinfile\fR. +-.IP "\fB\-I\fR \fIbfdname\fR" 4 +-.IX Item "-I bfdname" +-.PD 0 +-.IP "\fB\-\-input\-target=\fR\fIbfdname\fR" 4 +-.IX Item "--input-target=bfdname" +-.PD +-Consider the source file's object format to be \fIbfdname\fR, rather than +-attempting to deduce it. +-.IP "\fB\-O\fR \fIbfdname\fR" 4 +-.IX Item "-O bfdname" +-.PD 0 +-.IP "\fB\-\-output\-target=\fR\fIbfdname\fR" 4 +-.IX Item "--output-target=bfdname" +-.PD +-Write the output file using the object format \fIbfdname\fR. +-.IP "\fB\-F\fR \fIbfdname\fR" 4 +-.IX Item "-F bfdname" +-.PD 0 +-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4 +-.IX Item "--target=bfdname" +-.PD +-Use \fIbfdname\fR as the object format for both the input and the output +-file; i.e., simply transfer data from source to destination with no +-translation. +-.IP "\fB\-B\fR \fIbfdarch\fR" 4 +-.IX Item "-B bfdarch" +-.PD 0 +-.IP "\fB\-\-binary\-architecture=\fR\fIbfdarch\fR" 4 +-.IX Item "--binary-architecture=bfdarch" +-.PD +-Useful when transforming a architecture-less input file into an object file. +-In this case the output architecture can be set to \fIbfdarch\fR. This +-option will be ignored if the input file has a known \fIbfdarch\fR. You +-can access this binary data inside a program by referencing the special +-symbols that are created by the conversion process. These symbols are +-called _binary_\fIobjfile\fR_start, _binary_\fIobjfile\fR_end and +-_binary_\fIobjfile\fR_size. e.g. you can transform a picture file into +-an object file and then access it in your code using these symbols. +-.IP "\fB\-j\fR \fIsectionpattern\fR" 4 +-.IX Item "-j sectionpattern" +-.PD 0 +-.IP "\fB\-\-only\-section=\fR\fIsectionpattern\fR" 4 +-.IX Item "--only-section=sectionpattern" +-.PD +-Copy only the indicated sections from the input file to the output file. +-This option may be given more than once. Note that using this option +-inappropriately may make the output file unusable. Wildcard +-characters are accepted in \fIsectionpattern\fR. +-.IP "\fB\-R\fR \fIsectionpattern\fR" 4 +-.IX Item "-R sectionpattern" +-.PD 0 +-.IP "\fB\-\-remove\-section=\fR\fIsectionpattern\fR" 4 +-.IX Item "--remove-section=sectionpattern" +-.PD +-Remove any section matching \fIsectionpattern\fR from the output file. +-This option may be given more than once. Note that using this option +-inappropriately may make the output file unusable. Wildcard +-characters are accepted in \fIsectionpattern\fR. Using both the +-\&\fB\-j\fR and \fB\-R\fR options together results in undefined +-behaviour. +-.IP "\fB\-S\fR" 4 +-.IX Item "-S" +-.PD 0 +-.IP "\fB\-\-strip\-all\fR" 4 +-.IX Item "--strip-all" +-.PD +-Do not copy relocation and symbol information from the source file. +-.IP "\fB\-g\fR" 4 +-.IX Item "-g" +-.PD 0 +-.IP "\fB\-\-strip\-debug\fR" 4 +-.IX Item "--strip-debug" +-.PD +-Do not copy debugging symbols or sections from the source file. +-.IP "\fB\-\-strip\-unneeded\fR" 4 +-.IX Item "--strip-unneeded" +-Strip all symbols that are not needed for relocation processing. +-.IP "\fB\-K\fR \fIsymbolname\fR" 4 +-.IX Item "-K symbolname" +-.PD 0 +-.IP "\fB\-\-keep\-symbol=\fR\fIsymbolname\fR" 4 +-.IX Item "--keep-symbol=symbolname" +-.PD +-When stripping symbols, keep symbol \fIsymbolname\fR even if it would +-normally be stripped. This option may be given more than once. +-.IP "\fB\-N\fR \fIsymbolname\fR" 4 +-.IX Item "-N symbolname" +-.PD 0 +-.IP "\fB\-\-strip\-symbol=\fR\fIsymbolname\fR" 4 +-.IX Item "--strip-symbol=symbolname" +-.PD +-Do not copy symbol \fIsymbolname\fR from the source file. This option +-may be given more than once. +-.IP "\fB\-\-strip\-unneeded\-symbol=\fR\fIsymbolname\fR" 4 +-.IX Item "--strip-unneeded-symbol=symbolname" +-Do not copy symbol \fIsymbolname\fR from the source file unless it is needed +-by a relocation. This option may be given more than once. +-.IP "\fB\-G\fR \fIsymbolname\fR" 4 +-.IX Item "-G symbolname" +-.PD 0 +-.IP "\fB\-\-keep\-global\-symbol=\fR\fIsymbolname\fR" 4 +-.IX Item "--keep-global-symbol=symbolname" +-.PD +-Keep only symbol \fIsymbolname\fR global. Make all other symbols local +-to the file, so that they are not visible externally. This option may +-be given more than once. +-.IP "\fB\-\-localize\-hidden\fR" 4 +-.IX Item "--localize-hidden" +-In an \s-1ELF\s0 object, mark all symbols that have hidden or internal visibility +-as local. This option applies on top of symbol-specific localization options +-such as \fB\-L\fR. +-.IP "\fB\-L\fR \fIsymbolname\fR" 4 +-.IX Item "-L symbolname" +-.PD 0 +-.IP "\fB\-\-localize\-symbol=\fR\fIsymbolname\fR" 4 +-.IX Item "--localize-symbol=symbolname" +-.PD +-Make symbol \fIsymbolname\fR local to the file, so that it is not +-visible externally. This option may be given more than once. +-.IP "\fB\-W\fR \fIsymbolname\fR" 4 +-.IX Item "-W symbolname" +-.PD 0 +-.IP "\fB\-\-weaken\-symbol=\fR\fIsymbolname\fR" 4 +-.IX Item "--weaken-symbol=symbolname" +-.PD +-Make symbol \fIsymbolname\fR weak. This option may be given more than once. +-.IP "\fB\-\-globalize\-symbol=\fR\fIsymbolname\fR" 4 +-.IX Item "--globalize-symbol=symbolname" +-Give symbol \fIsymbolname\fR global scoping so that it is visible +-outside of the file in which it is defined. This option may be given +-more than once. +-.IP "\fB\-w\fR" 4 +-.IX Item "-w" +-.PD 0 +-.IP "\fB\-\-wildcard\fR" 4 +-.IX Item "--wildcard" +-.PD +-Permit regular expressions in \fIsymbolname\fRs used in other command +-line options. The question mark (?), asterisk (*), backslash (\e) and +-square brackets ([]) operators can be used anywhere in the symbol +-name. If the first character of the symbol name is the exclamation +-point (!) then the sense of the switch is reversed for that symbol. +-For example: +-.Sp +-.Vb 1 +-\& \-w \-W !foo \-W fo* +-.Ve +-.Sp +-would cause objcopy to weaken all symbols that start with \*(L"fo\*(R" +-except for the symbol \*(L"foo\*(R". +-.IP "\fB\-x\fR" 4 +-.IX Item "-x" +-.PD 0 +-.IP "\fB\-\-discard\-all\fR" 4 +-.IX Item "--discard-all" +-.PD +-Do not copy non-global symbols from the source file. +-.IP "\fB\-X\fR" 4 +-.IX Item "-X" +-.PD 0 +-.IP "\fB\-\-discard\-locals\fR" 4 +-.IX Item "--discard-locals" +-.PD +-Do not copy compiler-generated local symbols. +-(These usually start with \fBL\fR or \fB.\fR.) +-.IP "\fB\-b\fR \fIbyte\fR" 4 +-.IX Item "-b byte" +-.PD 0 +-.IP "\fB\-\-byte=\fR\fIbyte\fR" 4 +-.IX Item "--byte=byte" +-.PD +-If interleaving has been enabled via the \fB\-\-interleave\fR option +-then start the range of bytes to keep at the \fIbyte\fRth byte. +-\&\fIbyte\fR can be in the range from 0 to \fIbreadth\fR\-1, where +-\&\fIbreadth\fR is the value given by the \fB\-\-interleave\fR option. +-.IP "\fB\-i [\fR\fIbreadth\fR\fB]\fR" 4 +-.IX Item "-i [breadth]" +-.PD 0 +-.IP "\fB\-\-interleave[=\fR\fIbreadth\fR\fB]\fR" 4 +-.IX Item "--interleave[=breadth]" +-.PD +-Only copy a range out of every \fIbreadth\fR bytes. (Header data is +-not affected). Select which byte in the range begins the copy with +-the \fB\-\-byte\fR option. Select the width of the range with the +-\&\fB\-\-interleave\-width\fR option. +-.Sp +-This option is useful for creating files to program \s-1ROM\s0. It is +-typically used with an \f(CW\*(C`srec\*(C'\fR output target. Note that +-\&\fBobjcopy\fR will complain if you do not specify the +-\&\fB\-\-byte\fR option as well. +-.Sp +-The default interleave breadth is 4, so with \fB\-\-byte\fR set to 0, +-\&\fBobjcopy\fR would copy the first byte out of every four bytes +-from the input to the output. +-.IP "\fB\-\-interleave\-width=\fR\fIwidth\fR" 4 +-.IX Item "--interleave-width=width" +-When used with the \fB\-\-interleave\fR option, copy \fIwidth\fR +-bytes at a time. The start of the range of bytes to be copied is set +-by the \fB\-\-byte\fR option, and the extent of the range is set with +-the \fB\-\-interleave\fR option. +-.Sp +-The default value for this option is 1. The value of \fIwidth\fR plus +-the \fIbyte\fR value set by the \fB\-\-byte\fR option must not exceed +-the interleave breadth set by the \fB\-\-interleave\fR option. +-.Sp +-This option can be used to create images for two 16\-bit flashes interleaved +-in a 32\-bit bus by passing \fB\-b 0 \-i 4 \-\-interleave\-width=2\fR +-and \fB\-b 2 \-i 4 \-\-interleave\-width=2\fR to two \fBobjcopy\fR +-commands. If the input was '12345678' then the outputs would be +-\&'1256' and '3478' respectively. +-.IP "\fB\-p\fR" 4 +-.IX Item "-p" +-.PD 0 +-.IP "\fB\-\-preserve\-dates\fR" 4 +-.IX Item "--preserve-dates" +-.PD +-Set the access and modification dates of the output file to be the same +-as those of the input file. +-.IP "\fB\-D\fR" 4 +-.IX Item "-D" +-.PD 0 +-.IP "\fB\-\-enable\-deterministic\-archives\fR" 4 +-.IX Item "--enable-deterministic-archives" +-.PD +-Operate in \fIdeterministic\fR mode. When copying archive members +-and writing the archive index, use zero for UIDs, GIDs, timestamps, +-and use consistent file modes for all files. +-.Sp +-If \fIbinutils\fR was configured with +-\&\fB\-\-enable\-deterministic\-archives\fR, then this mode is on by default. +-It can be disabled with the \fB\-U\fR option, below. +-.IP "\fB\-U\fR" 4 +-.IX Item "-U" +-.PD 0 +-.IP "\fB\-\-disable\-deterministic\-archives\fR" 4 +-.IX Item "--disable-deterministic-archives" +-.PD +-Do \fInot\fR operate in \fIdeterministic\fR mode. This is the +-inverse of the \fB\-D\fR option, above: when copying archive members +-and writing the archive index, use their actual \s-1UID\s0, \s-1GID\s0, timestamp, +-and file mode values. +-.Sp +-This is the default unless \fIbinutils\fR was configured with +-\&\fB\-\-enable\-deterministic\-archives\fR. +-.IP "\fB\-\-debugging\fR" 4 +-.IX Item "--debugging" +-Convert debugging information, if possible. This is not the default +-because only certain debugging formats are supported, and the +-conversion process can be time consuming. +-.IP "\fB\-\-gap\-fill\fR \fIval\fR" 4 +-.IX Item "--gap-fill val" +-Fill gaps between sections with \fIval\fR. This operation applies to +-the \fIload address\fR (\s-1LMA\s0) of the sections. It is done by increasing +-the size of the section with the lower address, and filling in the extra +-space created with \fIval\fR. +-.IP "\fB\-\-pad\-to\fR \fIaddress\fR" 4 +-.IX Item "--pad-to address" +-Pad the output file up to the load address \fIaddress\fR. This is +-done by increasing the size of the last section. The extra space is +-filled in with the value specified by \fB\-\-gap\-fill\fR (default zero). +-.IP "\fB\-\-set\-start\fR \fIval\fR" 4 +-.IX Item "--set-start val" +-Set the start address of the new file to \fIval\fR. Not all object file +-formats support setting the start address. +-.IP "\fB\-\-change\-start\fR \fIincr\fR" 4 +-.IX Item "--change-start incr" +-.PD 0 +-.IP "\fB\-\-adjust\-start\fR \fIincr\fR" 4 +-.IX Item "--adjust-start incr" +-.PD +-Change the start address by adding \fIincr\fR. Not all object file +-formats support setting the start address. +-.IP "\fB\-\-change\-addresses\fR \fIincr\fR" 4 +-.IX Item "--change-addresses incr" +-.PD 0 +-.IP "\fB\-\-adjust\-vma\fR \fIincr\fR" 4 +-.IX Item "--adjust-vma incr" +-.PD +-Change the \s-1VMA\s0 and \s-1LMA\s0 addresses of all sections, as well as the start +-address, by adding \fIincr\fR. Some object file formats do not permit +-section addresses to be changed arbitrarily. Note that this does not +-relocate the sections; if the program expects sections to be loaded at a +-certain address, and this option is used to change the sections such +-that they are loaded at a different address, the program may fail. +-.IP "\fB\-\-change\-section\-address\fR \fIsectionpattern\fR\fB{=,+,\-}\fR\fIval\fR" 4 +-.IX Item "--change-section-address sectionpattern{=,+,-}val" +-.PD 0 +-.IP "\fB\-\-adjust\-section\-vma\fR \fIsectionpattern\fR\fB{=,+,\-}\fR\fIval\fR" 4 +-.IX Item "--adjust-section-vma sectionpattern{=,+,-}val" +-.PD +-Set or change both the \s-1VMA\s0 address and the \s-1LMA\s0 address of any section +-matching \fIsectionpattern\fR. If \fB=\fR is used, the section +-address is set to \fIval\fR. Otherwise, \fIval\fR is added to or +-subtracted from the section address. See the comments under +-\&\fB\-\-change\-addresses\fR, above. If \fIsectionpattern\fR does not +-match any sections in the input file, a warning will be issued, unless +-\&\fB\-\-no\-change\-warnings\fR is used. +-.IP "\fB\-\-change\-section\-lma\fR \fIsectionpattern\fR\fB{=,+,\-}\fR\fIval\fR" 4 +-.IX Item "--change-section-lma sectionpattern{=,+,-}val" +-Set or change the \s-1LMA\s0 address of any sections matching +-\&\fIsectionpattern\fR. The \s-1LMA\s0 address is the address where the +-section will be loaded into memory at program load time. Normally +-this is the same as the \s-1VMA\s0 address, which is the address of the +-section at program run time, but on some systems, especially those +-where a program is held in \s-1ROM\s0, the two can be different. If \fB=\fR +-is used, the section address is set to \fIval\fR. Otherwise, +-\&\fIval\fR is added to or subtracted from the section address. See the +-comments under \fB\-\-change\-addresses\fR, above. If +-\&\fIsectionpattern\fR does not match any sections in the input file, a +-warning will be issued, unless \fB\-\-no\-change\-warnings\fR is used. +-.IP "\fB\-\-change\-section\-vma\fR \fIsectionpattern\fR\fB{=,+,\-}\fR\fIval\fR" 4 +-.IX Item "--change-section-vma sectionpattern{=,+,-}val" +-Set or change the \s-1VMA\s0 address of any section matching +-\&\fIsectionpattern\fR. The \s-1VMA\s0 address is the address where the +-section will be located once the program has started executing. +-Normally this is the same as the \s-1LMA\s0 address, which is the address +-where the section will be loaded into memory, but on some systems, +-especially those where a program is held in \s-1ROM\s0, the two can be +-different. If \fB=\fR is used, the section address is set to +-\&\fIval\fR. Otherwise, \fIval\fR is added to or subtracted from the +-section address. See the comments under \fB\-\-change\-addresses\fR, +-above. If \fIsectionpattern\fR does not match any sections in the +-input file, a warning will be issued, unless +-\&\fB\-\-no\-change\-warnings\fR is used. +-.IP "\fB\-\-change\-warnings\fR" 4 +-.IX Item "--change-warnings" +-.PD 0 +-.IP "\fB\-\-adjust\-warnings\fR" 4 +-.IX Item "--adjust-warnings" +-.PD +-If \fB\-\-change\-section\-address\fR or \fB\-\-change\-section\-lma\fR or +-\&\fB\-\-change\-section\-vma\fR is used, and the section pattern does not +-match any sections, issue a warning. This is the default. +-.IP "\fB\-\-no\-change\-warnings\fR" 4 +-.IX Item "--no-change-warnings" +-.PD 0 +-.IP "\fB\-\-no\-adjust\-warnings\fR" 4 +-.IX Item "--no-adjust-warnings" +-.PD +-Do not issue a warning if \fB\-\-change\-section\-address\fR or +-\&\fB\-\-adjust\-section\-lma\fR or \fB\-\-adjust\-section\-vma\fR is used, even +-if the section pattern does not match any sections. +-.IP "\fB\-\-set\-section\-flags\fR \fIsectionpattern\fR\fB=\fR\fIflags\fR" 4 +-.IX Item "--set-section-flags sectionpattern=flags" +-Set the flags for any sections matching \fIsectionpattern\fR. The +-\&\fIflags\fR argument is a comma separated string of flag names. The +-recognized names are \fBalloc\fR, \fBcontents\fR, \fBload\fR, +-\&\fBnoload\fR, \fBreadonly\fR, \fBcode\fR, \fBdata\fR, \fBrom\fR, +-\&\fBshare\fR, and \fBdebug\fR. You can set the \fBcontents\fR flag +-for a section which does not have contents, but it is not meaningful +-to clear the \fBcontents\fR flag of a section which does have +-contents\*(--just remove the section instead. Not all flags are +-meaningful for all object file formats. +-.IP "\fB\-\-add\-section\fR \fIsectionname\fR\fB=\fR\fIfilename\fR" 4 +-.IX Item "--add-section sectionname=filename" +-Add a new section named \fIsectionname\fR while copying the file. The +-contents of the new section are taken from the file \fIfilename\fR. The +-size of the section will be the size of the file. This option only +-works on file formats which can support sections with arbitrary names. +-.IP "\fB\-\-rename\-section\fR \fIoldname\fR\fB=\fR\fInewname\fR\fB[,\fR\fIflags\fR\fB]\fR" 4 +-.IX Item "--rename-section oldname=newname[,flags]" +-Rename a section from \fIoldname\fR to \fInewname\fR, optionally +-changing the section's flags to \fIflags\fR in the process. This has +-the advantage over usng a linker script to perform the rename in that +-the output stays as an object file and does not become a linked +-executable. +-.Sp +-This option is particularly helpful when the input format is binary, +-since this will always create a section called .data. If for example, +-you wanted instead to create a section called .rodata containing binary +-data you could use the following command line to achieve it: +-.Sp +-.Vb 3 +-\& objcopy \-I binary \-O \-B \e +-\& \-\-rename\-section .data=.rodata,alloc,load,readonly,data,contents \e +-\& +-.Ve +-.IP "\fB\-\-long\-section\-names {enable,disable,keep}\fR" 4 +-.IX Item "--long-section-names {enable,disable,keep}" +-Controls the handling of long section names when processing \f(CW\*(C`COFF\*(C'\fR +-and \f(CW\*(C`PE\-COFF\*(C'\fR object formats. The default behaviour, \fBkeep\fR, +-is to preserve long section names if any are present in the input file. +-The \fBenable\fR and \fBdisable\fR options forcibly enable or disable +-the use of long section names in the output object; when \fBdisable\fR +-is in effect, any long section names in the input object will be truncated. +-The \fBenable\fR option will only emit long section names if any are +-present in the inputs; this is mostly the same as \fBkeep\fR, but it +-is left undefined whether the \fBenable\fR option might force the +-creation of an empty string table in the output file. +-.IP "\fB\-\-change\-leading\-char\fR" 4 +-.IX Item "--change-leading-char" +-Some object file formats use special characters at the start of +-symbols. The most common such character is underscore, which compilers +-often add before every symbol. This option tells \fBobjcopy\fR to +-change the leading character of every symbol when it converts between +-object file formats. If the object file formats use the same leading +-character, this option has no effect. Otherwise, it will add a +-character, or remove a character, or change a character, as +-appropriate. +-.IP "\fB\-\-remove\-leading\-char\fR" 4 +-.IX Item "--remove-leading-char" +-If the first character of a global symbol is a special symbol leading +-character used by the object file format, remove the character. The +-most common symbol leading character is underscore. This option will +-remove a leading underscore from all global symbols. This can be useful +-if you want to link together objects of different file formats with +-different conventions for symbol names. This is different from +-\&\fB\-\-change\-leading\-char\fR because it always changes the symbol name +-when appropriate, regardless of the object file format of the output +-file. +-.IP "\fB\-\-reverse\-bytes=\fR\fInum\fR" 4 +-.IX Item "--reverse-bytes=num" +-Reverse the bytes in a section with output contents. A section length must +-be evenly divisible by the value given in order for the swap to be able to +-take place. Reversing takes place before the interleaving is performed. +-.Sp +-This option is used typically in generating \s-1ROM\s0 images for problematic +-target systems. For example, on some target boards, the 32\-bit words +-fetched from 8\-bit ROMs are re-assembled in little-endian byte order +-regardless of the \s-1CPU\s0 byte order. Depending on the programming model, the +-endianness of the \s-1ROM\s0 may need to be modified. +-.Sp +-Consider a simple file with a section containing the following eight +-bytes: \f(CW12345678\fR. +-.Sp +-Using \fB\-\-reverse\-bytes=2\fR for the above example, the bytes in the +-output file would be ordered \f(CW21436587\fR. +-.Sp +-Using \fB\-\-reverse\-bytes=4\fR for the above example, the bytes in the +-output file would be ordered \f(CW43218765\fR. +-.Sp +-By using \fB\-\-reverse\-bytes=2\fR for the above example, followed by +-\&\fB\-\-reverse\-bytes=4\fR on the output file, the bytes in the second +-output file would be ordered \f(CW34127856\fR. +-.IP "\fB\-\-srec\-len=\fR\fIival\fR" 4 +-.IX Item "--srec-len=ival" +-Meaningful only for srec output. Set the maximum length of the Srecords +-being produced to \fIival\fR. This length covers both address, data and +-crc fields. +-.IP "\fB\-\-srec\-forceS3\fR" 4 +-.IX Item "--srec-forceS3" +-Meaningful only for srec output. Avoid generation of S1/S2 records, +-creating S3\-only record format. +-.IP "\fB\-\-redefine\-sym\fR \fIold\fR\fB=\fR\fInew\fR" 4 +-.IX Item "--redefine-sym old=new" +-Change the name of a symbol \fIold\fR, to \fInew\fR. This can be useful +-when one is trying link two things together for which you have no +-source, and there are name collisions. +-.IP "\fB\-\-redefine\-syms=\fR\fIfilename\fR" 4 +-.IX Item "--redefine-syms=filename" +-Apply \fB\-\-redefine\-sym\fR to each symbol pair "\fIold\fR \fInew\fR" +-listed in the file \fIfilename\fR. \fIfilename\fR is simply a flat file, +-with one symbol pair per line. Line comments may be introduced by the hash +-character. This option may be given more than once. +-.IP "\fB\-\-weaken\fR" 4 +-.IX Item "--weaken" +-Change all global symbols in the file to be weak. This can be useful +-when building an object which will be linked against other objects using +-the \fB\-R\fR option to the linker. This option is only effective when +-using an object file format which supports weak symbols. +-.IP "\fB\-\-keep\-symbols=\fR\fIfilename\fR" 4 +-.IX Item "--keep-symbols=filename" +-Apply \fB\-\-keep\-symbol\fR option to each symbol listed in the file +-\&\fIfilename\fR. \fIfilename\fR is simply a flat file, with one symbol +-name per line. Line comments may be introduced by the hash character. +-This option may be given more than once. +-.IP "\fB\-\-strip\-symbols=\fR\fIfilename\fR" 4 +-.IX Item "--strip-symbols=filename" +-Apply \fB\-\-strip\-symbol\fR option to each symbol listed in the file +-\&\fIfilename\fR. \fIfilename\fR is simply a flat file, with one symbol +-name per line. Line comments may be introduced by the hash character. +-This option may be given more than once. +-.IP "\fB\-\-strip\-unneeded\-symbols=\fR\fIfilename\fR" 4 +-.IX Item "--strip-unneeded-symbols=filename" +-Apply \fB\-\-strip\-unneeded\-symbol\fR option to each symbol listed in +-the file \fIfilename\fR. \fIfilename\fR is simply a flat file, with one +-symbol name per line. Line comments may be introduced by the hash +-character. This option may be given more than once. +-.IP "\fB\-\-keep\-global\-symbols=\fR\fIfilename\fR" 4 +-.IX Item "--keep-global-symbols=filename" +-Apply \fB\-\-keep\-global\-symbol\fR option to each symbol listed in the +-file \fIfilename\fR. \fIfilename\fR is simply a flat file, with one +-symbol name per line. Line comments may be introduced by the hash +-character. This option may be given more than once. +-.IP "\fB\-\-localize\-symbols=\fR\fIfilename\fR" 4 +-.IX Item "--localize-symbols=filename" +-Apply \fB\-\-localize\-symbol\fR option to each symbol listed in the file +-\&\fIfilename\fR. \fIfilename\fR is simply a flat file, with one symbol +-name per line. Line comments may be introduced by the hash character. +-This option may be given more than once. +-.IP "\fB\-\-globalize\-symbols=\fR\fIfilename\fR" 4 +-.IX Item "--globalize-symbols=filename" +-Apply \fB\-\-globalize\-symbol\fR option to each symbol listed in the file +-\&\fIfilename\fR. \fIfilename\fR is simply a flat file, with one symbol +-name per line. Line comments may be introduced by the hash character. +-This option may be given more than once. +-.IP "\fB\-\-weaken\-symbols=\fR\fIfilename\fR" 4 +-.IX Item "--weaken-symbols=filename" +-Apply \fB\-\-weaken\-symbol\fR option to each symbol listed in the file +-\&\fIfilename\fR. \fIfilename\fR is simply a flat file, with one symbol +-name per line. Line comments may be introduced by the hash character. +-This option may be given more than once. +-.IP "\fB\-\-alt\-machine\-code=\fR\fIindex\fR" 4 +-.IX Item "--alt-machine-code=index" +-If the output architecture has alternate machine codes, use the +-\&\fIindex\fRth code instead of the default one. This is useful in case +-a machine is assigned an official code and the tool-chain adopts the +-new code, but other applications still depend on the original code +-being used. For \s-1ELF\s0 based architectures if the \fIindex\fR +-alternative does not exist then the value is treated as an absolute +-number to be stored in the e_machine field of the \s-1ELF\s0 header. +-.IP "\fB\-\-writable\-text\fR" 4 +-.IX Item "--writable-text" +-Mark the output text as writable. This option isn't meaningful for all +-object file formats. +-.IP "\fB\-\-readonly\-text\fR" 4 +-.IX Item "--readonly-text" +-Make the output text write protected. This option isn't meaningful for all +-object file formats. +-.IP "\fB\-\-pure\fR" 4 +-.IX Item "--pure" +-Mark the output file as demand paged. This option isn't meaningful for all +-object file formats. +-.IP "\fB\-\-impure\fR" 4 +-.IX Item "--impure" +-Mark the output file as impure. This option isn't meaningful for all +-object file formats. +-.IP "\fB\-\-prefix\-symbols=\fR\fIstring\fR" 4 +-.IX Item "--prefix-symbols=string" +-Prefix all symbols in the output file with \fIstring\fR. +-.IP "\fB\-\-prefix\-sections=\fR\fIstring\fR" 4 +-.IX Item "--prefix-sections=string" +-Prefix all section names in the output file with \fIstring\fR. +-.IP "\fB\-\-prefix\-alloc\-sections=\fR\fIstring\fR" 4 +-.IX Item "--prefix-alloc-sections=string" +-Prefix all the names of all allocated sections in the output file with +-\&\fIstring\fR. +-.IP "\fB\-\-add\-gnu\-debuglink=\fR\fIpath-to-file\fR" 4 +-.IX Item "--add-gnu-debuglink=path-to-file" +-Creates a .gnu_debuglink section which contains a reference to \fIpath-to-file\fR +-and adds it to the output file. +-.IP "\fB\-\-keep\-file\-symbols\fR" 4 +-.IX Item "--keep-file-symbols" +-When stripping a file, perhaps with \fB\-\-strip\-debug\fR or +-\&\fB\-\-strip\-unneeded\fR, retain any symbols specifying source file names, +-which would otherwise get stripped. +-.IP "\fB\-\-only\-keep\-debug\fR" 4 +-.IX Item "--only-keep-debug" +-Strip a file, removing contents of any sections that would not be +-stripped by \fB\-\-strip\-debug\fR and leaving the debugging sections +-intact. In \s-1ELF\s0 files, this preserves all note sections in the output. +-.Sp +-The intention is that this option will be used in conjunction with +-\&\fB\-\-add\-gnu\-debuglink\fR to create a two part executable. One a +-stripped binary which will occupy less space in \s-1RAM\s0 and in a +-distribution and the second a debugging information file which is only +-needed if debugging abilities are required. The suggested procedure +-to create these files is as follows: +-.RS 4 +-.IP "1." 4 +-.IX Item "1." +-\&\f(CW\*(C`foo\*(C'\fR then... +-.ie n .IP "1." 4 +-.el .IP "1." 4 +-.IX Item "1." +-create a file containing the debugging info. +-.ie n .IP "1." 4 +-.el .IP "1." 4 +-.IX Item "1." +-stripped executable. +-.ie n .IP "1." 4 +-.el .IP "1." 4 +-.IX Item "1." +-to add a link to the debugging info into the stripped executable. +-.RE +-.RS 4 +-.Sp +-Note\-\-\-the choice of \f(CW\*(C`.dbg\*(C'\fR as an extension for the debug info +-file is arbitrary. Also the \f(CW\*(C`\-\-only\-keep\-debug\*(C'\fR step is +-optional. You could instead do this: +-.IP "1." 4 +-.IX Item "1." +-.PD 0 +-.ie n .IP "1." 4 +-.el .IP "1." 4 +-.IX Item "1." +-.ie n .IP "1." 4 +-.el .IP "1." 4 +-.IX Item "1." +-.ie n .IP "1." 4 +-.el .IP "1." 4 +-.IX Item "1." +-.RE +-.RS 4 +-.PD +-.Sp +-i.e., the file pointed to by the \fB\-\-add\-gnu\-debuglink\fR can be the +-full executable. It does not have to be a file created by the +-\&\fB\-\-only\-keep\-debug\fR switch. +-.Sp +-Note\-\-\-this switch is only intended for use on fully linked files. It +-does not make sense to use it on object files where the debugging +-information may be incomplete. Besides the gnu_debuglink feature +-currently only supports the presence of one filename containing +-debugging information, not multiple filenames on a one-per-object-file +-basis. +-.RE +-.IP "\fB\-\-strip\-dwo\fR" 4 +-.IX Item "--strip-dwo" +-Remove the contents of all \s-1DWARF\s0 .dwo sections, leaving the +-remaining debugging sections and all symbols intact. +-This option is intended for use by the compiler as part of +-the \fB\-gsplit\-dwarf\fR option, which splits debug information +-between the .o file and a separate .dwo file. The compiler +-generates all debug information in the same file, then uses +-the \fB\-\-extract\-dwo\fR option to copy the .dwo sections to +-the .dwo file, then the \fB\-\-strip\-dwo\fR option to remove +-those sections from the original .o file. +-.IP "\fB\-\-extract\-dwo\fR" 4 +-.IX Item "--extract-dwo" +-Extract the contents of all \s-1DWARF\s0 .dwo sections. See the +-\&\fB\-\-strip\-dwo\fR option for more information. +-.IP "\fB\-\-file\-alignment\fR \fInum\fR" 4 +-.IX Item "--file-alignment num" +-Specify the file alignment. Sections in the file will always begin at +-file offsets which are multiples of this number. This defaults to +-512. +-[This option is specific to \s-1PE\s0 targets.] +-.IP "\fB\-\-heap\fR \fIreserve\fR" 4 +-.IX Item "--heap reserve" +-.PD 0 +-.IP "\fB\-\-heap\fR \fIreserve\fR\fB,\fR\fIcommit\fR" 4 +-.IX Item "--heap reserve,commit" +-.PD +-Specify the number of bytes of memory to reserve (and optionally commit) +-to be used as heap for this program. +-[This option is specific to \s-1PE\s0 targets.] +-.IP "\fB\-\-image\-base\fR \fIvalue\fR" 4 +-.IX Item "--image-base value" +-Use \fIvalue\fR as the base address of your program or dll. This is +-the lowest memory location that will be used when your program or dll +-is loaded. To reduce the need to relocate and improve performance of +-your dlls, each should have a unique base address and not overlap any +-other dlls. The default is 0x400000 for executables, and 0x10000000 +-for dlls. +-[This option is specific to \s-1PE\s0 targets.] +-.IP "\fB\-\-section\-alignment\fR \fInum\fR" 4 +-.IX Item "--section-alignment num" +-Sets the section alignment. Sections in memory will always begin at +-addresses which are a multiple of this number. Defaults to 0x1000. +-[This option is specific to \s-1PE\s0 targets.] +-.IP "\fB\-\-stack\fR \fIreserve\fR" 4 +-.IX Item "--stack reserve" +-.PD 0 +-.IP "\fB\-\-stack\fR \fIreserve\fR\fB,\fR\fIcommit\fR" 4 +-.IX Item "--stack reserve,commit" +-.PD +-Specify the number of bytes of memory to reserve (and optionally commit) +-to be used as stack for this program. +-[This option is specific to \s-1PE\s0 targets.] +-.IP "\fB\-\-subsystem\fR \fIwhich\fR" 4 +-.IX Item "--subsystem which" +-.PD 0 +-.IP "\fB\-\-subsystem\fR \fIwhich\fR\fB:\fR\fImajor\fR" 4 +-.IX Item "--subsystem which:major" +-.IP "\fB\-\-subsystem\fR \fIwhich\fR\fB:\fR\fImajor\fR\fB.\fR\fIminor\fR" 4 +-.IX Item "--subsystem which:major.minor" +-.PD +-Specifies the subsystem under which your program will execute. The +-legal values for \fIwhich\fR are \f(CW\*(C`native\*(C'\fR, \f(CW\*(C`windows\*(C'\fR, +-\&\f(CW\*(C`console\*(C'\fR, \f(CW\*(C`posix\*(C'\fR, \f(CW\*(C`efi\-app\*(C'\fR, \f(CW\*(C`efi\-bsd\*(C'\fR, +-\&\f(CW\*(C`efi\-rtd\*(C'\fR, \f(CW\*(C`sal\-rtd\*(C'\fR, and \f(CW\*(C`xbox\*(C'\fR. You may optionally set +-the subsystem version also. Numeric values are also accepted for +-\&\fIwhich\fR. +-[This option is specific to \s-1PE\s0 targets.] +-.IP "\fB\-\-extract\-symbol\fR" 4 +-.IX Item "--extract-symbol" +-Keep the file's section flags and symbols but remove all section data. +-Specifically, the option: +-.RS 4 +-.IP "*" 4 +-.IX Item "*" +-.PD 0 +-.IP "*" 4 +-.IX Item "*" +-.IP "*" 4 +-.IX Item "*" +-.RE +-.RS 4 +-.PD +-.Sp +-This option is used to build a \fI.sym\fR file for a VxWorks kernel. +-It can also be a useful way of reducing the size of a \fB\-\-just\-symbols\fR +-linker input file. +-.RE +-.IP "\fB\-\-compress\-debug\-sections\fR" 4 +-.IX Item "--compress-debug-sections" +-Compress \s-1DWARF\s0 debug sections using zlib. +-.IP "\fB\-\-decompress\-debug\-sections\fR" 4 +-.IX Item "--decompress-debug-sections" +-Decompress \s-1DWARF\s0 debug sections using zlib. +-.IP "\fB\-V\fR" 4 +-.IX Item "-V" +-.PD 0 +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-.PD +-Show the version number of \fBobjcopy\fR. +-.IP "\fB\-v\fR" 4 +-.IX Item "-v" +-.PD 0 +-.IP "\fB\-\-verbose\fR" 4 +-.IX Item "--verbose" +-.PD +-Verbose output: list all object files modified. In the case of +-archives, \fBobjcopy \-V\fR lists all members of the archive. +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-Show a summary of the options to \fBobjcopy\fR. +-.IP "\fB\-\-info\fR" 4 +-.IX Item "--info" +-Display a list showing all architectures and object formats available. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-\&\fIld\fR\|(1), \fIobjdump\fR\|(1), and the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/objdump.1 binutils-2.24/binutils/doc/objdump.1 +--- binutils-2.24.orig/binutils/doc/objdump.1 2013-11-18 09:49:31.000000000 +0100 ++++ binutils-2.24/binutils/doc/objdump.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,842 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "OBJDUMP 1" +-.TH OBJDUMP 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-objdump \- display information from object files. +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-objdump [\fB\-a\fR|\fB\-\-archive\-headers\fR] +- [\fB\-b\fR \fIbfdname\fR|\fB\-\-target=\fR\fIbfdname\fR] +- [\fB\-C\fR|\fB\-\-demangle\fR[=\fIstyle\fR] ] +- [\fB\-d\fR|\fB\-\-disassemble\fR] +- [\fB\-D\fR|\fB\-\-disassemble\-all\fR] +- [\fB\-z\fR|\fB\-\-disassemble\-zeroes\fR] +- [\fB\-EB\fR|\fB\-EL\fR|\fB\-\-endian=\fR{big | little }] +- [\fB\-f\fR|\fB\-\-file\-headers\fR] +- [\fB\-F\fR|\fB\-\-file\-offsets\fR] +- [\fB\-\-file\-start\-context\fR] +- [\fB\-g\fR|\fB\-\-debugging\fR] +- [\fB\-e\fR|\fB\-\-debugging\-tags\fR] +- [\fB\-h\fR|\fB\-\-section\-headers\fR|\fB\-\-headers\fR] +- [\fB\-i\fR|\fB\-\-info\fR] +- [\fB\-j\fR \fIsection\fR|\fB\-\-section=\fR\fIsection\fR] +- [\fB\-l\fR|\fB\-\-line\-numbers\fR] +- [\fB\-S\fR|\fB\-\-source\fR] +- [\fB\-m\fR \fImachine\fR|\fB\-\-architecture=\fR\fImachine\fR] +- [\fB\-M\fR \fIoptions\fR|\fB\-\-disassembler\-options=\fR\fIoptions\fR] +- [\fB\-p\fR|\fB\-\-private\-headers\fR] +- [\fB\-P\fR \fIoptions\fR|\fB\-\-private=\fR\fIoptions\fR] +- [\fB\-r\fR|\fB\-\-reloc\fR] +- [\fB\-R\fR|\fB\-\-dynamic\-reloc\fR] +- [\fB\-s\fR|\fB\-\-full\-contents\fR] +- [\fB\-W[lLiaprmfFsoRt]\fR| +- \fB\-\-dwarf\fR[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames\-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]] +- [\fB\-G\fR|\fB\-\-stabs\fR] +- [\fB\-t\fR|\fB\-\-syms\fR] +- [\fB\-T\fR|\fB\-\-dynamic\-syms\fR] +- [\fB\-x\fR|\fB\-\-all\-headers\fR] +- [\fB\-w\fR|\fB\-\-wide\fR] +- [\fB\-\-start\-address=\fR\fIaddress\fR] +- [\fB\-\-stop\-address=\fR\fIaddress\fR] +- [\fB\-\-prefix\-addresses\fR] +- [\fB\-\-[no\-]show\-raw\-insn\fR] +- [\fB\-\-adjust\-vma=\fR\fIoffset\fR] +- [\fB\-\-special\-syms\fR] +- [\fB\-\-prefix=\fR\fIprefix\fR] +- [\fB\-\-prefix\-strip=\fR\fIlevel\fR] +- [\fB\-\-insn\-width=\fR\fIwidth\fR] +- [\fB\-V\fR|\fB\-\-version\fR] +- [\fB\-H\fR|\fB\-\-help\fR] +- \fIobjfile\fR... +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-\&\fBobjdump\fR displays information about one or more object files. +-The options control what particular information to display. This +-information is mostly useful to programmers who are working on the +-compilation tools, as opposed to programmers who just want their +-program to compile and work. +-.PP +-\&\fIobjfile\fR... are the object files to be examined. When you +-specify archives, \fBobjdump\fR shows information on each of the member +-object files. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-The long and short forms of options, shown here as alternatives, are +-equivalent. At least one option from the list +-\&\fB\-a,\-d,\-D,\-e,\-f,\-g,\-G,\-h,\-H,\-p,\-P,\-r,\-R,\-s,\-S,\-t,\-T,\-V,\-x\fR must be given. +-.IP "\fB\-a\fR" 4 +-.IX Item "-a" +-.PD 0 +-.IP "\fB\-\-archive\-header\fR" 4 +-.IX Item "--archive-header" +-.PD +-If any of the \fIobjfile\fR files are archives, display the archive +-header information (in a format similar to \fBls \-l\fR). Besides the +-information you could list with \fBar tv\fR, \fBobjdump \-a\fR shows +-the object file format of each archive member. +-.IP "\fB\-\-adjust\-vma=\fR\fIoffset\fR" 4 +-.IX Item "--adjust-vma=offset" +-When dumping information, first add \fIoffset\fR to all the section +-addresses. This is useful if the section addresses do not correspond to +-the symbol table, which can happen when putting sections at particular +-addresses when using a format which can not represent section addresses, +-such as a.out. +-.IP "\fB\-b\fR \fIbfdname\fR" 4 +-.IX Item "-b bfdname" +-.PD 0 +-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4 +-.IX Item "--target=bfdname" +-.PD +-Specify that the object-code format for the object files is +-\&\fIbfdname\fR. This option may not be necessary; \fIobjdump\fR can +-automatically recognize many formats. +-.Sp +-For example, +-.Sp +-.Vb 1 +-\& objdump \-b oasys \-m vax \-h fu.o +-.Ve +-.Sp +-displays summary information from the section headers (\fB\-h\fR) of +-\&\fIfu.o\fR, which is explicitly identified (\fB\-m\fR) as a \s-1VAX\s0 object +-file in the format produced by Oasys compilers. You can list the +-formats available with the \fB\-i\fR option. +-.IP "\fB\-C\fR" 4 +-.IX Item "-C" +-.PD 0 +-.IP "\fB\-\-demangle[=\fR\fIstyle\fR\fB]\fR" 4 +-.IX Item "--demangle[=style]" +-.PD +-Decode (\fIdemangle\fR) low-level symbol names into user-level names. +-Besides removing any initial underscore prepended by the system, this +-makes \*(C+ function names readable. Different compilers have different +-mangling styles. The optional demangling style argument can be used to +-choose an appropriate demangling style for your compiler. +-.IP "\fB\-g\fR" 4 +-.IX Item "-g" +-.PD 0 +-.IP "\fB\-\-debugging\fR" 4 +-.IX Item "--debugging" +-.PD +-Display debugging information. This attempts to parse \s-1STABS\s0 and \s-1IEEE\s0 +-debugging format information stored in the file and print it out using +-a C like syntax. If neither of these formats are found this option +-falls back on the \fB\-W\fR option to print any \s-1DWARF\s0 information in +-the file. +-.IP "\fB\-e\fR" 4 +-.IX Item "-e" +-.PD 0 +-.IP "\fB\-\-debugging\-tags\fR" 4 +-.IX Item "--debugging-tags" +-.PD +-Like \fB\-g\fR, but the information is generated in a format compatible +-with ctags tool. +-.IP "\fB\-d\fR" 4 +-.IX Item "-d" +-.PD 0 +-.IP "\fB\-\-disassemble\fR" 4 +-.IX Item "--disassemble" +-.PD +-Display the assembler mnemonics for the machine instructions from +-\&\fIobjfile\fR. This option only disassembles those sections which are +-expected to contain instructions. +-.IP "\fB\-D\fR" 4 +-.IX Item "-D" +-.PD 0 +-.IP "\fB\-\-disassemble\-all\fR" 4 +-.IX Item "--disassemble-all" +-.PD +-Like \fB\-d\fR, but disassemble the contents of all sections, not just +-those expected to contain instructions. +-.Sp +-If the target is an \s-1ARM\s0 architecture this switch also has the effect +-of forcing the disassembler to decode pieces of data found in code +-sections as if they were instructions. +-.IP "\fB\-\-prefix\-addresses\fR" 4 +-.IX Item "--prefix-addresses" +-When disassembling, print the complete address on each line. This is +-the older disassembly format. +-.IP "\fB\-EB\fR" 4 +-.IX Item "-EB" +-.PD 0 +-.IP "\fB\-EL\fR" 4 +-.IX Item "-EL" +-.IP "\fB\-\-endian={big|little}\fR" 4 +-.IX Item "--endian={big|little}" +-.PD +-Specify the endianness of the object files. This only affects +-disassembly. This can be useful when disassembling a file format which +-does not describe endianness information, such as S\-records. +-.IP "\fB\-f\fR" 4 +-.IX Item "-f" +-.PD 0 +-.IP "\fB\-\-file\-headers\fR" 4 +-.IX Item "--file-headers" +-.PD +-Display summary information from the overall header of +-each of the \fIobjfile\fR files. +-.IP "\fB\-F\fR" 4 +-.IX Item "-F" +-.PD 0 +-.IP "\fB\-\-file\-offsets\fR" 4 +-.IX Item "--file-offsets" +-.PD +-When disassembling sections, whenever a symbol is displayed, also +-display the file offset of the region of data that is about to be +-dumped. If zeroes are being skipped, then when disassembly resumes, +-tell the user how many zeroes were skipped and the file offset of the +-location from where the disassembly resumes. When dumping sections, +-display the file offset of the location from where the dump starts. +-.IP "\fB\-\-file\-start\-context\fR" 4 +-.IX Item "--file-start-context" +-Specify that when displaying interlisted source code/disassembly +-(assumes \fB\-S\fR) from a file that has not yet been displayed, extend the +-context to the start of the file. +-.IP "\fB\-h\fR" 4 +-.IX Item "-h" +-.PD 0 +-.IP "\fB\-\-section\-headers\fR" 4 +-.IX Item "--section-headers" +-.IP "\fB\-\-headers\fR" 4 +-.IX Item "--headers" +-.PD +-Display summary information from the section headers of the +-object file. +-.Sp +-File segments may be relocated to nonstandard addresses, for example by +-using the \fB\-Ttext\fR, \fB\-Tdata\fR, or \fB\-Tbss\fR options to +-\&\fBld\fR. However, some object file formats, such as a.out, do not +-store the starting address of the file segments. In those situations, +-although \fBld\fR relocates the sections correctly, using \fBobjdump +-\&\-h\fR to list the file section headers cannot show the correct addresses. +-Instead, it shows the usual addresses, which are implicit for the +-target. +-.IP "\fB\-H\fR" 4 +-.IX Item "-H" +-.PD 0 +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-.PD +-Print a summary of the options to \fBobjdump\fR and exit. +-.IP "\fB\-i\fR" 4 +-.IX Item "-i" +-.PD 0 +-.IP "\fB\-\-info\fR" 4 +-.IX Item "--info" +-.PD +-Display a list showing all architectures and object formats available +-for specification with \fB\-b\fR or \fB\-m\fR. +-.IP "\fB\-j\fR \fIname\fR" 4 +-.IX Item "-j name" +-.PD 0 +-.IP "\fB\-\-section=\fR\fIname\fR" 4 +-.IX Item "--section=name" +-.PD +-Display information only for section \fIname\fR. +-.IP "\fB\-l\fR" 4 +-.IX Item "-l" +-.PD 0 +-.IP "\fB\-\-line\-numbers\fR" 4 +-.IX Item "--line-numbers" +-.PD +-Label the display (using debugging information) with the filename and +-source line numbers corresponding to the object code or relocs shown. +-Only useful with \fB\-d\fR, \fB\-D\fR, or \fB\-r\fR. +-.IP "\fB\-m\fR \fImachine\fR" 4 +-.IX Item "-m machine" +-.PD 0 +-.IP "\fB\-\-architecture=\fR\fImachine\fR" 4 +-.IX Item "--architecture=machine" +-.PD +-Specify the architecture to use when disassembling object files. This +-can be useful when disassembling object files which do not describe +-architecture information, such as S\-records. You can list the available +-architectures with the \fB\-i\fR option. +-.Sp +-If the target is an \s-1ARM\s0 architecture then this switch has an +-additional effect. It restricts the disassembly to only those +-instructions supported by the architecture specified by \fImachine\fR. +-If it is necessary to use this switch because the input file does not +-contain any architecture information, but it is also desired to +-disassemble all the instructions use \fB\-marm\fR. +-.IP "\fB\-M\fR \fIoptions\fR" 4 +-.IX Item "-M options" +-.PD 0 +-.IP "\fB\-\-disassembler\-options=\fR\fIoptions\fR" 4 +-.IX Item "--disassembler-options=options" +-.PD +-Pass target specific information to the disassembler. Only supported on +-some targets. If it is necessary to specify more than one +-disassembler option then multiple \fB\-M\fR options can be used or +-can be placed together into a comma separated list. +-.Sp +-If the target is an \s-1ARM\s0 architecture then this switch can be used to +-select which register name set is used during disassembler. Specifying +-\&\fB\-M reg-names-std\fR (the default) will select the register names as +-used in \s-1ARM\s0's instruction set documentation, but with register 13 called +-\&'sp', register 14 called 'lr' and register 15 called 'pc'. Specifying +-\&\fB\-M reg-names-apcs\fR will select the name set used by the \s-1ARM\s0 +-Procedure Call Standard, whilst specifying \fB\-M reg-names-raw\fR will +-just use \fBr\fR followed by the register number. +-.Sp +-There are also two variants on the \s-1APCS\s0 register naming scheme enabled +-by \fB\-M reg-names-atpcs\fR and \fB\-M reg-names-special-atpcs\fR which +-use the ARM/Thumb Procedure Call Standard naming conventions. (Either +-with the normal register names or the special register names). +-.Sp +-This option can also be used for \s-1ARM\s0 architectures to force the +-disassembler to interpret all instructions as Thumb instructions by +-using the switch \fB\-\-disassembler\-options=force\-thumb\fR. This can be +-useful when attempting to disassemble thumb code produced by other +-compilers. +-.Sp +-For the x86, some of the options duplicate functions of the \fB\-m\fR +-switch, but allow finer grained control. Multiple selections from the +-following may be specified as a comma separated string. +-\&\fBx86\-64\fR, \fBi386\fR and \fBi8086\fR select disassembly for +-the given architecture. \fBintel\fR and \fBatt\fR select between +-intel syntax mode and \s-1AT&T\s0 syntax mode. +-\&\fBintel-mnemonic\fR and \fBatt-mnemonic\fR select between +-intel mnemonic mode and \s-1AT&T\s0 mnemonic mode. \fBintel-mnemonic\fR +-implies \fBintel\fR and \fBatt-mnemonic\fR implies \fBatt\fR. +-\&\fBaddr64\fR, \fBaddr32\fR, +-\&\fBaddr16\fR, \fBdata32\fR and \fBdata16\fR specify the default +-address size and operand size. These four options will be overridden if +-\&\fBx86\-64\fR, \fBi386\fR or \fBi8086\fR appear later in the +-option string. Lastly, \fBsuffix\fR, when in \s-1AT&T\s0 mode, +-instructs the disassembler to print a mnemonic suffix even when the +-suffix could be inferred by the operands. +-.Sp +-For PowerPC, \fBbooke\fR controls the disassembly of BookE +-instructions. \fB32\fR and \fB64\fR select PowerPC and +-PowerPC64 disassembly, respectively. \fBe300\fR selects +-disassembly for the e300 family. \fB440\fR selects disassembly for +-the PowerPC 440. \fBppcps\fR selects disassembly for the paired +-single instructions of the \s-1PPC750CL\s0. +-.Sp +-For \s-1MIPS\s0, this option controls the printing of instruction mnemonic +-names and register names in disassembled instructions. Multiple +-selections from the following may be specified as a comma separated +-string, and invalid options are ignored: +-.RS 4 +-.ie n .IP """no\-aliases""" 4 +-.el .IP "\f(CWno\-aliases\fR" 4 +-.IX Item "no-aliases" +-Print the 'raw' instruction mnemonic instead of some pseudo +-instruction mnemonic. I.e., print 'daddu' or 'or' instead of 'move', +-\&'sll' instead of 'nop', etc. +-.ie n .IP """virt""" 4 +-.el .IP "\f(CWvirt\fR" 4 +-.IX Item "virt" +-Disassemble the virtualization \s-1ASE\s0 instructions. +-.ie n .IP """gpr\-names=\f(CIABI\f(CW""" 4 +-.el .IP "\f(CWgpr\-names=\f(CIABI\f(CW\fR" 4 +-.IX Item "gpr-names=ABI" +-Print \s-1GPR\s0 (general-purpose register) names as appropriate +-for the specified \s-1ABI\s0. By default, \s-1GPR\s0 names are selected according to +-the \s-1ABI\s0 of the binary being disassembled. +-.ie n .IP """fpr\-names=\f(CIABI\f(CW""" 4 +-.el .IP "\f(CWfpr\-names=\f(CIABI\f(CW\fR" 4 +-.IX Item "fpr-names=ABI" +-Print \s-1FPR\s0 (floating-point register) names as +-appropriate for the specified \s-1ABI\s0. By default, \s-1FPR\s0 numbers are printed +-rather than names. +-.ie n .IP """cp0\-names=\f(CIARCH\f(CW""" 4 +-.el .IP "\f(CWcp0\-names=\f(CIARCH\f(CW\fR" 4 +-.IX Item "cp0-names=ARCH" +-Print \s-1CP0\s0 (system control coprocessor; coprocessor 0) register names +-as appropriate for the \s-1CPU\s0 or architecture specified by +-\&\fI\s-1ARCH\s0\fR. By default, \s-1CP0\s0 register names are selected according to +-the architecture and \s-1CPU\s0 of the binary being disassembled. +-.ie n .IP """hwr\-names=\f(CIARCH\f(CW""" 4 +-.el .IP "\f(CWhwr\-names=\f(CIARCH\f(CW\fR" 4 +-.IX Item "hwr-names=ARCH" +-Print \s-1HWR\s0 (hardware register, used by the \f(CW\*(C`rdhwr\*(C'\fR instruction) names +-as appropriate for the \s-1CPU\s0 or architecture specified by +-\&\fI\s-1ARCH\s0\fR. By default, \s-1HWR\s0 names are selected according to +-the architecture and \s-1CPU\s0 of the binary being disassembled. +-.ie n .IP """reg\-names=\f(CIABI\f(CW""" 4 +-.el .IP "\f(CWreg\-names=\f(CIABI\f(CW\fR" 4 +-.IX Item "reg-names=ABI" +-Print \s-1GPR\s0 and \s-1FPR\s0 names as appropriate for the selected \s-1ABI\s0. +-.ie n .IP """reg\-names=\f(CIARCH\f(CW""" 4 +-.el .IP "\f(CWreg\-names=\f(CIARCH\f(CW\fR" 4 +-.IX Item "reg-names=ARCH" +-Print CPU-specific register names (\s-1CP0\s0 register and \s-1HWR\s0 names) +-as appropriate for the selected \s-1CPU\s0 or architecture. +-.RE +-.RS 4 +-.Sp +-For any of the options listed above, \fI\s-1ABI\s0\fR or +-\&\fI\s-1ARCH\s0\fR may be specified as \fBnumeric\fR to have numbers printed +-rather than names, for the selected types of registers. +-You can list the available values of \fI\s-1ABI\s0\fR and \fI\s-1ARCH\s0\fR using +-the \fB\-\-help\fR option. +-.Sp +-For \s-1VAX\s0, you can specify function entry addresses with \fB\-M +-entry:0xf00ba\fR. You can use this multiple times to properly +-disassemble \s-1VAX\s0 binary files that don't contain symbol tables (like +-\&\s-1ROM\s0 dumps). In these cases, the function entry mask would otherwise +-be decoded as \s-1VAX\s0 instructions, which would probably lead the rest +-of the function being wrongly disassembled. +-.RE +-.IP "\fB\-p\fR" 4 +-.IX Item "-p" +-.PD 0 +-.IP "\fB\-\-private\-headers\fR" 4 +-.IX Item "--private-headers" +-.PD +-Print information that is specific to the object file format. The exact +-information printed depends upon the object file format. For some +-object file formats, no additional information is printed. +-.IP "\fB\-P\fR \fIoptions\fR" 4 +-.IX Item "-P options" +-.PD 0 +-.IP "\fB\-\-private=\fR\fIoptions\fR" 4 +-.IX Item "--private=options" +-.PD +-Print information that is specific to the object file format. The +-argument \fIoptions\fR is a comma separated list that depends on the +-format (the lists of options is displayed with the help). +-.Sp +-For \s-1XCOFF\s0, the available options are: \fBheader\fR, \fBaout\fR, +-\&\fBsections\fR, \fBsyms\fR, \fBrelocs\fR, \fBlineno\fR, +-\&\fBloader\fR, \fBexcept\fR, \fBtypchk\fR, \fBtraceback\fR, +-\&\fBtoc\fR and \fBldinfo\fR. +-.IP "\fB\-r\fR" 4 +-.IX Item "-r" +-.PD 0 +-.IP "\fB\-\-reloc\fR" 4 +-.IX Item "--reloc" +-.PD +-Print the relocation entries of the file. If used with \fB\-d\fR or +-\&\fB\-D\fR, the relocations are printed interspersed with the +-disassembly. +-.IP "\fB\-R\fR" 4 +-.IX Item "-R" +-.PD 0 +-.IP "\fB\-\-dynamic\-reloc\fR" 4 +-.IX Item "--dynamic-reloc" +-.PD +-Print the dynamic relocation entries of the file. This is only +-meaningful for dynamic objects, such as certain types of shared +-libraries. As for \fB\-r\fR, if used with \fB\-d\fR or +-\&\fB\-D\fR, the relocations are printed interspersed with the +-disassembly. +-.IP "\fB\-s\fR" 4 +-.IX Item "-s" +-.PD 0 +-.IP "\fB\-\-full\-contents\fR" 4 +-.IX Item "--full-contents" +-.PD +-Display the full contents of any sections requested. By default all +-non-empty sections are displayed. +-.IP "\fB\-S\fR" 4 +-.IX Item "-S" +-.PD 0 +-.IP "\fB\-\-source\fR" 4 +-.IX Item "--source" +-.PD +-Display source code intermixed with disassembly, if possible. Implies +-\&\fB\-d\fR. +-.IP "\fB\-\-prefix=\fR\fIprefix\fR" 4 +-.IX Item "--prefix=prefix" +-Specify \fIprefix\fR to add to the absolute paths when used with +-\&\fB\-S\fR. +-.IP "\fB\-\-prefix\-strip=\fR\fIlevel\fR" 4 +-.IX Item "--prefix-strip=level" +-Indicate how many initial directory names to strip off the hardwired +-absolute paths. It has no effect without \fB\-\-prefix=\fR\fIprefix\fR. +-.IP "\fB\-\-show\-raw\-insn\fR" 4 +-.IX Item "--show-raw-insn" +-When disassembling instructions, print the instruction in hex as well as +-in symbolic form. This is the default except when +-\&\fB\-\-prefix\-addresses\fR is used. +-.IP "\fB\-\-no\-show\-raw\-insn\fR" 4 +-.IX Item "--no-show-raw-insn" +-When disassembling instructions, do not print the instruction bytes. +-This is the default when \fB\-\-prefix\-addresses\fR is used. +-.IP "\fB\-\-insn\-width=\fR\fIwidth\fR" 4 +-.IX Item "--insn-width=width" +-Display \fIwidth\fR bytes on a single line when disassembling +-instructions. +-.IP "\fB\-W[lLiaprmfFsoRt]\fR" 4 +-.IX Item "-W[lLiaprmfFsoRt]" +-.PD 0 +-.IP "\fB\-\-dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames\-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]\fR" 4 +-.IX Item "--dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]" +-.PD +-Displays the contents of the debug sections in the file, if any are +-present. If one of the optional letters or words follows the switch +-then only data found in those specific sections will be dumped. +-.Sp +-Note that there is no single letter option to display the content of +-trace sections or .gdb_index. +-.Sp +-Note: the output from the \fB=info\fR option can also be affected +-by the options \fB\-\-dwarf\-depth\fR, the \fB\-\-dwarf\-start\fR and +-the \fB\-\-dwarf\-check\fR. +-.IP "\fB\-\-dwarf\-depth=\fR\fIn\fR" 4 +-.IX Item "--dwarf-depth=n" +-Limit the dump of the \f(CW\*(C`.debug_info\*(C'\fR section to \fIn\fR children. +-This is only useful with \fB\-\-dwarf=info\fR. The default is +-to print all DIEs; the special value 0 for \fIn\fR will also have this +-effect. +-.Sp +-With a non-zero value for \fIn\fR, DIEs at or deeper than \fIn\fR +-levels will not be printed. The range for \fIn\fR is zero-based. +-.IP "\fB\-\-dwarf\-start=\fR\fIn\fR" 4 +-.IX Item "--dwarf-start=n" +-Print only DIEs beginning with the \s-1DIE\s0 numbered \fIn\fR. This is only +-useful with \fB\-\-dwarf=info\fR. +-.Sp +-If specified, this option will suppress printing of any header +-information and all DIEs before the \s-1DIE\s0 numbered \fIn\fR. Only +-siblings and children of the specified \s-1DIE\s0 will be printed. +-.Sp +-This can be used in conjunction with \fB\-\-dwarf\-depth\fR. +-.IP "\fB\-\-dwarf\-check\fR" 4 +-.IX Item "--dwarf-check" +-Enable additional checks for consistency of Dwarf information. +-.IP "\fB\-G\fR" 4 +-.IX Item "-G" +-.PD 0 +-.IP "\fB\-\-stabs\fR" 4 +-.IX Item "--stabs" +-.PD +-Display the full contents of any sections requested. Display the +-contents of the .stab and .stab.index and .stab.excl sections from an +-\&\s-1ELF\s0 file. This is only useful on systems (such as Solaris 2.0) in which +-\&\f(CW\*(C`.stab\*(C'\fR debugging symbol-table entries are carried in an \s-1ELF\s0 +-section. In most other file formats, debugging symbol-table entries are +-interleaved with linkage symbols, and are visible in the \fB\-\-syms\fR +-output. +-.IP "\fB\-\-start\-address=\fR\fIaddress\fR" 4 +-.IX Item "--start-address=address" +-Start displaying data at the specified address. This affects the output +-of the \fB\-d\fR, \fB\-r\fR and \fB\-s\fR options. +-.IP "\fB\-\-stop\-address=\fR\fIaddress\fR" 4 +-.IX Item "--stop-address=address" +-Stop displaying data at the specified address. This affects the output +-of the \fB\-d\fR, \fB\-r\fR and \fB\-s\fR options. +-.IP "\fB\-t\fR" 4 +-.IX Item "-t" +-.PD 0 +-.IP "\fB\-\-syms\fR" 4 +-.IX Item "--syms" +-.PD +-Print the symbol table entries of the file. +-This is similar to the information provided by the \fBnm\fR program, +-although the display format is different. The format of the output +-depends upon the format of the file being dumped, but there are two main +-types. One looks like this: +-.Sp +-.Vb 2 +-\& [ 4](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .bss +-\& [ 6](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 fred +-.Ve +-.Sp +-where the number inside the square brackets is the number of the entry +-in the symbol table, the \fIsec\fR number is the section number, the +-\&\fIfl\fR value are the symbol's flag bits, the \fIty\fR number is the +-symbol's type, the \fIscl\fR number is the symbol's storage class and +-the \fInx\fR value is the number of auxilary entries associated with +-the symbol. The last two fields are the symbol's value and its name. +-.Sp +-The other common output format, usually seen with \s-1ELF\s0 based files, +-looks like this: +-.Sp +-.Vb 2 +-\& 00000000 l d .bss 00000000 .bss +-\& 00000000 g .text 00000000 fred +-.Ve +-.Sp +-Here the first number is the symbol's value (sometimes refered to as +-its address). The next field is actually a set of characters and +-spaces indicating the flag bits that are set on the symbol. These +-characters are described below. Next is the section with which the +-symbol is associated or \fI*ABS*\fR if the section is absolute (ie +-not connected with any section), or \fI*UND*\fR if the section is +-referenced in the file being dumped, but not defined there. +-.Sp +-After the section name comes another field, a number, which for common +-symbols is the alignment and for other symbol is the size. Finally +-the symbol's name is displayed. +-.Sp +-The flag characters are divided into 7 groups as follows: +-.RS 4 +-.ie n .IP """l""" 4 +-.el .IP "\f(CWl\fR" 4 +-.IX Item "l" +-.PD 0 +-.ie n .IP """g""" 4 +-.el .IP "\f(CWg\fR" 4 +-.IX Item "g" +-.ie n .IP """u""" 4 +-.el .IP "\f(CWu\fR" 4 +-.IX Item "u" +-.ie n .IP """!""" 4 +-.el .IP "\f(CW!\fR" 4 +-.IX Item "!" +-.PD +-The symbol is a local (l), global (g), unique global (u), neither +-global nor local (a space) or both global and local (!). A +-symbol can be neither local or global for a variety of reasons, e.g., +-because it is used for debugging, but it is probably an indication of +-a bug if it is ever both local and global. Unique global symbols are +-a \s-1GNU\s0 extension to the standard set of \s-1ELF\s0 symbol bindings. For such +-a symbol the dynamic linker will make sure that in the entire process +-there is just one symbol with this name and type in use. +-.ie n .IP """w""" 4 +-.el .IP "\f(CWw\fR" 4 +-.IX Item "w" +-The symbol is weak (w) or strong (a space). +-.ie n .IP """C""" 4 +-.el .IP "\f(CWC\fR" 4 +-.IX Item "C" +-The symbol denotes a constructor (C) or an ordinary symbol (a space). +-.ie n .IP """W""" 4 +-.el .IP "\f(CWW\fR" 4 +-.IX Item "W" +-The symbol is a warning (W) or a normal symbol (a space). A warning +-symbol's name is a message to be displayed if the symbol following the +-warning symbol is ever referenced. +-.ie n .IP """I""" 4 +-.el .IP "\f(CWI\fR" 4 +-.IX Item "I" +-.PD 0 +-.ie n .IP """i""" 4 +-.el .IP "\f(CWi\fR" 4 +-.IX Item "i" +-.PD +-The symbol is an indirect reference to another symbol (I), a function +-to be evaluated during reloc processing (i) or a normal symbol (a +-space). +-.ie n .IP """d""" 4 +-.el .IP "\f(CWd\fR" 4 +-.IX Item "d" +-.PD 0 +-.ie n .IP """D""" 4 +-.el .IP "\f(CWD\fR" 4 +-.IX Item "D" +-.PD +-The symbol is a debugging symbol (d) or a dynamic symbol (D) or a +-normal symbol (a space). +-.ie n .IP """F""" 4 +-.el .IP "\f(CWF\fR" 4 +-.IX Item "F" +-.PD 0 +-.ie n .IP """f""" 4 +-.el .IP "\f(CWf\fR" 4 +-.IX Item "f" +-.ie n .IP """O""" 4 +-.el .IP "\f(CWO\fR" 4 +-.IX Item "O" +-.PD +-The symbol is the name of a function (F) or a file (f) or an object +-(O) or just a normal symbol (a space). +-.RE +-.RS 4 +-.RE +-.IP "\fB\-T\fR" 4 +-.IX Item "-T" +-.PD 0 +-.IP "\fB\-\-dynamic\-syms\fR" 4 +-.IX Item "--dynamic-syms" +-.PD +-Print the dynamic symbol table entries of the file. This is only +-meaningful for dynamic objects, such as certain types of shared +-libraries. This is similar to the information provided by the \fBnm\fR +-program when given the \fB\-D\fR (\fB\-\-dynamic\fR) option. +-.IP "\fB\-\-special\-syms\fR" 4 +-.IX Item "--special-syms" +-When displaying symbols include those which the target considers to be +-special in some way and which would not normally be of interest to the +-user. +-.IP "\fB\-V\fR" 4 +-.IX Item "-V" +-.PD 0 +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-.PD +-Print the version number of \fBobjdump\fR and exit. +-.IP "\fB\-x\fR" 4 +-.IX Item "-x" +-.PD 0 +-.IP "\fB\-\-all\-headers\fR" 4 +-.IX Item "--all-headers" +-.PD +-Display all available header information, including the symbol table and +-relocation entries. Using \fB\-x\fR is equivalent to specifying all of +-\&\fB\-a \-f \-h \-p \-r \-t\fR. +-.IP "\fB\-w\fR" 4 +-.IX Item "-w" +-.PD 0 +-.IP "\fB\-\-wide\fR" 4 +-.IX Item "--wide" +-.PD +-Format some lines for output devices that have more than 80 columns. +-Also do not truncate symbol names when they are displayed. +-.IP "\fB\-z\fR" 4 +-.IX Item "-z" +-.PD 0 +-.IP "\fB\-\-disassemble\-zeroes\fR" 4 +-.IX Item "--disassemble-zeroes" +-.PD +-Normally the disassembly output will skip blocks of zeroes. This +-option directs the disassembler to disassemble those blocks, just like +-any other data. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-\&\fInm\fR\|(1), \fIreadelf\fR\|(1), and the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/ranlib.1 binutils-2.24/binutils/doc/ranlib.1 +--- binutils-2.24.orig/binutils/doc/ranlib.1 2013-11-18 09:49:31.000000000 +0100 ++++ binutils-2.24/binutils/doc/ranlib.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,218 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "RANLIB 1" +-.TH RANLIB 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-ranlib \- generate index to archive. +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-ranlib [\fB\-\-plugin\fR \fIname\fR] [\fB\-DhHvVt\fR] \fIarchive\fR +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-\&\fBranlib\fR generates an index to the contents of an archive and +-stores it in the archive. The index lists each symbol defined by a +-member of an archive that is a relocatable object file. +-.PP +-You may use \fBnm \-s\fR or \fBnm \-\-print\-armap\fR to list this index. +-.PP +-An archive with such an index speeds up linking to the library and +-allows routines in the library to call each other without regard to +-their placement in the archive. +-.PP +-The \s-1GNU\s0 \fBranlib\fR program is another form of \s-1GNU\s0 \fBar\fR; running +-\&\fBranlib\fR is completely equivalent to executing \fBar \-s\fR. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-.IP "\fB\-h\fR" 4 +-.IX Item "-h" +-.PD 0 +-.IP "\fB\-H\fR" 4 +-.IX Item "-H" +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-.PD +-Show usage information for \fBranlib\fR. +-.IP "\fB\-v\fR" 4 +-.IX Item "-v" +-.PD 0 +-.IP "\fB\-V\fR" 4 +-.IX Item "-V" +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-.PD +-Show the version number of \fBranlib\fR. +-.IP "\fB\-D\fR" 4 +-.IX Item "-D" +-Operate in \fIdeterministic\fR mode. The symbol map archive member's +-header will show zero for the \s-1UID\s0, \s-1GID\s0, and timestamp. When this +-option is used, multiple runs will produce identical output files. +-.Sp +-If \fIbinutils\fR was configured with +-\&\fB\-\-enable\-deterministic\-archives\fR, then this mode is on by +-default. It can be disabled with the \fB\-U\fR option, described +-below. +-.IP "\fB\-t\fR" 4 +-.IX Item "-t" +-Update the timestamp of the symbol map of an archive. +-.IP "\fB\-U\fR" 4 +-.IX Item "-U" +-Do \fInot\fR operate in \fIdeterministic\fR mode. This is the +-inverse of the \fB\-D\fR option, above: the archive index will get +-actual \s-1UID\s0, \s-1GID\s0, timestamp, and file mode values. +-.Sp +-If \fIbinutils\fR was configured \fIwithout\fR +-\&\fB\-\-enable\-deterministic\-archives\fR, then this mode is on by +-default. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-\&\fIar\fR\|(1), \fInm\fR\|(1), and the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/readelf.1 binutils-2.24/binutils/doc/readelf.1 +--- binutils-2.24.orig/binutils/doc/readelf.1 2013-11-18 09:49:31.000000000 +0100 ++++ binutils-2.24/binutils/doc/readelf.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,448 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "READELF 1" +-.TH READELF 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-readelf \- Displays information about ELF files. +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-readelf [\fB\-a\fR|\fB\-\-all\fR] +- [\fB\-h\fR|\fB\-\-file\-header\fR] +- [\fB\-l\fR|\fB\-\-program\-headers\fR|\fB\-\-segments\fR] +- [\fB\-S\fR|\fB\-\-section\-headers\fR|\fB\-\-sections\fR] +- [\fB\-g\fR|\fB\-\-section\-groups\fR] +- [\fB\-t\fR|\fB\-\-section\-details\fR] +- [\fB\-e\fR|\fB\-\-headers\fR] +- [\fB\-s\fR|\fB\-\-syms\fR|\fB\-\-symbols\fR] +- [\fB\-\-dyn\-syms\fR] +- [\fB\-n\fR|\fB\-\-notes\fR] +- [\fB\-r\fR|\fB\-\-relocs\fR] +- [\fB\-u\fR|\fB\-\-unwind\fR] +- [\fB\-d\fR|\fB\-\-dynamic\fR] +- [\fB\-V\fR|\fB\-\-version\-info\fR] +- [\fB\-A\fR|\fB\-\-arch\-specific\fR] +- [\fB\-D\fR|\fB\-\-use\-dynamic\fR] +- [\fB\-x\fR |\fB\-\-hex\-dump=\fR] +- [\fB\-p\fR |\fB\-\-string\-dump=\fR] +- [\fB\-R\fR |\fB\-\-relocated\-dump=\fR] +- [\fB\-c\fR|\fB\-\-archive\-index\fR] +- [\fB\-w[lLiaprmfFsoRt]\fR| +- \fB\-\-debug\-dump\fR[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames\-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]] +- [\fB\-\-dwarf\-depth=\fR\fIn\fR] +- [\fB\-\-dwarf\-start=\fR\fIn\fR] +- [\fB\-I\fR|\fB\-\-histogram\fR] +- [\fB\-v\fR|\fB\-\-version\fR] +- [\fB\-W\fR|\fB\-\-wide\fR] +- [\fB\-H\fR|\fB\-\-help\fR] +- \fIelffile\fR... +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-\&\fBreadelf\fR displays information about one or more \s-1ELF\s0 format object +-files. The options control what particular information to display. +-.PP +-\&\fIelffile\fR... are the object files to be examined. 32\-bit and +-64\-bit \s-1ELF\s0 files are supported, as are archives containing \s-1ELF\s0 files. +-.PP +-This program performs a similar function to \fBobjdump\fR but it +-goes into more detail and it exists independently of the \s-1BFD\s0 +-library, so if there is a bug in \s-1BFD\s0 then readelf will not be +-affected. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-The long and short forms of options, shown here as alternatives, are +-equivalent. At least one option besides \fB\-v\fR or \fB\-H\fR must be +-given. +-.IP "\fB\-a\fR" 4 +-.IX Item "-a" +-.PD 0 +-.IP "\fB\-\-all\fR" 4 +-.IX Item "--all" +-.PD +-Equivalent to specifying \fB\-\-file\-header\fR, +-\&\fB\-\-program\-headers\fR, \fB\-\-sections\fR, \fB\-\-symbols\fR, +-\&\fB\-\-relocs\fR, \fB\-\-dynamic\fR, \fB\-\-notes\fR and +-\&\fB\-\-version\-info\fR. +-.IP "\fB\-h\fR" 4 +-.IX Item "-h" +-.PD 0 +-.IP "\fB\-\-file\-header\fR" 4 +-.IX Item "--file-header" +-.PD +-Displays the information contained in the \s-1ELF\s0 header at the start of the +-file. +-.IP "\fB\-l\fR" 4 +-.IX Item "-l" +-.PD 0 +-.IP "\fB\-\-program\-headers\fR" 4 +-.IX Item "--program-headers" +-.IP "\fB\-\-segments\fR" 4 +-.IX Item "--segments" +-.PD +-Displays the information contained in the file's segment headers, if it +-has any. +-.IP "\fB\-S\fR" 4 +-.IX Item "-S" +-.PD 0 +-.IP "\fB\-\-sections\fR" 4 +-.IX Item "--sections" +-.IP "\fB\-\-section\-headers\fR" 4 +-.IX Item "--section-headers" +-.PD +-Displays the information contained in the file's section headers, if it +-has any. +-.IP "\fB\-g\fR" 4 +-.IX Item "-g" +-.PD 0 +-.IP "\fB\-\-section\-groups\fR" 4 +-.IX Item "--section-groups" +-.PD +-Displays the information contained in the file's section groups, if it +-has any. +-.IP "\fB\-t\fR" 4 +-.IX Item "-t" +-.PD 0 +-.IP "\fB\-\-section\-details\fR" 4 +-.IX Item "--section-details" +-.PD +-Displays the detailed section information. Implies \fB\-S\fR. +-.IP "\fB\-s\fR" 4 +-.IX Item "-s" +-.PD 0 +-.IP "\fB\-\-symbols\fR" 4 +-.IX Item "--symbols" +-.IP "\fB\-\-syms\fR" 4 +-.IX Item "--syms" +-.PD +-Displays the entries in symbol table section of the file, if it has one. +-.IP "\fB\-\-dyn\-syms\fR" 4 +-.IX Item "--dyn-syms" +-Displays the entries in dynamic symbol table section of the file, if it +-has one. +-.IP "\fB\-e\fR" 4 +-.IX Item "-e" +-.PD 0 +-.IP "\fB\-\-headers\fR" 4 +-.IX Item "--headers" +-.PD +-Display all the headers in the file. Equivalent to \fB\-h \-l \-S\fR. +-.IP "\fB\-n\fR" 4 +-.IX Item "-n" +-.PD 0 +-.IP "\fB\-\-notes\fR" 4 +-.IX Item "--notes" +-.PD +-Displays the contents of the \s-1NOTE\s0 segments and/or sections, if any. +-.IP "\fB\-r\fR" 4 +-.IX Item "-r" +-.PD 0 +-.IP "\fB\-\-relocs\fR" 4 +-.IX Item "--relocs" +-.PD +-Displays the contents of the file's relocation section, if it has one. +-.IP "\fB\-u\fR" 4 +-.IX Item "-u" +-.PD 0 +-.IP "\fB\-\-unwind\fR" 4 +-.IX Item "--unwind" +-.PD +-Displays the contents of the file's unwind section, if it has one. Only +-the unwind sections for \s-1IA64\s0 \s-1ELF\s0 files, as well as \s-1ARM\s0 unwind tables +-(\f(CW\*(C`.ARM.exidx\*(C'\fR / \f(CW\*(C`.ARM.extab\*(C'\fR) are currently supported. +-.IP "\fB\-d\fR" 4 +-.IX Item "-d" +-.PD 0 +-.IP "\fB\-\-dynamic\fR" 4 +-.IX Item "--dynamic" +-.PD +-Displays the contents of the file's dynamic section, if it has one. +-.IP "\fB\-V\fR" 4 +-.IX Item "-V" +-.PD 0 +-.IP "\fB\-\-version\-info\fR" 4 +-.IX Item "--version-info" +-.PD +-Displays the contents of the version sections in the file, it they +-exist. +-.IP "\fB\-A\fR" 4 +-.IX Item "-A" +-.PD 0 +-.IP "\fB\-\-arch\-specific\fR" 4 +-.IX Item "--arch-specific" +-.PD +-Displays architecture-specific information in the file, if there +-is any. +-.IP "\fB\-D\fR" 4 +-.IX Item "-D" +-.PD 0 +-.IP "\fB\-\-use\-dynamic\fR" 4 +-.IX Item "--use-dynamic" +-.PD +-When displaying symbols, this option makes \fBreadelf\fR use the +-symbol hash tables in the file's dynamic section, rather than the +-symbol table sections. +-.IP "\fB\-x \fR" 4 +-.IX Item "-x " +-.PD 0 +-.IP "\fB\-\-hex\-dump=\fR" 4 +-.IX Item "--hex-dump=" +-.PD +-Displays the contents of the indicated section as a hexadecimal bytes. +-A number identifies a particular section by index in the section table; +-any other string identifies all sections with that name in the object file. +-.IP "\fB\-R \fR" 4 +-.IX Item "-R " +-.PD 0 +-.IP "\fB\-\-relocated\-dump=\fR" 4 +-.IX Item "--relocated-dump=" +-.PD +-Displays the contents of the indicated section as a hexadecimal +-bytes. A number identifies a particular section by index in the +-section table; any other string identifies all sections with that name +-in the object file. The contents of the section will be relocated +-before they are displayed. +-.IP "\fB\-p \fR" 4 +-.IX Item "-p " +-.PD 0 +-.IP "\fB\-\-string\-dump=\fR" 4 +-.IX Item "--string-dump=" +-.PD +-Displays the contents of the indicated section as printable strings. +-A number identifies a particular section by index in the section table; +-any other string identifies all sections with that name in the object file. +-.IP "\fB\-c\fR" 4 +-.IX Item "-c" +-.PD 0 +-.IP "\fB\-\-archive\-index\fR" 4 +-.IX Item "--archive-index" +-.PD +-Displays the file symbol index information contained in the header part +-of binary archives. Performs the same function as the \fBt\fR +-command to \fBar\fR, but without using the \s-1BFD\s0 library. +-.IP "\fB\-w[lLiaprmfFsoRt]\fR" 4 +-.IX Item "-w[lLiaprmfFsoRt]" +-.PD 0 +-.IP "\fB\-\-debug\-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames\-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]\fR" 4 +-.IX Item "--debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]" +-.PD +-Displays the contents of the debug sections in the file, if any are +-present. If one of the optional letters or words follows the switch +-then only data found in those specific sections will be dumped. +-.Sp +-Note that there is no single letter option to display the content of +-trace sections or .gdb_index. +-.Sp +-Note: the \fB=decodedline\fR option will display the interpreted +-contents of a .debug_line section whereas the \fB=rawline\fR option +-dumps the contents in a raw format. +-.Sp +-Note: the \fB=frames\-interp\fR option will display the interpreted +-contents of a .debug_frame section whereas the \fB=frames\fR option +-dumps the contents in a raw format. +-.Sp +-Note: the output from the \fB=info\fR option can also be affected +-by the options \fB\-\-dwarf\-depth\fR and \fB\-\-dwarf\-start\fR. +-.IP "\fB\-\-dwarf\-depth=\fR\fIn\fR" 4 +-.IX Item "--dwarf-depth=n" +-Limit the dump of the \f(CW\*(C`.debug_info\*(C'\fR section to \fIn\fR children. +-This is only useful with \fB\-\-debug\-dump=info\fR. The default is +-to print all DIEs; the special value 0 for \fIn\fR will also have this +-effect. +-.Sp +-With a non-zero value for \fIn\fR, DIEs at or deeper than \fIn\fR +-levels will not be printed. The range for \fIn\fR is zero-based. +-.IP "\fB\-\-dwarf\-start=\fR\fIn\fR" 4 +-.IX Item "--dwarf-start=n" +-Print only DIEs beginning with the \s-1DIE\s0 numbered \fIn\fR. This is only +-useful with \fB\-\-debug\-dump=info\fR. +-.Sp +-If specified, this option will suppress printing of any header +-information and all DIEs before the \s-1DIE\s0 numbered \fIn\fR. Only +-siblings and children of the specified \s-1DIE\s0 will be printed. +-.Sp +-This can be used in conjunction with \fB\-\-dwarf\-depth\fR. +-.IP "\fB\-I\fR" 4 +-.IX Item "-I" +-.PD 0 +-.IP "\fB\-\-histogram\fR" 4 +-.IX Item "--histogram" +-.PD +-Display a histogram of bucket list lengths when displaying the contents +-of the symbol tables. +-.IP "\fB\-v\fR" 4 +-.IX Item "-v" +-.PD 0 +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-.PD +-Display the version number of readelf. +-.IP "\fB\-W\fR" 4 +-.IX Item "-W" +-.PD 0 +-.IP "\fB\-\-wide\fR" 4 +-.IX Item "--wide" +-.PD +-Don't break output lines to fit into 80 columns. By default +-\&\fBreadelf\fR breaks section header and segment listing lines for +-64\-bit \s-1ELF\s0 files, so that they fit into 80 columns. This option causes +-\&\fBreadelf\fR to print each section header resp. each segment one a +-single line, which is far more readable on terminals wider than 80 columns. +-.IP "\fB\-H\fR" 4 +-.IX Item "-H" +-.PD 0 +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-.PD +-Display the command line options understood by \fBreadelf\fR. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-\&\fIobjdump\fR\|(1), and the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/size.1 binutils-2.24/binutils/doc/size.1 +--- binutils-2.24.orig/binutils/doc/size.1 2013-11-18 09:49:31.000000000 +0100 ++++ binutils-2.24/binutils/doc/size.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,266 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "SIZE 1" +-.TH SIZE 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-size \- list section sizes and total size. +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-size [\fB\-A\fR|\fB\-B\fR|\fB\-\-format=\fR\fIcompatibility\fR] +- [\fB\-\-help\fR] +- [\fB\-d\fR|\fB\-o\fR|\fB\-x\fR|\fB\-\-radix=\fR\fInumber\fR] +- [\fB\-\-common\fR] +- [\fB\-t\fR|\fB\-\-totals\fR] +- [\fB\-\-target=\fR\fIbfdname\fR] [\fB\-V\fR|\fB\-\-version\fR] +- [\fIobjfile\fR...] +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-The \s-1GNU\s0 \fBsize\fR utility lists the section sizes\-\-\-and the total +-size\-\-\-for each of the object or archive files \fIobjfile\fR in its +-argument list. By default, one line of output is generated for each +-object file or each module in an archive. +-.PP +-\&\fIobjfile\fR... are the object files to be examined. +-If none are specified, the file \f(CW\*(C`a.out\*(C'\fR will be used. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-The command line options have the following meanings: +-.IP "\fB\-A\fR" 4 +-.IX Item "-A" +-.PD 0 +-.IP "\fB\-B\fR" 4 +-.IX Item "-B" +-.IP "\fB\-\-format=\fR\fIcompatibility\fR" 4 +-.IX Item "--format=compatibility" +-.PD +-Using one of these options, you can choose whether the output from \s-1GNU\s0 +-\&\fBsize\fR resembles output from System V \fBsize\fR (using \fB\-A\fR, +-or \fB\-\-format=sysv\fR), or Berkeley \fBsize\fR (using \fB\-B\fR, or +-\&\fB\-\-format=berkeley\fR). The default is the one-line format similar to +-Berkeley's. +-.Sp +-Here is an example of the Berkeley (default) format of output from +-\&\fBsize\fR: +-.Sp +-.Vb 4 +-\& $ size \-\-format=Berkeley ranlib size +-\& text data bss dec hex filename +-\& 294880 81920 11592 388392 5ed28 ranlib +-\& 294880 81920 11888 388688 5ee50 size +-.Ve +-.Sp +-This is the same data, but displayed closer to System V conventions: +-.Sp +-.Vb 7 +-\& $ size \-\-format=SysV ranlib size +-\& ranlib : +-\& section size addr +-\& .text 294880 8192 +-\& .data 81920 303104 +-\& .bss 11592 385024 +-\& Total 388392 +-\& +-\& +-\& size : +-\& section size addr +-\& .text 294880 8192 +-\& .data 81920 303104 +-\& .bss 11888 385024 +-\& Total 388688 +-.Ve +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-Show a summary of acceptable arguments and options. +-.IP "\fB\-d\fR" 4 +-.IX Item "-d" +-.PD 0 +-.IP "\fB\-o\fR" 4 +-.IX Item "-o" +-.IP "\fB\-x\fR" 4 +-.IX Item "-x" +-.IP "\fB\-\-radix=\fR\fInumber\fR" 4 +-.IX Item "--radix=number" +-.PD +-Using one of these options, you can control whether the size of each +-section is given in decimal (\fB\-d\fR, or \fB\-\-radix=10\fR); octal +-(\fB\-o\fR, or \fB\-\-radix=8\fR); or hexadecimal (\fB\-x\fR, or +-\&\fB\-\-radix=16\fR). In \fB\-\-radix=\fR\fInumber\fR, only the three +-values (8, 10, 16) are supported. The total size is always given in two +-radices; decimal and hexadecimal for \fB\-d\fR or \fB\-x\fR output, or +-octal and hexadecimal if you're using \fB\-o\fR. +-.IP "\fB\-\-common\fR" 4 +-.IX Item "--common" +-Print total size of common symbols in each file. When using Berkeley +-format these are included in the bss size. +-.IP "\fB\-t\fR" 4 +-.IX Item "-t" +-.PD 0 +-.IP "\fB\-\-totals\fR" 4 +-.IX Item "--totals" +-.PD +-Show totals of all objects listed (Berkeley format listing mode only). +-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4 +-.IX Item "--target=bfdname" +-Specify that the object-code format for \fIobjfile\fR is +-\&\fIbfdname\fR. This option may not be necessary; \fBsize\fR can +-automatically recognize many formats. +-.IP "\fB\-V\fR" 4 +-.IX Item "-V" +-.PD 0 +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-.PD +-Display the version number of \fBsize\fR. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-\&\fIar\fR\|(1), \fIobjdump\fR\|(1), \fIreadelf\fR\|(1), and the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/strings.1 binutils-2.24/binutils/doc/strings.1 +--- binutils-2.24.orig/binutils/doc/strings.1 2013-11-18 09:49:31.000000000 +0100 ++++ binutils-2.24/binutils/doc/strings.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,255 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "STRINGS 1" +-.TH STRINGS 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-strings \- print the strings of printable characters in files. +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-strings [\fB\-afovV\fR] [\fB\-\fR\fImin-len\fR] +- [\fB\-n\fR \fImin-len\fR] [\fB\-\-bytes=\fR\fImin-len\fR] +- [\fB\-t\fR \fIradix\fR] [\fB\-\-radix=\fR\fIradix\fR] +- [\fB\-e\fR \fIencoding\fR] [\fB\-\-encoding=\fR\fIencoding\fR] +- [\fB\-\fR] [\fB\-\-all\fR] [\fB\-\-print\-file\-name\fR] +- [\fB\-T\fR \fIbfdname\fR] [\fB\-\-target=\fR\fIbfdname\fR] +- [\fB\-\-help\fR] [\fB\-\-version\fR] \fIfile\fR... +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-For each \fIfile\fR given, \s-1GNU\s0 \fBstrings\fR prints the printable +-character sequences that are at least 4 characters long (or the number +-given with the options below) and are followed by an unprintable +-character. By default, it only prints the strings from the initialized +-and loaded sections of object files; for other types of files, it prints +-the strings from the whole file. +-.PP +-\&\fBstrings\fR is mainly useful for determining the contents of non-text +-files. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-.IP "\fB\-a\fR" 4 +-.IX Item "-a" +-.PD 0 +-.IP "\fB\-\-all\fR" 4 +-.IX Item "--all" +-.IP "\fB\-\fR" 4 +-.IX Item "-" +-.PD +-Do not scan only the initialized and loaded sections of object files; +-scan the whole files. +-.IP "\fB\-f\fR" 4 +-.IX Item "-f" +-.PD 0 +-.IP "\fB\-\-print\-file\-name\fR" 4 +-.IX Item "--print-file-name" +-.PD +-Print the name of the file before each string. +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-Print a summary of the program usage on the standard output and exit. +-.IP "\fB\-\fR\fImin-len\fR" 4 +-.IX Item "-min-len" +-.PD 0 +-.IP "\fB\-n\fR \fImin-len\fR" 4 +-.IX Item "-n min-len" +-.IP "\fB\-\-bytes=\fR\fImin-len\fR" 4 +-.IX Item "--bytes=min-len" +-.PD +-Print sequences of characters that are at least \fImin-len\fR characters +-long, instead of the default 4. +-.IP "\fB\-o\fR" 4 +-.IX Item "-o" +-Like \fB\-t o\fR. Some other versions of \fBstrings\fR have \fB\-o\fR +-act like \fB\-t d\fR instead. Since we can not be compatible with both +-ways, we simply chose one. +-.IP "\fB\-t\fR \fIradix\fR" 4 +-.IX Item "-t radix" +-.PD 0 +-.IP "\fB\-\-radix=\fR\fIradix\fR" 4 +-.IX Item "--radix=radix" +-.PD +-Print the offset within the file before each string. The single +-character argument specifies the radix of the offset\-\-\-\fBo\fR for +-octal, \fBx\fR for hexadecimal, or \fBd\fR for decimal. +-.IP "\fB\-e\fR \fIencoding\fR" 4 +-.IX Item "-e encoding" +-.PD 0 +-.IP "\fB\-\-encoding=\fR\fIencoding\fR" 4 +-.IX Item "--encoding=encoding" +-.PD +-Select the character encoding of the strings that are to be found. +-Possible values for \fIencoding\fR are: \fBs\fR = single\-7\-bit\-byte +-characters (\s-1ASCII\s0, \s-1ISO\s0 8859, etc., default), \fBS\fR = +-single\-8\-bit\-byte characters, \fBb\fR = 16\-bit bigendian, \fBl\fR = +-16\-bit littleendian, \fBB\fR = 32\-bit bigendian, \fBL\fR = 32\-bit +-littleendian. Useful for finding wide character strings. (\fBl\fR +-and \fBb\fR apply to, for example, Unicode \s-1UTF\-16/UCS\-2\s0 encodings). +-.IP "\fB\-T\fR \fIbfdname\fR" 4 +-.IX Item "-T bfdname" +-.PD 0 +-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4 +-.IX Item "--target=bfdname" +-.PD +-Specify an object code format other than your system's default format. +-.IP "\fB\-v\fR" 4 +-.IX Item "-v" +-.PD 0 +-.IP "\fB\-V\fR" 4 +-.IX Item "-V" +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-.PD +-Print the program version number on the standard output and exit. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-\&\fIar\fR\|(1), \fInm\fR\|(1), \fIobjdump\fR\|(1), \fIranlib\fR\|(1), \fIreadelf\fR\|(1) +-and the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/strip.1 binutils-2.24/binutils/doc/strip.1 +--- binutils-2.24.orig/binutils/doc/strip.1 2013-11-18 09:49:31.000000000 +0100 ++++ binutils-2.24/binutils/doc/strip.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,427 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "STRIP 1" +-.TH STRIP 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-strip \- Discard symbols from object files. +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-strip [\fB\-F\fR \fIbfdname\fR |\fB\-\-target=\fR\fIbfdname\fR] +- [\fB\-I\fR \fIbfdname\fR |\fB\-\-input\-target=\fR\fIbfdname\fR] +- [\fB\-O\fR \fIbfdname\fR |\fB\-\-output\-target=\fR\fIbfdname\fR] +- [\fB\-s\fR|\fB\-\-strip\-all\fR] +- [\fB\-S\fR|\fB\-g\fR|\fB\-d\fR|\fB\-\-strip\-debug\fR] +- [\fB\-\-strip\-dwo\fR] +- [\fB\-K\fR \fIsymbolname\fR |\fB\-\-keep\-symbol=\fR\fIsymbolname\fR] +- [\fB\-N\fR \fIsymbolname\fR |\fB\-\-strip\-symbol=\fR\fIsymbolname\fR] +- [\fB\-w\fR|\fB\-\-wildcard\fR] +- [\fB\-x\fR|\fB\-\-discard\-all\fR] [\fB\-X\fR |\fB\-\-discard\-locals\fR] +- [\fB\-R\fR \fIsectionname\fR |\fB\-\-remove\-section=\fR\fIsectionname\fR] +- [\fB\-o\fR \fIfile\fR] [\fB\-p\fR|\fB\-\-preserve\-dates\fR] +- [\fB\-D\fR|\fB\-\-enable\-deterministic\-archives\fR] +- [\fB\-U\fR|\fB\-\-disable\-deterministic\-archives\fR] +- [\fB\-\-keep\-file\-symbols\fR] +- [\fB\-\-only\-keep\-debug\fR] +- [\fB\-v\fR |\fB\-\-verbose\fR] [\fB\-V\fR|\fB\-\-version\fR] +- [\fB\-\-help\fR] [\fB\-\-info\fR] +- \fIobjfile\fR... +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-\&\s-1GNU\s0 \fBstrip\fR discards all symbols from object files +-\&\fIobjfile\fR. The list of object files may include archives. +-At least one object file must be given. +-.PP +-\&\fBstrip\fR modifies the files named in its argument, +-rather than writing modified copies under different names. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-.IP "\fB\-F\fR \fIbfdname\fR" 4 +-.IX Item "-F bfdname" +-.PD 0 +-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4 +-.IX Item "--target=bfdname" +-.PD +-Treat the original \fIobjfile\fR as a file with the object +-code format \fIbfdname\fR, and rewrite it in the same format. +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-Show a summary of the options to \fBstrip\fR and exit. +-.IP "\fB\-\-info\fR" 4 +-.IX Item "--info" +-Display a list showing all architectures and object formats available. +-.IP "\fB\-I\fR \fIbfdname\fR" 4 +-.IX Item "-I bfdname" +-.PD 0 +-.IP "\fB\-\-input\-target=\fR\fIbfdname\fR" 4 +-.IX Item "--input-target=bfdname" +-.PD +-Treat the original \fIobjfile\fR as a file with the object +-code format \fIbfdname\fR. +-.IP "\fB\-O\fR \fIbfdname\fR" 4 +-.IX Item "-O bfdname" +-.PD 0 +-.IP "\fB\-\-output\-target=\fR\fIbfdname\fR" 4 +-.IX Item "--output-target=bfdname" +-.PD +-Replace \fIobjfile\fR with a file in the output format \fIbfdname\fR. +-.IP "\fB\-R\fR \fIsectionname\fR" 4 +-.IX Item "-R sectionname" +-.PD 0 +-.IP "\fB\-\-remove\-section=\fR\fIsectionname\fR" 4 +-.IX Item "--remove-section=sectionname" +-.PD +-Remove any section named \fIsectionname\fR from the output file. This +-option may be given more than once. Note that using this option +-inappropriately may make the output file unusable. The wildcard +-character \fB*\fR may be given at the end of \fIsectionname\fR. If +-so, then any section starting with \fIsectionname\fR will be removed. +-.IP "\fB\-s\fR" 4 +-.IX Item "-s" +-.PD 0 +-.IP "\fB\-\-strip\-all\fR" 4 +-.IX Item "--strip-all" +-.PD +-Remove all symbols. +-.IP "\fB\-g\fR" 4 +-.IX Item "-g" +-.PD 0 +-.IP "\fB\-S\fR" 4 +-.IX Item "-S" +-.IP "\fB\-d\fR" 4 +-.IX Item "-d" +-.IP "\fB\-\-strip\-debug\fR" 4 +-.IX Item "--strip-debug" +-.PD +-Remove debugging symbols only. +-.IP "\fB\-\-strip\-dwo\fR" 4 +-.IX Item "--strip-dwo" +-Remove the contents of all \s-1DWARF\s0 .dwo sections, leaving the +-remaining debugging sections and all symbols intact. +-See the description of this option in the \fBobjcopy\fR section +-for more information. +-.IP "\fB\-\-strip\-unneeded\fR" 4 +-.IX Item "--strip-unneeded" +-Remove all symbols that are not needed for relocation processing. +-.IP "\fB\-K\fR \fIsymbolname\fR" 4 +-.IX Item "-K symbolname" +-.PD 0 +-.IP "\fB\-\-keep\-symbol=\fR\fIsymbolname\fR" 4 +-.IX Item "--keep-symbol=symbolname" +-.PD +-When stripping symbols, keep symbol \fIsymbolname\fR even if it would +-normally be stripped. This option may be given more than once. +-.IP "\fB\-N\fR \fIsymbolname\fR" 4 +-.IX Item "-N symbolname" +-.PD 0 +-.IP "\fB\-\-strip\-symbol=\fR\fIsymbolname\fR" 4 +-.IX Item "--strip-symbol=symbolname" +-.PD +-Remove symbol \fIsymbolname\fR from the source file. This option may be +-given more than once, and may be combined with strip options other than +-\&\fB\-K\fR. +-.IP "\fB\-o\fR \fIfile\fR" 4 +-.IX Item "-o file" +-Put the stripped output in \fIfile\fR, rather than replacing the +-existing file. When this argument is used, only one \fIobjfile\fR +-argument may be specified. +-.IP "\fB\-p\fR" 4 +-.IX Item "-p" +-.PD 0 +-.IP "\fB\-\-preserve\-dates\fR" 4 +-.IX Item "--preserve-dates" +-.PD +-Preserve the access and modification dates of the file. +-.IP "\fB\-D\fR" 4 +-.IX Item "-D" +-.PD 0 +-.IP "\fB\-\-enable\-deterministic\-archives\fR" 4 +-.IX Item "--enable-deterministic-archives" +-.PD +-Operate in \fIdeterministic\fR mode. When copying archive members +-and writing the archive index, use zero for UIDs, GIDs, timestamps, +-and use consistent file modes for all files. +-.Sp +-If \fIbinutils\fR was configured with +-\&\fB\-\-enable\-deterministic\-archives\fR, then this mode is on by default. +-It can be disabled with the \fB\-U\fR option, below. +-.IP "\fB\-U\fR" 4 +-.IX Item "-U" +-.PD 0 +-.IP "\fB\-\-disable\-deterministic\-archives\fR" 4 +-.IX Item "--disable-deterministic-archives" +-.PD +-Do \fInot\fR operate in \fIdeterministic\fR mode. This is the +-inverse of the \fB\-D\fR option, above: when copying archive members +-and writing the archive index, use their actual \s-1UID\s0, \s-1GID\s0, timestamp, +-and file mode values. +-.Sp +-This is the default unless \fIbinutils\fR was configured with +-\&\fB\-\-enable\-deterministic\-archives\fR. +-.IP "\fB\-w\fR" 4 +-.IX Item "-w" +-.PD 0 +-.IP "\fB\-\-wildcard\fR" 4 +-.IX Item "--wildcard" +-.PD +-Permit regular expressions in \fIsymbolname\fRs used in other command +-line options. The question mark (?), asterisk (*), backslash (\e) and +-square brackets ([]) operators can be used anywhere in the symbol +-name. If the first character of the symbol name is the exclamation +-point (!) then the sense of the switch is reversed for that symbol. +-For example: +-.Sp +-.Vb 1 +-\& \-w \-K !foo \-K fo* +-.Ve +-.Sp +-would cause strip to only keep symbols that start with the letters +-\&\*(L"fo\*(R", but to discard the symbol \*(L"foo\*(R". +-.IP "\fB\-x\fR" 4 +-.IX Item "-x" +-.PD 0 +-.IP "\fB\-\-discard\-all\fR" 4 +-.IX Item "--discard-all" +-.PD +-Remove non-global symbols. +-.IP "\fB\-X\fR" 4 +-.IX Item "-X" +-.PD 0 +-.IP "\fB\-\-discard\-locals\fR" 4 +-.IX Item "--discard-locals" +-.PD +-Remove compiler-generated local symbols. +-(These usually start with \fBL\fR or \fB.\fR.) +-.IP "\fB\-\-keep\-file\-symbols\fR" 4 +-.IX Item "--keep-file-symbols" +-When stripping a file, perhaps with \fB\-\-strip\-debug\fR or +-\&\fB\-\-strip\-unneeded\fR, retain any symbols specifying source file names, +-which would otherwise get stripped. +-.IP "\fB\-\-only\-keep\-debug\fR" 4 +-.IX Item "--only-keep-debug" +-Strip a file, removing contents of any sections that would not be +-stripped by \fB\-\-strip\-debug\fR and leaving the debugging sections +-intact. In \s-1ELF\s0 files, this preserves all note sections in the output. +-.Sp +-The intention is that this option will be used in conjunction with +-\&\fB\-\-add\-gnu\-debuglink\fR to create a two part executable. One a +-stripped binary which will occupy less space in \s-1RAM\s0 and in a +-distribution and the second a debugging information file which is only +-needed if debugging abilities are required. The suggested procedure +-to create these files is as follows: +-.RS 4 +-.IP "1." 4 +-.IX Item "1." +-\&\f(CW\*(C`foo\*(C'\fR then... +-.ie n .IP "1." 4 +-.el .IP "1." 4 +-.IX Item "1." +-create a file containing the debugging info. +-.ie n .IP "1." 4 +-.el .IP "1." 4 +-.IX Item "1." +-stripped executable. +-.ie n .IP "1." 4 +-.el .IP "1." 4 +-.IX Item "1." +-to add a link to the debugging info into the stripped executable. +-.RE +-.RS 4 +-.Sp +-Note\-\-\-the choice of \f(CW\*(C`.dbg\*(C'\fR as an extension for the debug info +-file is arbitrary. Also the \f(CW\*(C`\-\-only\-keep\-debug\*(C'\fR step is +-optional. You could instead do this: +-.IP "1." 4 +-.IX Item "1." +-.PD 0 +-.ie n .IP "1." 4 +-.el .IP "1." 4 +-.IX Item "1." +-.ie n .IP "1." 4 +-.el .IP "1." 4 +-.IX Item "1." +-.ie n .IP "1." 4 +-.el .IP "1." 4 +-.IX Item "1." +-.RE +-.RS 4 +-.PD +-.Sp +-i.e., the file pointed to by the \fB\-\-add\-gnu\-debuglink\fR can be the +-full executable. It does not have to be a file created by the +-\&\fB\-\-only\-keep\-debug\fR switch. +-.Sp +-Note\-\-\-this switch is only intended for use on fully linked files. It +-does not make sense to use it on object files where the debugging +-information may be incomplete. Besides the gnu_debuglink feature +-currently only supports the presence of one filename containing +-debugging information, not multiple filenames on a one-per-object-file +-basis. +-.RE +-.IP "\fB\-V\fR" 4 +-.IX Item "-V" +-.PD 0 +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-.PD +-Show the version number for \fBstrip\fR. +-.IP "\fB\-v\fR" 4 +-.IX Item "-v" +-.PD 0 +-.IP "\fB\-\-verbose\fR" 4 +-.IX Item "--verbose" +-.PD +-Verbose output: list all object files modified. In the case of +-archives, \fBstrip \-v\fR lists all members of the archive. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/windmc.1 binutils-2.24/binutils/doc/windmc.1 +--- binutils-2.24.orig/binutils/doc/windmc.1 2013-11-18 09:49:32.000000000 +0100 ++++ binutils-2.24/binutils/doc/windmc.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,351 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "WINDMC 1" +-.TH WINDMC 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-windmc \- generates Windows message resources. +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-windmc [options] input-file +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-\&\fBwindmc\fR reads message definitions from an input file (.mc) and +-translate them into a set of output files. The output files may be of +-four kinds: +-.ie n .IP """h""" 4 +-.el .IP "\f(CWh\fR" 4 +-.IX Item "h" +-A C header file containing the message definitions. +-.ie n .IP """rc""" 4 +-.el .IP "\f(CWrc\fR" 4 +-.IX Item "rc" +-A resource file compilable by the \fBwindres\fR tool. +-.ie n .IP """bin""" 4 +-.el .IP "\f(CWbin\fR" 4 +-.IX Item "bin" +-One or more binary files containing the resource data for a specific +-message language. +-.ie n .IP """dbg""" 4 +-.el .IP "\f(CWdbg\fR" 4 +-.IX Item "dbg" +-A C include file that maps message id's to their symbolic name. +-.PP +-The exact description of these different formats is available in +-documentation from Microsoft. +-.PP +-When \fBwindmc\fR converts from the \f(CW\*(C`mc\*(C'\fR format to the \f(CW\*(C`bin\*(C'\fR +-format, \f(CW\*(C`rc\*(C'\fR, \f(CW\*(C`h\*(C'\fR, and optional \f(CW\*(C`dbg\*(C'\fR it is acting like the +-Windows Message Compiler. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-.IP "\fB\-a\fR" 4 +-.IX Item "-a" +-.PD 0 +-.IP "\fB\-\-ascii_in\fR" 4 +-.IX Item "--ascii_in" +-.PD +-Specifies that the input file specified is \s-1ASCII\s0. This is the default +-behaviour. +-.IP "\fB\-A\fR" 4 +-.IX Item "-A" +-.PD 0 +-.IP "\fB\-\-ascii_out\fR" 4 +-.IX Item "--ascii_out" +-.PD +-Specifies that messages in the output \f(CW\*(C`bin\*(C'\fR files should be in \s-1ASCII\s0 +-format. +-.IP "\fB\-b\fR" 4 +-.IX Item "-b" +-.PD 0 +-.IP "\fB\-\-binprefix\fR" 4 +-.IX Item "--binprefix" +-.PD +-Specifies that \f(CW\*(C`bin\*(C'\fR filenames should have to be prefixed by the +-basename of the source file. +-.IP "\fB\-c\fR" 4 +-.IX Item "-c" +-.PD 0 +-.IP "\fB\-\-customflag\fR" 4 +-.IX Item "--customflag" +-.PD +-Sets the customer bit in all message id's. +-.IP "\fB\-C\fR \fIcodepage\fR" 4 +-.IX Item "-C codepage" +-.PD 0 +-.IP "\fB\-\-codepage_in\fR \fIcodepage\fR" 4 +-.IX Item "--codepage_in codepage" +-.PD +-Sets the default codepage to be used to convert input file to \s-1UTF16\s0. The +-default is ocdepage 1252. +-.IP "\fB\-d\fR" 4 +-.IX Item "-d" +-.PD 0 +-.IP "\fB\-\-decimal_values\fR" 4 +-.IX Item "--decimal_values" +-.PD +-Outputs the constants in the header file in decimal. Default is using +-hexadecimal output. +-.IP "\fB\-e\fR \fIext\fR" 4 +-.IX Item "-e ext" +-.PD 0 +-.IP "\fB\-\-extension\fR \fIext\fR" 4 +-.IX Item "--extension ext" +-.PD +-The extension for the header file. The default is .h extension. +-.IP "\fB\-F\fR \fItarget\fR" 4 +-.IX Item "-F target" +-.PD 0 +-.IP "\fB\-\-target\fR \fItarget\fR" 4 +-.IX Item "--target target" +-.PD +-Specify the \s-1BFD\s0 format to use for a bin file as output. This +-is a \s-1BFD\s0 target name; you can use the \fB\-\-help\fR option to see a list +-of supported targets. Normally \fBwindmc\fR will use the default +-format, which is the first one listed by the \fB\-\-help\fR option. +-.IP "\fB\-h\fR \fIpath\fR" 4 +-.IX Item "-h path" +-.PD 0 +-.IP "\fB\-\-headerdir\fR \fIpath\fR" 4 +-.IX Item "--headerdir path" +-.PD +-The target directory of the generated header file. The default is the +-current directory. +-.IP "\fB\-H\fR" 4 +-.IX Item "-H" +-.PD 0 +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-.PD +-Displays a list of command line options and then exits. +-.IP "\fB\-m\fR \fIcharacters\fR" 4 +-.IX Item "-m characters" +-.PD 0 +-.IP "\fB\-\-maxlength\fR \fIcharacters\fR" 4 +-.IX Item "--maxlength characters" +-.PD +-Instructs \fBwindmc\fR to generate a warning if the length +-of any message exceeds the number specified. +-.IP "\fB\-n\fR" 4 +-.IX Item "-n" +-.PD 0 +-.IP "\fB\-\-nullterminate\fR" 4 +-.IX Item "--nullterminate" +-.PD +-Terminate message text in \f(CW\*(C`bin\*(C'\fR files by zero. By default they are +-terminated by \s-1CR/LF\s0. +-.IP "\fB\-o\fR" 4 +-.IX Item "-o" +-.PD 0 +-.IP "\fB\-\-hresult_use\fR" 4 +-.IX Item "--hresult_use" +-.PD +-Not yet implemented. Instructs \f(CW\*(C`windmc\*(C'\fR to generate an \s-1OLE2\s0 header +-file, using \s-1HRESULT\s0 definitions. Status codes are used if the flag is not +-specified. +-.IP "\fB\-O\fR \fIcodepage\fR" 4 +-.IX Item "-O codepage" +-.PD 0 +-.IP "\fB\-\-codepage_out\fR \fIcodepage\fR" 4 +-.IX Item "--codepage_out codepage" +-.PD +-Sets the default codepage to be used to output text files. The default +-is ocdepage 1252. +-.IP "\fB\-r\fR \fIpath\fR" 4 +-.IX Item "-r path" +-.PD 0 +-.IP "\fB\-\-rcdir\fR \fIpath\fR" 4 +-.IX Item "--rcdir path" +-.PD +-The target directory for the generated \f(CW\*(C`rc\*(C'\fR script and the generated +-\&\f(CW\*(C`bin\*(C'\fR files that the resource compiler script includes. The default +-is the current directory. +-.IP "\fB\-u\fR" 4 +-.IX Item "-u" +-.PD 0 +-.IP "\fB\-\-unicode_in\fR" 4 +-.IX Item "--unicode_in" +-.PD +-Specifies that the input file is \s-1UTF16\s0. +-.IP "\fB\-U\fR" 4 +-.IX Item "-U" +-.PD 0 +-.IP "\fB\-\-unicode_out\fR" 4 +-.IX Item "--unicode_out" +-.PD +-Specifies that messages in the output \f(CW\*(C`bin\*(C'\fR file should be in \s-1UTF16\s0 +-format. This is the default behaviour. +-.IP "\fB\-v\fR" 4 +-.IX Item "-v" +-.PD 0 +-.IP "\fB\-\-verbose\fR" 4 +-.IX Item "--verbose" +-.PD +-Enable verbose mode. +-.IP "\fB\-V\fR" 4 +-.IX Item "-V" +-.PD 0 +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-.PD +-Prints the version number for \fBwindmc\fR. +-.IP "\fB\-x\fR \fIpath\fR" 4 +-.IX Item "-x path" +-.PD 0 +-.IP "\fB\-\-xdgb\fR \fIpath\fR" 4 +-.IX Item "--xdgb path" +-.PD +-The path of the \f(CW\*(C`dbg\*(C'\fR C include file that maps message id's to the +-symbolic name. No such file is generated without specifying the switch. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/doc/windres.1 binutils-2.24/binutils/doc/windres.1 +--- binutils-2.24.orig/binutils/doc/windres.1 2013-11-18 09:49:31.000000000 +0100 ++++ binutils-2.24/binutils/doc/windres.1 1970-01-01 01:00:00.000000000 +0100 +@@ -1,359 +0,0 @@ +-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) +-.\" +-.\" Standard preamble: +-.\" ======================================================================== +-.de Sp \" Vertical space (when we can't use .PP) +-.if t .sp .5v +-.if n .sp +-.. +-.de Vb \" Begin verbatim text +-.ft CW +-.nf +-.ne \\$1 +-.. +-.de Ve \" End verbatim text +-.ft R +-.fi +-.. +-.\" Set up some character translations and predefined strings. \*(-- will +-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +-.\" double quote, and \*(R" will give a right double quote. \*(C+ will +-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +-.\" nothing in troff, for use with C<>. +-.tr \(*W- +-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +-.ie n \{\ +-. ds -- \(*W- +-. ds PI pi +-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +-. ds L" "" +-. ds R" "" +-. ds C` "" +-. ds C' "" +-'br\} +-.el\{\ +-. ds -- \|\(em\| +-. ds PI \(*p +-. ds L" `` +-. ds R" '' +-'br\} +-.\" +-.\" Escape single quotes in literal strings from groff's Unicode transform. +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" +-.\" If the F register is turned on, we'll generate index entries on stderr for +-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +-.\" entries marked with X<> in POD. Of course, you'll have to process the +-.\" output yourself in some meaningful fashion. +-.ie \nF \{\ +-. de IX +-. tm Index:\\$1\t\\n%\t"\\$2" +-.. +-. nr % 0 +-. rr F +-.\} +-.el \{\ +-. de IX +-.. +-.\} +-.\" +-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +-.\" Fear. Run. Save yourself. No user-serviceable parts. +-. \" fudge factors for nroff and troff +-.if n \{\ +-. ds #H 0 +-. ds #V .8m +-. ds #F .3m +-. ds #[ \f1 +-. ds #] \fP +-.\} +-.if t \{\ +-. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +-. ds #V .6m +-. ds #F 0 +-. ds #[ \& +-. ds #] \& +-.\} +-. \" simple accents for nroff and troff +-.if n \{\ +-. ds ' \& +-. ds ` \& +-. ds ^ \& +-. ds , \& +-. ds ~ ~ +-. ds / +-.\} +-.if t \{\ +-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +-.\} +-. \" troff and (daisy-wheel) nroff accents +-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +-.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +-.ds ae a\h'-(\w'a'u*4/10)'e +-.ds Ae A\h'-(\w'A'u*4/10)'E +-. \" corrections for vroff +-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +-. \" for low resolution devices (crt and lpr) +-.if \n(.H>23 .if \n(.V>19 \ +-\{\ +-. ds : e +-. ds 8 ss +-. ds o a +-. ds d- d\h'-1'\(ga +-. ds D- D\h'-1'\(hy +-. ds th \o'bp' +-. ds Th \o'LP' +-. ds ae ae +-. ds Ae AE +-.\} +-.rm #[ #] #H #V #F C +-.\" ======================================================================== +-.\" +-.IX Title "WINDRES 1" +-.TH WINDRES 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools" +-.\" For nroff, turn off justification. Always turn off hyphenation; it makes +-.\" way too many mistakes in technical documents. +-.if n .ad l +-.nh +-.SH "NAME" +-windres \- manipulate Windows resources. +-.SH "SYNOPSIS" +-.IX Header "SYNOPSIS" +-windres [options] [input\-file] [output\-file] +-.SH "DESCRIPTION" +-.IX Header "DESCRIPTION" +-\&\fBwindres\fR reads resources from an input file and copies them into +-an output file. Either file may be in one of three formats: +-.ie n .IP """rc""" 4 +-.el .IP "\f(CWrc\fR" 4 +-.IX Item "rc" +-A text format read by the Resource Compiler. +-.ie n .IP """res""" 4 +-.el .IP "\f(CWres\fR" 4 +-.IX Item "res" +-A binary format generated by the Resource Compiler. +-.ie n .IP """coff""" 4 +-.el .IP "\f(CWcoff\fR" 4 +-.IX Item "coff" +-A \s-1COFF\s0 object or executable. +-.PP +-The exact description of these different formats is available in +-documentation from Microsoft. +-.PP +-When \fBwindres\fR converts from the \f(CW\*(C`rc\*(C'\fR format to the \f(CW\*(C`res\*(C'\fR +-format, it is acting like the Windows Resource Compiler. When +-\&\fBwindres\fR converts from the \f(CW\*(C`res\*(C'\fR format to the \f(CW\*(C`coff\*(C'\fR +-format, it is acting like the Windows \f(CW\*(C`CVTRES\*(C'\fR program. +-.PP +-When \fBwindres\fR generates an \f(CW\*(C`rc\*(C'\fR file, the output is similar +-but not identical to the format expected for the input. When an input +-\&\f(CW\*(C`rc\*(C'\fR file refers to an external filename, an output \f(CW\*(C`rc\*(C'\fR file +-will instead include the file contents. +-.PP +-If the input or output format is not specified, \fBwindres\fR will +-guess based on the file name, or, for the input file, the file contents. +-A file with an extension of \fI.rc\fR will be treated as an \f(CW\*(C`rc\*(C'\fR +-file, a file with an extension of \fI.res\fR will be treated as a +-\&\f(CW\*(C`res\*(C'\fR file, and a file with an extension of \fI.o\fR or +-\&\fI.exe\fR will be treated as a \f(CW\*(C`coff\*(C'\fR file. +-.PP +-If no output file is specified, \fBwindres\fR will print the resources +-in \f(CW\*(C`rc\*(C'\fR format to standard output. +-.PP +-The normal use is for you to write an \f(CW\*(C`rc\*(C'\fR file, use \fBwindres\fR +-to convert it to a \s-1COFF\s0 object file, and then link the \s-1COFF\s0 file into +-your application. This will make the resources described in the +-\&\f(CW\*(C`rc\*(C'\fR file available to Windows. +-.SH "OPTIONS" +-.IX Header "OPTIONS" +-.IP "\fB\-i\fR \fIfilename\fR" 4 +-.IX Item "-i filename" +-.PD 0 +-.IP "\fB\-\-input\fR \fIfilename\fR" 4 +-.IX Item "--input filename" +-.PD +-The name of the input file. If this option is not used, then +-\&\fBwindres\fR will use the first non-option argument as the input file +-name. If there are no non-option arguments, then \fBwindres\fR will +-read from standard input. \fBwindres\fR can not read a \s-1COFF\s0 file from +-standard input. +-.IP "\fB\-o\fR \fIfilename\fR" 4 +-.IX Item "-o filename" +-.PD 0 +-.IP "\fB\-\-output\fR \fIfilename\fR" 4 +-.IX Item "--output filename" +-.PD +-The name of the output file. If this option is not used, then +-\&\fBwindres\fR will use the first non-option argument, after any used +-for the input file name, as the output file name. If there is no +-non-option argument, then \fBwindres\fR will write to standard output. +-\&\fBwindres\fR can not write a \s-1COFF\s0 file to standard output. Note, +-for compatibility with \fBrc\fR the option \fB\-fo\fR is also +-accepted, but its use is not recommended. +-.IP "\fB\-J\fR \fIformat\fR" 4 +-.IX Item "-J format" +-.PD 0 +-.IP "\fB\-\-input\-format\fR \fIformat\fR" 4 +-.IX Item "--input-format format" +-.PD +-The input format to read. \fIformat\fR may be \fBres\fR, \fBrc\fR, or +-\&\fBcoff\fR. If no input format is specified, \fBwindres\fR will +-guess, as described above. +-.IP "\fB\-O\fR \fIformat\fR" 4 +-.IX Item "-O format" +-.PD 0 +-.IP "\fB\-\-output\-format\fR \fIformat\fR" 4 +-.IX Item "--output-format format" +-.PD +-The output format to generate. \fIformat\fR may be \fBres\fR, +-\&\fBrc\fR, or \fBcoff\fR. If no output format is specified, +-\&\fBwindres\fR will guess, as described above. +-.IP "\fB\-F\fR \fItarget\fR" 4 +-.IX Item "-F target" +-.PD 0 +-.IP "\fB\-\-target\fR \fItarget\fR" 4 +-.IX Item "--target target" +-.PD +-Specify the \s-1BFD\s0 format to use for a \s-1COFF\s0 file as input or output. This +-is a \s-1BFD\s0 target name; you can use the \fB\-\-help\fR option to see a list +-of supported targets. Normally \fBwindres\fR will use the default +-format, which is the first one listed by the \fB\-\-help\fR option. +-.IP "\fB\-\-preprocessor\fR \fIprogram\fR" 4 +-.IX Item "--preprocessor program" +-When \fBwindres\fR reads an \f(CW\*(C`rc\*(C'\fR file, it runs it through the C +-preprocessor first. This option may be used to specify the preprocessor +-to use, including any leading arguments. The default preprocessor +-argument is \f(CW\*(C`gcc \-E \-xc\-header \-DRC_INVOKED\*(C'\fR. +-.IP "\fB\-\-preprocessor\-arg\fR \fIoption\fR" 4 +-.IX Item "--preprocessor-arg option" +-When \fBwindres\fR reads an \f(CW\*(C`rc\*(C'\fR file, it runs it through +-the C preprocessor first. This option may be used to specify additional +-text to be passed to preprocessor on its command line. +-This option can be used multiple times to add multiple options to the +-preprocessor command line. +-.IP "\fB\-I\fR \fIdirectory\fR" 4 +-.IX Item "-I directory" +-.PD 0 +-.IP "\fB\-\-include\-dir\fR \fIdirectory\fR" 4 +-.IX Item "--include-dir directory" +-.PD +-Specify an include directory to use when reading an \f(CW\*(C`rc\*(C'\fR file. +-\&\fBwindres\fR will pass this to the preprocessor as an \fB\-I\fR +-option. \fBwindres\fR will also search this directory when looking for +-files named in the \f(CW\*(C`rc\*(C'\fR file. If the argument passed to this command +-matches any of the supported \fIformats\fR (as described in the \fB\-J\fR +-option), it will issue a deprecation warning, and behave just like the +-\&\fB\-J\fR option. New programs should not use this behaviour. If a +-directory happens to match a \fIformat\fR, simple prefix it with \fB./\fR +-to disable the backward compatibility. +-.IP "\fB\-D\fR \fItarget\fR" 4 +-.IX Item "-D target" +-.PD 0 +-.IP "\fB\-\-define\fR \fIsym\fR\fB[=\fR\fIval\fR\fB]\fR" 4 +-.IX Item "--define sym[=val]" +-.PD +-Specify a \fB\-D\fR option to pass to the preprocessor when reading an +-\&\f(CW\*(C`rc\*(C'\fR file. +-.IP "\fB\-U\fR \fItarget\fR" 4 +-.IX Item "-U target" +-.PD 0 +-.IP "\fB\-\-undefine\fR \fIsym\fR" 4 +-.IX Item "--undefine sym" +-.PD +-Specify a \fB\-U\fR option to pass to the preprocessor when reading an +-\&\f(CW\*(C`rc\*(C'\fR file. +-.IP "\fB\-r\fR" 4 +-.IX Item "-r" +-Ignored for compatibility with rc. +-.IP "\fB\-v\fR" 4 +-.IX Item "-v" +-Enable verbose mode. This tells you what the preprocessor is if you +-didn't specify one. +-.IP "\fB\-c\fR \fIval\fR" 4 +-.IX Item "-c val" +-.PD 0 +-.IP "\fB\-\-codepage\fR \fIval\fR" 4 +-.IX Item "--codepage val" +-.PD +-Specify the default codepage to use when reading an \f(CW\*(C`rc\*(C'\fR file. +-\&\fIval\fR should be a hexadecimal prefixed by \fB0x\fR or decimal +-codepage code. The valid range is from zero up to 0xffff, but the +-validity of the codepage is host and configuration dependent. +-.IP "\fB\-l\fR \fIval\fR" 4 +-.IX Item "-l val" +-.PD 0 +-.IP "\fB\-\-language\fR \fIval\fR" 4 +-.IX Item "--language val" +-.PD +-Specify the default language to use when reading an \f(CW\*(C`rc\*(C'\fR file. +-\&\fIval\fR should be a hexadecimal language code. The low eight bits are +-the language, and the high eight bits are the sublanguage. +-.IP "\fB\-\-use\-temp\-file\fR" 4 +-.IX Item "--use-temp-file" +-Use a temporary file to instead of using popen to read the output of +-the preprocessor. Use this option if the popen implementation is buggy +-on the host (eg., certain non-English language versions of Windows 95 and +-Windows 98 are known to have buggy popen where the output will instead +-go the console). +-.IP "\fB\-\-no\-use\-temp\-file\fR" 4 +-.IX Item "--no-use-temp-file" +-Use popen, not a temporary file, to read the output of the preprocessor. +-This is the default behaviour. +-.IP "\fB\-h\fR" 4 +-.IX Item "-h" +-.PD 0 +-.IP "\fB\-\-help\fR" 4 +-.IX Item "--help" +-.PD +-Prints a usage summary. +-.IP "\fB\-V\fR" 4 +-.IX Item "-V" +-.PD 0 +-.IP "\fB\-\-version\fR" 4 +-.IX Item "--version" +-.PD +-Prints the version number for \fBwindres\fR. +-.IP "\fB\-\-yydebug\fR" 4 +-.IX Item "--yydebug" +-If \fBwindres\fR is compiled with \f(CW\*(C`YYDEBUG\*(C'\fR defined as \f(CW1\fR, +-this will turn on parser debugging. +-.IP "\fB@\fR\fIfile\fR" 4 +-.IX Item "@file" +-Read command-line options from \fIfile\fR. The options read are +-inserted in place of the original @\fIfile\fR option. If \fIfile\fR +-does not exist, or cannot be read, then the option will be treated +-literally, and not removed. +-.Sp +-Options in \fIfile\fR are separated by whitespace. A whitespace +-character may be included in an option by surrounding the entire +-option in either single or double quotes. Any character (including a +-backslash) may be included by prefixing the character to be included +-with a backslash. The \fIfile\fR may itself contain additional +-@\fIfile\fR options; any such options will be processed recursively. +-.SH "SEE ALSO" +-.IX Header "SEE ALSO" +-the Info entries for \fIbinutils\fR. +-.SH "COPYRIGHT" +-.IX Header "COPYRIGHT" +-Copyright (c) 1991\-2013 Free Software Foundation, Inc. +-.PP +-Permission is granted to copy, distribute and/or modify this document +-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 +-or any later version published by the Free Software Foundation; +-with no Invariant Sections, with no Front-Cover Texts, and with no +-Back-Cover Texts. A copy of the license is included in the +-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R". +diff -Nur binutils-2.24.orig/binutils/dwarf.c binutils-2.24/binutils/dwarf.c +--- binutils-2.24.orig/binutils/dwarf.c 2013-11-08 11:13:48.000000000 +0100 ++++ binutils-2.24/binutils/dwarf.c 2016-04-10 20:30:46.000000000 +0200 +@@ -263,7 +263,7 @@ + *length_return = num_read; + + if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40)) +- result |= -1L << shift; ++ result |= (dwarf_vma) -1 << shift; + + return result; + } +@@ -2663,14 +2663,10 @@ + linfo->li_max_ops_per_insn = 1; + + SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end); +- SAFE_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end); ++ SAFE_SIGNED_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end); + SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end); + SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end); + +- /* Sign extend the line base field. */ +- linfo->li_line_base <<= 24; +- linfo->li_line_base >>= 24; +- + * end_of_sequence = data + linfo->li_length + initial_length_size; + return hdrptr; + } +diff -Nur binutils-2.24.orig/binutils/mcparse.c binutils-2.24/binutils/mcparse.c +--- binutils-2.24.orig/binutils/mcparse.c 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/mcparse.c 1970-01-01 01:00:00.000000000 +0100 +@@ -1,2156 +0,0 @@ +-/* A Bison parser, made by GNU Bison 2.3. */ +- +-/* Skeleton implementation for Bison's Yacc-like parsers in C +- +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +- 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., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. */ +- +-/* As a special exception, you may create a larger work that contains +- part or all of the Bison parser skeleton and distribute that work +- under terms of your choice, so long as that work isn't itself a +- parser generator using the skeleton or a modified version thereof +- as a parser skeleton. Alternatively, if you modify or redistribute +- the parser skeleton itself, you may (at your option) remove this +- special exception, which will cause the skeleton and the resulting +- Bison output files to be licensed under the GNU General Public +- License without this special exception. +- +- This special exception was added by the Free Software Foundation in +- version 2.2 of Bison. */ +- +-/* C LALR(1) parser skeleton written by Richard Stallman, by +- simplifying the original so-called "semantic" parser. */ +- +-/* All symbols defined below should begin with yy or YY, to avoid +- infringing on user name space. This should be done even for local +- variables, as they might otherwise be expanded by user macros. +- There are some unavoidable exceptions within include files to +- define necessary library symbols; they are noted "INFRINGES ON +- USER NAME SPACE" below. */ +- +-/* Identify Bison output. */ +-#define YYBISON 1 +- +-/* Bison version. */ +-#define YYBISON_VERSION "2.3" +- +-/* Skeleton name. */ +-#define YYSKELETON_NAME "yacc.c" +- +-/* Pure parsers. */ +-#define YYPURE 0 +- +-/* Using locations. */ +-#define YYLSP_NEEDED 0 +- +- +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- NL = 258, +- MCIDENT = 259, +- MCFILENAME = 260, +- MCLINE = 261, +- MCCOMMENT = 262, +- MCTOKEN = 263, +- MCENDLINE = 264, +- MCLANGUAGENAMES = 265, +- MCFACILITYNAMES = 266, +- MCSEVERITYNAMES = 267, +- MCOUTPUTBASE = 268, +- MCMESSAGEIDTYPEDEF = 269, +- MCLANGUAGE = 270, +- MCMESSAGEID = 271, +- MCSEVERITY = 272, +- MCFACILITY = 273, +- MCSYMBOLICNAME = 274, +- MCNUMBER = 275 +- }; +-#endif +-/* Tokens. */ +-#define NL 258 +-#define MCIDENT 259 +-#define MCFILENAME 260 +-#define MCLINE 261 +-#define MCCOMMENT 262 +-#define MCTOKEN 263 +-#define MCENDLINE 264 +-#define MCLANGUAGENAMES 265 +-#define MCFACILITYNAMES 266 +-#define MCSEVERITYNAMES 267 +-#define MCOUTPUTBASE 268 +-#define MCMESSAGEIDTYPEDEF 269 +-#define MCLANGUAGE 270 +-#define MCMESSAGEID 271 +-#define MCSEVERITY 272 +-#define MCFACILITY 273 +-#define MCSYMBOLICNAME 274 +-#define MCNUMBER 275 +- +- +- +- +-/* Copy the first part of user declarations. */ +-#line 1 "mcparse.y" +- /* mcparse.y -- parser for Windows mc files +- Copyright 2007 +- Free Software Foundation, Inc. +- +- Parser for Windows mc files +- Written by Kai Tietz, Onevision. +- +- 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 3 of the License, or +- (at your option) any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +- 02110-1301, USA. */ +- +-/* This is a parser for Windows rc files. It is based on the parser +- by Gunther Ebert . */ +- +-#include "sysdep.h" +-#include "bfd.h" +-#include "bucomm.h" +-#include "libiberty.h" +-#include "windmc.h" +-#include "safe-ctype.h" +- +-static rc_uint_type mc_last_id = 0; +-static rc_uint_type mc_sefa_val = 0; +-static unichar *mc_last_symbol = NULL; +-static const mc_keyword *mc_cur_severity = NULL; +-static const mc_keyword *mc_cur_facility = NULL; +-static mc_node *cur_node = NULL; +- +- +- +-/* Enabling traces. */ +-#ifndef YYDEBUG +-# define YYDEBUG 0 +-#endif +- +-/* Enabling verbose error messages. */ +-#ifdef YYERROR_VERBOSE +-# undef YYERROR_VERBOSE +-# define YYERROR_VERBOSE 1 +-#else +-# define YYERROR_VERBOSE 0 +-#endif +- +-/* Enabling the token table. */ +-#ifndef YYTOKEN_TABLE +-# define YYTOKEN_TABLE 0 +-#endif +- +-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +-typedef union YYSTYPE +-#line 45 "mcparse.y" +-{ +- rc_uint_type ival; +- unichar *ustr; +- const mc_keyword *tok; +- mc_node *nod; +-} +-/* Line 193 of yacc.c. */ +-#line 186 "mcparse.c" +- YYSTYPE; +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +- +- +-/* Copy the second part of user declarations. */ +- +- +-/* Line 216 of yacc.c. */ +-#line 199 "mcparse.c" +- +-#ifdef short +-# undef short +-#endif +- +-#ifdef YYTYPE_UINT8 +-typedef YYTYPE_UINT8 yytype_uint8; +-#else +-typedef unsigned char yytype_uint8; +-#endif +- +-#ifdef YYTYPE_INT8 +-typedef YYTYPE_INT8 yytype_int8; +-#elif (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-typedef signed char yytype_int8; +-#else +-typedef short int yytype_int8; +-#endif +- +-#ifdef YYTYPE_UINT16 +-typedef YYTYPE_UINT16 yytype_uint16; +-#else +-typedef unsigned short int yytype_uint16; +-#endif +- +-#ifdef YYTYPE_INT16 +-typedef YYTYPE_INT16 yytype_int16; +-#else +-typedef short int yytype_int16; +-#endif +- +-#ifndef YYSIZE_T +-# ifdef __SIZE_TYPE__ +-# define YYSIZE_T __SIZE_TYPE__ +-# elif defined size_t +-# define YYSIZE_T size_t +-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYSIZE_T size_t +-# else +-# define YYSIZE_T unsigned int +-# endif +-#endif +- +-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) +- +-#ifndef YY_ +-# if defined YYENABLE_NLS && YYENABLE_NLS +-# if ENABLE_NLS +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YY_(msgid) dgettext ("bison-runtime", msgid) +-# endif +-# endif +-# ifndef YY_ +-# define YY_(msgid) msgid +-# endif +-#endif +- +-/* Suppress unused-variable warnings by "using" E. */ +-#if ! defined lint || defined __GNUC__ +-# define YYUSE(e) ((void) (e)) +-#else +-# define YYUSE(e) /* empty */ +-#endif +- +-/* Identity function, used to suppress warnings about constant conditions. */ +-#ifndef lint +-# define YYID(n) (n) +-#else +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static int +-YYID (int i) +-#else +-static int +-YYID (i) +- int i; +-#endif +-{ +- return i; +-} +-#endif +- +-#if ! defined yyoverflow || YYERROR_VERBOSE +- +-/* The parser invokes alloca or malloc; define the necessary symbols. */ +- +-# ifdef YYSTACK_USE_ALLOCA +-# if YYSTACK_USE_ALLOCA +-# ifdef __GNUC__ +-# define YYSTACK_ALLOC __builtin_alloca +-# elif defined __BUILTIN_VA_ARG_INCR +-# include /* INFRINGES ON USER NAME SPACE */ +-# elif defined _AIX +-# define YYSTACK_ALLOC __alloca +-# elif defined _MSC_VER +-# include /* INFRINGES ON USER NAME SPACE */ +-# define alloca _alloca +-# else +-# define YYSTACK_ALLOC alloca +-# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-# include /* INFRINGES ON USER NAME SPACE */ +-# ifndef _STDLIB_H +-# define _STDLIB_H 1 +-# endif +-# endif +-# endif +-# endif +-# endif +- +-# ifdef YYSTACK_ALLOC +- /* Pacify GCC's `empty if-body' warning. */ +-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +-# ifndef YYSTACK_ALLOC_MAXIMUM +- /* The OS might guarantee only one guard page at the bottom of the stack, +- and a page size can be as small as 4096 bytes. So we cannot safely +- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number +- to allow for a few compiler-allocated temporary stack slots. */ +-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +-# endif +-# else +-# define YYSTACK_ALLOC YYMALLOC +-# define YYSTACK_FREE YYFREE +-# ifndef YYSTACK_ALLOC_MAXIMUM +-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +-# endif +-# if (defined __cplusplus && ! defined _STDLIB_H \ +- && ! ((defined YYMALLOC || defined malloc) \ +- && (defined YYFREE || defined free))) +-# include /* INFRINGES ON USER NAME SPACE */ +-# ifndef _STDLIB_H +-# define _STDLIB_H 1 +-# endif +-# endif +-# ifndef YYMALLOC +-# define YYMALLOC malloc +-# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +-# endif +-# endif +-# ifndef YYFREE +-# define YYFREE free +-# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-void free (void *); /* INFRINGES ON USER NAME SPACE */ +-# endif +-# endif +-# endif +-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ +- +- +-#if (! defined yyoverflow \ +- && (! defined __cplusplus \ +- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) +- +-/* A type that is properly aligned for any stack member. */ +-union yyalloc +-{ +- yytype_int16 yyss; +- YYSTYPE yyvs; +- }; +- +-/* The size of the maximum gap between one aligned stack and the next. */ +-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +- +-/* The size of an array large to enough to hold all stacks, each with +- N elements. */ +-# define YYSTACK_BYTES(N) \ +- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ +- + YYSTACK_GAP_MAXIMUM) +- +-/* Copy COUNT objects from FROM to TO. The source and destination do +- not overlap. */ +-# ifndef YYCOPY +-# if defined __GNUC__ && 1 < __GNUC__ +-# define YYCOPY(To, From, Count) \ +- __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +-# else +-# define YYCOPY(To, From, Count) \ +- do \ +- { \ +- YYSIZE_T yyi; \ +- for (yyi = 0; yyi < (Count); yyi++) \ +- (To)[yyi] = (From)[yyi]; \ +- } \ +- while (YYID (0)) +-# endif +-# endif +- +-/* Relocate STACK from its old location to the new one. The +- local variables YYSIZE and YYSTACKSIZE give the old and new number of +- elements in the stack, and YYPTR gives the new location of the +- stack. Advance YYPTR to a properly aligned location for the next +- stack. */ +-# define YYSTACK_RELOCATE(Stack) \ +- do \ +- { \ +- YYSIZE_T yynewbytes; \ +- YYCOPY (&yyptr->Stack, Stack, yysize); \ +- Stack = &yyptr->Stack; \ +- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ +- yyptr += yynewbytes / sizeof (*yyptr); \ +- } \ +- while (YYID (0)) +- +-#endif +- +-/* YYFINAL -- State number of the termination state. */ +-#define YYFINAL 3 +-/* YYLAST -- Last index in YYTABLE. */ +-#define YYLAST 114 +- +-/* YYNTOKENS -- Number of terminals. */ +-#define YYNTOKENS 26 +-/* YYNNTS -- Number of nonterminals. */ +-#define YYNNTS 29 +-/* YYNRULES -- Number of rules. */ +-#define YYNRULES 82 +-/* YYNRULES -- Number of states. */ +-#define YYNSTATES 125 +- +-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +-#define YYUNDEFTOK 2 +-#define YYMAXUTOK 275 +- +-#define YYTRANSLATE(YYX) \ +- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) +- +-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +-static const yytype_uint8 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, 2, 2, 2, +- 22, 23, 2, 25, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 24, 2, +- 2, 21, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 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 +-}; +- +-#if YYDEBUG +-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in +- YYRHS. */ +-static const yytype_uint16 yyprhs[] = +-{ +- 0, 0, 3, 5, 6, 9, 11, 13, 15, 17, +- 23, 29, 33, 36, 42, 48, 52, 55, 61, 67, +- 71, 74, 78, 82, 86, 89, 91, 94, 96, 101, +- 105, 108, 110, 113, 115, 120, 124, 127, 129, 132, +- 134, 141, 148, 153, 157, 160, 161, 164, 167, 168, +- 173, 177, 181, 184, 185, 187, 190, 193, 194, 197, +- 200, 203, 207, 211, 215, 217, 220, 225, 227, 230, +- 232, 235, 237, 240, 246, 252, 258, 263, 266, 268, +- 270, 271, 272 +-}; +- +-/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +-static const yytype_int8 yyrhs[] = +-{ +- 27, 0, -1, 28, -1, -1, 28, 29, -1, 30, +- -1, 38, -1, 49, -1, 1, -1, 12, 21, 22, +- 31, 23, -1, 12, 21, 22, 31, 1, -1, 12, +- 21, 1, -1, 12, 1, -1, 10, 21, 22, 35, +- 23, -1, 10, 21, 22, 35, 1, -1, 10, 21, +- 1, -1, 10, 1, -1, 11, 21, 22, 33, 23, +- -1, 11, 21, 22, 33, 1, -1, 11, 21, 1, +- -1, 11, 1, -1, 13, 21, 20, -1, 14, 21, +- 4, -1, 14, 21, 1, -1, 14, 1, -1, 32, +- -1, 31, 32, -1, 1, -1, 51, 21, 20, 37, +- -1, 51, 21, 1, -1, 51, 1, -1, 34, -1, +- 33, 34, -1, 1, -1, 51, 21, 20, 37, -1, +- 51, 21, 1, -1, 51, 1, -1, 36, -1, 35, +- 36, -1, 1, -1, 51, 21, 20, 54, 24, 5, +- -1, 51, 21, 20, 54, 24, 1, -1, 51, 21, +- 20, 1, -1, 51, 21, 1, -1, 51, 1, -1, +- -1, 24, 4, -1, 24, 1, -1, -1, 40, 42, +- 39, 46, -1, 16, 21, 41, -1, 16, 21, 1, +- -1, 16, 1, -1, -1, 20, -1, 25, 20, -1, +- 25, 1, -1, -1, 42, 43, -1, 42, 44, -1, +- 42, 45, -1, 17, 21, 8, -1, 18, 21, 8, +- -1, 19, 21, 4, -1, 47, -1, 46, 47, -1, +- 50, 53, 48, 9, -1, 6, -1, 48, 6, -1, +- 1, -1, 48, 1, -1, 7, -1, 49, 7, -1, +- 15, 52, 21, 8, 3, -1, 15, 52, 21, 4, +- 3, -1, 15, 52, 21, 51, 1, -1, 15, 52, +- 21, 1, -1, 15, 1, -1, 4, -1, 8, -1, +- -1, -1, -1 +-}; +- +-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +-static const yytype_uint16 yyrline[] = +-{ +- 0, 67, 67, 70, 72, 74, 75, 76, 81, 85, +- 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +- 96, 97, 103, 107, 111, 118, 119, 120, 124, 128, +- 129, 133, 134, 135, 139, 143, 144, 148, 149, 150, +- 154, 158, 159, 160, 161, 166, 169, 173, 178, 177, +- 190, 191, 192, 196, 199, 203, 207, 212, 219, 225, +- 231, 239, 247, 255, 262, 263, 267, 277, 281, 293, +- 294, 297, 298, 312, 316, 321, 326, 331, 338, 339, +- 343, 347, 351 +-}; +-#endif +- +-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +- First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +-static const char *const yytname[] = +-{ +- "$end", "error", "$undefined", "NL", "MCIDENT", "MCFILENAME", "MCLINE", +- "MCCOMMENT", "MCTOKEN", "MCENDLINE", "MCLANGUAGENAMES", +- "MCFACILITYNAMES", "MCSEVERITYNAMES", "MCOUTPUTBASE", +- "MCMESSAGEIDTYPEDEF", "MCLANGUAGE", "MCMESSAGEID", "MCSEVERITY", +- "MCFACILITY", "MCSYMBOLICNAME", "MCNUMBER", "'='", "'('", "')'", "':'", +- "'+'", "$accept", "input", "entities", "entity", "global_section", +- "severitymaps", "severitymap", "facilitymaps", "facilitymap", "langmaps", +- "langmap", "alias_name", "message", "@1", "id", "vid", "sefasy_def", +- "severity", "facility", "symbol", "lang_entities", "lang_entity", +- "lines", "comments", "lang", "token", "lex_want_nl", "lex_want_line", +- "lex_want_filename", 0 +-}; +-#endif +- +-# ifdef YYPRINT +-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to +- token YYLEX-NUM. */ +-static const yytype_uint16 yytoknum[] = +-{ +- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, +- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, +- 275, 61, 40, 41, 58, 43 +-}; +-# endif +- +-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +-static const yytype_uint8 yyr1[] = +-{ +- 0, 26, 27, 28, 28, 29, 29, 29, 29, 30, +- 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, +- 30, 30, 30, 30, 30, 31, 31, 31, 32, 32, +- 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, +- 36, 36, 36, 36, 36, 37, 37, 37, 39, 38, +- 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, +- 42, 43, 44, 45, 46, 46, 47, 48, 48, 48, +- 48, 49, 49, 50, 50, 50, 50, 50, 51, 51, +- 52, 53, 54 +-}; +- +-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +-static const yytype_uint8 yyr2[] = +-{ +- 0, 2, 1, 0, 2, 1, 1, 1, 1, 5, +- 5, 3, 2, 5, 5, 3, 2, 5, 5, 3, +- 2, 3, 3, 3, 2, 1, 2, 1, 4, 3, +- 2, 1, 2, 1, 4, 3, 2, 1, 2, 1, +- 6, 6, 4, 3, 2, 0, 2, 2, 0, 4, +- 3, 3, 2, 0, 1, 2, 2, 0, 2, 2, +- 2, 3, 3, 3, 1, 2, 4, 1, 2, 1, +- 2, 1, 2, 5, 5, 5, 4, 2, 1, 1, +- 0, 0, 0 +-}; +- +-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state +- STATE-NUM when YYTABLE doesn't specify something else to do. Zero +- means the default is an error. */ +-static const yytype_uint8 yydefact[] = +-{ +- 3, 0, 0, 1, 8, 71, 0, 0, 0, 0, +- 0, 0, 4, 5, 6, 57, 7, 16, 0, 20, +- 0, 12, 0, 0, 24, 0, 52, 0, 48, 72, +- 15, 0, 19, 0, 11, 0, 21, 23, 22, 51, +- 54, 0, 50, 0, 0, 0, 0, 58, 59, 60, +- 39, 78, 79, 0, 37, 0, 33, 0, 31, 0, +- 27, 0, 25, 0, 56, 55, 0, 0, 0, 0, +- 49, 64, 81, 14, 13, 38, 44, 0, 18, 17, +- 32, 36, 0, 10, 9, 26, 30, 0, 61, 62, +- 63, 77, 0, 65, 0, 43, 0, 35, 45, 29, +- 45, 0, 69, 67, 0, 42, 0, 0, 34, 28, +- 76, 78, 79, 0, 70, 68, 66, 0, 47, 46, +- 74, 73, 75, 41, 40 +-}; +- +-/* YYDEFGOTO[NTERM-NUM]. */ +-static const yytype_int8 yydefgoto[] = +-{ +- -1, 1, 2, 12, 13, 61, 62, 57, 58, 53, +- 54, 108, 14, 46, 15, 42, 28, 47, 48, 49, +- 70, 71, 104, 16, 72, 55, 92, 94, 106 +-}; +- +-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing +- STATE-NUM. */ +-#define YYPACT_NINF -34 +-static const yytype_int8 yypact[] = +-{ +- -34, 62, 70, -34, -34, -34, 15, 22, 30, -15, +- 34, 37, -34, -34, -34, -34, 56, -34, 10, -34, +- 12, -34, 20, 25, -34, 52, -34, 0, 80, -34, +- -34, 71, -34, 84, -34, 86, -34, -34, -34, -34, +- -34, 45, -34, 1, 68, 74, 76, -34, -34, -34, +- -34, -34, -34, 4, -34, 38, -34, 6, -34, 39, +- -34, 29, -34, 40, -34, -34, 93, 94, 99, 43, +- 76, -34, -34, -34, -34, -34, -34, 46, -34, -34, +- -34, -34, 47, -34, -34, -34, -34, 49, -34, -34, +- -34, -34, 83, -34, 3, -34, 2, -34, 81, -34, +- 81, 92, -34, -34, 48, -34, 82, 72, -34, -34, +- -34, 104, 105, 108, -34, -34, -34, 73, -34, -34, +- -34, -34, -34, -34, -34 +-}; +- +-/* YYPGOTO[NTERM-NUM]. */ +-static const yytype_int8 yypgoto[] = +-{ +- -34, -34, -34, -34, -34, -34, 50, -34, 53, -34, +- 59, 13, -34, -34, -34, -34, -34, -34, -34, -34, +- -34, 44, -34, -34, -34, -33, -34, -34, -34 +-}; +- +-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If +- positive, shift that token. If negative, reduce the rule which +- number is the opposite. If zero, do what YYDEFACT says. +- If YYTABLE_NINF, syntax error. */ +-#define YYTABLE_NINF -83 +-static const yytype_int8 yytable[] = +-{ +- 59, 39, 63, 105, 102, 73, 23, 78, 51, 103, +- 51, 30, 52, 32, 52, -53, 17, -53, -53, -53, +- 40, 34, 66, 19, 59, 41, -82, 74, 63, 79, +- 83, 21, 31, 51, 33, 24, 18, 52, 26, 76, +- 81, 86, 35, 20, 91, 36, 64, 95, 97, 114, +- 99, 22, 84, 37, 115, 25, 38, 116, 27, 77, +- 82, 87, 3, 29, -80, 65, 96, 98, 113, 100, +- -2, 4, 50, 118, 123, 51, 119, 5, 124, 52, +- 6, 7, 8, 9, 10, 56, 11, 60, 51, 67, +- 51, 69, 52, 110, 52, 68, 111, 43, 44, 45, +- 112, 88, 89, 90, 101, 107, 117, 120, 121, 122, +- 80, 85, 75, 109, 93 +-}; +- +-static const yytype_uint8 yycheck[] = +-{ +- 33, 1, 35, 1, 1, 1, 21, 1, 4, 6, +- 4, 1, 8, 1, 8, 15, 1, 17, 18, 19, +- 20, 1, 21, 1, 57, 25, 24, 23, 61, 23, +- 1, 1, 22, 4, 22, 1, 21, 8, 1, 1, +- 1, 1, 22, 21, 1, 20, 1, 1, 1, 1, +- 1, 21, 23, 1, 6, 21, 4, 9, 21, 21, +- 21, 21, 0, 7, 21, 20, 20, 20, 101, 20, +- 0, 1, 1, 1, 1, 4, 4, 7, 5, 8, +- 10, 11, 12, 13, 14, 1, 16, 1, 4, 21, +- 4, 15, 8, 1, 8, 21, 4, 17, 18, 19, +- 8, 8, 8, 4, 21, 24, 24, 3, 3, 1, +- 57, 61, 53, 100, 70 +-}; +- +-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing +- symbol of state STATE-NUM. */ +-static const yytype_uint8 yystos[] = +-{ +- 0, 27, 28, 0, 1, 7, 10, 11, 12, 13, +- 14, 16, 29, 30, 38, 40, 49, 1, 21, 1, +- 21, 1, 21, 21, 1, 21, 1, 21, 42, 7, +- 1, 22, 1, 22, 1, 22, 20, 1, 4, 1, +- 20, 25, 41, 17, 18, 19, 39, 43, 44, 45, +- 1, 4, 8, 35, 36, 51, 1, 33, 34, 51, +- 1, 31, 32, 51, 1, 20, 21, 21, 21, 15, +- 46, 47, 50, 1, 23, 36, 1, 21, 1, 23, +- 34, 1, 21, 1, 23, 32, 1, 21, 8, 8, +- 4, 1, 52, 47, 53, 1, 20, 1, 20, 1, +- 20, 21, 1, 6, 48, 1, 54, 24, 37, 37, +- 1, 4, 8, 51, 1, 6, 9, 24, 1, 4, +- 3, 3, 1, 1, 5 +-}; +- +-#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 yyerrorlab +- +- +-/* 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); \ +- yytoken = YYTRANSLATE (yychar); \ +- YYPOPSTACK (1); \ +- goto yybackup; \ +- } \ +- else \ +- { \ +- yyerror (YY_("syntax error: cannot back up")); \ +- YYERROR; \ +- } \ +-while (YYID (0)) +- +- +-#define YYTERROR 1 +-#define YYERRCODE 256 +- +- +-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. +- If N is 0, then set CURRENT to the empty location which ends +- the previous symbol: RHS[0] (always defined). */ +- +-#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +-#ifndef YYLLOC_DEFAULT +-# define YYLLOC_DEFAULT(Current, Rhs, N) \ +- do \ +- if (YYID (N)) \ +- { \ +- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ +- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ +- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ +- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ +- } \ +- else \ +- { \ +- (Current).first_line = (Current).last_line = \ +- YYRHSLOC (Rhs, 0).last_line; \ +- (Current).first_column = (Current).last_column = \ +- YYRHSLOC (Rhs, 0).last_column; \ +- } \ +- while (YYID (0)) +-#endif +- +- +-/* YY_LOCATION_PRINT -- Print the location on the stream. +- This macro was not mandated originally: define only if we know +- we won't break user code: when these are the locations we know. */ +- +-#ifndef YY_LOCATION_PRINT +-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL +-# define YY_LOCATION_PRINT(File, Loc) \ +- fprintf (File, "%d.%d-%d.%d", \ +- (Loc).first_line, (Loc).first_column, \ +- (Loc).last_line, (Loc).last_column) +-# else +-# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +-# endif +-#endif +- +- +-/* YYLEX -- calling `yylex' with the right arguments. */ +- +-#ifdef YYLEX_PARAM +-# define YYLEX yylex (YYLEX_PARAM) +-#else +-# define YYLEX yylex () +-#endif +- +-/* Enable debugging if requested. */ +-#if YYDEBUG +- +-# ifndef YYFPRINTF +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYFPRINTF fprintf +-# endif +- +-# define YYDPRINTF(Args) \ +-do { \ +- if (yydebug) \ +- YYFPRINTF Args; \ +-} while (YYID (0)) +- +-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +-do { \ +- if (yydebug) \ +- { \ +- YYFPRINTF (stderr, "%s ", Title); \ +- yy_symbol_print (stderr, \ +- Type, Value); \ +- YYFPRINTF (stderr, "\n"); \ +- } \ +-} while (YYID (0)) +- +- +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-/*ARGSUSED*/ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +-#else +-static void +-yy_symbol_value_print (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE const * const yyvaluep; +-#endif +-{ +- if (!yyvaluep) +- return; +-# ifdef YYPRINT +- if (yytype < YYNTOKENS) +- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +-# else +- YYUSE (yyoutput); +-# endif +- switch (yytype) +- { +- default: +- break; +- } +-} +- +- +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +-#else +-static void +-yy_symbol_print (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE const * const yyvaluep; +-#endif +-{ +- if (yytype < YYNTOKENS) +- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +- else +- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); +- +- yy_symbol_value_print (yyoutput, yytype, yyvaluep); +- YYFPRINTF (yyoutput, ")"); +-} +- +-/*------------------------------------------------------------------. +-| yy_stack_print -- Print the state stack from its BOTTOM up to its | +-| TOP (included). | +-`------------------------------------------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +-#else +-static void +-yy_stack_print (bottom, top) +- yytype_int16 *bottom; +- yytype_int16 *top; +-#endif +-{ +- YYFPRINTF (stderr, "Stack now"); +- for (; bottom <= top; ++bottom) +- YYFPRINTF (stderr, " %d", *bottom); +- YYFPRINTF (stderr, "\n"); +-} +- +-# define YY_STACK_PRINT(Bottom, Top) \ +-do { \ +- if (yydebug) \ +- yy_stack_print ((Bottom), (Top)); \ +-} while (YYID (0)) +- +- +-/*------------------------------------------------. +-| Report that the YYRULE is going to be reduced. | +-`------------------------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +-#else +-static void +-yy_reduce_print (yyvsp, yyrule) +- YYSTYPE *yyvsp; +- int yyrule; +-#endif +-{ +- int yynrhs = yyr2[yyrule]; +- int yyi; +- unsigned long int yylno = yyrline[yyrule]; +- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", +- yyrule - 1, yylno); +- /* The symbols being reduced. */ +- for (yyi = 0; yyi < yynrhs; yyi++) +- { +- fprintf (stderr, " $%d = ", yyi + 1); +- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], +- &(yyvsp[(yyi + 1) - (yynrhs)]) +- ); +- fprintf (stderr, "\n"); +- } +-} +- +-# define YY_REDUCE_PRINT(Rule) \ +-do { \ +- if (yydebug) \ +- yy_reduce_print (yyvsp, Rule); \ +-} while (YYID (0)) +- +-/* Nonzero means print parse trace. It is left uninitialized so that +- multiple parsers can coexist. */ +-int yydebug; +-#else /* !YYDEBUG */ +-# define YYDPRINTF(Args) +-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +-# define YY_STACK_PRINT(Bottom, Top) +-# define YY_REDUCE_PRINT(Rule) +-#endif /* !YYDEBUG */ +- +- +-/* YYINITDEPTH -- initial size of the parser's stacks. */ +-#ifndef YYINITDEPTH +-# define YYINITDEPTH 200 +-#endif +- +-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only +- if the built-in stack extension method is used). +- +- Do not make this value too large; the results are undefined if +- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) +- evaluated with infinite-precision integer arithmetic. */ +- +-#ifndef YYMAXDEPTH +-# define YYMAXDEPTH 10000 +-#endif +- +- +- +-#if YYERROR_VERBOSE +- +-# ifndef yystrlen +-# if defined __GLIBC__ && defined _STRING_H +-# define yystrlen strlen +-# else +-/* Return the length of YYSTR. */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static YYSIZE_T +-yystrlen (const char *yystr) +-#else +-static YYSIZE_T +-yystrlen (yystr) +- const char *yystr; +-#endif +-{ +- YYSIZE_T yylen; +- for (yylen = 0; yystr[yylen]; yylen++) +- continue; +- return yylen; +-} +-# endif +-# endif +- +-# ifndef yystpcpy +-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +-# define yystpcpy stpcpy +-# else +-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in +- YYDEST. */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static char * +-yystpcpy (char *yydest, const char *yysrc) +-#else +-static char * +-yystpcpy (yydest, yysrc) +- char *yydest; +- const char *yysrc; +-#endif +-{ +- char *yyd = yydest; +- const char *yys = yysrc; +- +- while ((*yyd++ = *yys++) != '\0') +- continue; +- +- return yyd - 1; +-} +-# endif +-# endif +- +-# ifndef yytnamerr +-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary +- quotes and backslashes, so that it's suitable for yyerror. The +- heuristic is that double-quoting is unnecessary unless the string +- contains an apostrophe, a comma, or backslash (other than +- backslash-backslash). YYSTR is taken from yytname. If YYRES is +- null, do not copy; instead, return the length of what the result +- would have been. */ +-static YYSIZE_T +-yytnamerr (char *yyres, const char *yystr) +-{ +- if (*yystr == '"') +- { +- YYSIZE_T yyn = 0; +- char const *yyp = yystr; +- +- for (;;) +- switch (*++yyp) +- { +- case '\'': +- case ',': +- goto do_not_strip_quotes; +- +- case '\\': +- if (*++yyp != '\\') +- goto do_not_strip_quotes; +- /* Fall through. */ +- default: +- if (yyres) +- yyres[yyn] = *yyp; +- yyn++; +- break; +- +- case '"': +- if (yyres) +- yyres[yyn] = '\0'; +- return yyn; +- } +- do_not_strip_quotes: ; +- } +- +- if (! yyres) +- return yystrlen (yystr); +- +- return yystpcpy (yyres, yystr) - yyres; +-} +-# endif +- +-/* Copy into YYRESULT an error message about the unexpected token +- YYCHAR while in state YYSTATE. Return the number of bytes copied, +- including the terminating null byte. If YYRESULT is null, do not +- copy anything; just return the number of bytes that would be +- copied. As a special case, return 0 if an ordinary "syntax error" +- message will do. Return YYSIZE_MAXIMUM if overflow occurs during +- size calculation. */ +-static YYSIZE_T +-yysyntax_error (char *yyresult, int yystate, int yychar) +-{ +- int yyn = yypact[yystate]; +- +- if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) +- return 0; +- else +- { +- int yytype = YYTRANSLATE (yychar); +- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); +- YYSIZE_T yysize = yysize0; +- YYSIZE_T yysize1; +- int yysize_overflow = 0; +- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; +- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; +- int yyx; +- +-# if 0 +- /* This is so xgettext sees the translatable formats that are +- constructed on the fly. */ +- YY_("syntax error, unexpected %s"); +- YY_("syntax error, unexpected %s, expecting %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s or %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +-# endif +- char *yyfmt; +- char const *yyf; +- static char const yyunexpected[] = "syntax error, unexpected %s"; +- static char const yyexpecting[] = ", expecting %s"; +- static char const yyor[] = " or %s"; +- char yyformat[sizeof yyunexpected +- + sizeof yyexpecting - 1 +- + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) +- * (sizeof yyor - 1))]; +- char const *yyprefix = yyexpecting; +- +- /* Start YYX at -YYN if negative to avoid negative indexes in +- YYCHECK. */ +- int yyxbegin = yyn < 0 ? -yyn : 0; +- +- /* Stay within bounds of both yycheck and yytname. */ +- int yychecklim = YYLAST - yyn + 1; +- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; +- int yycount = 1; +- +- yyarg[0] = yytname[yytype]; +- yyfmt = yystpcpy (yyformat, yyunexpected); +- +- for (yyx = yyxbegin; yyx < yyxend; ++yyx) +- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) +- { +- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) +- { +- yycount = 1; +- yysize = yysize0; +- yyformat[sizeof yyunexpected - 1] = '\0'; +- break; +- } +- yyarg[yycount++] = yytname[yyx]; +- yysize1 = yysize + yytnamerr (0, yytname[yyx]); +- yysize_overflow |= (yysize1 < yysize); +- yysize = yysize1; +- yyfmt = yystpcpy (yyfmt, yyprefix); +- yyprefix = yyor; +- } +- +- yyf = YY_(yyformat); +- yysize1 = yysize + yystrlen (yyf); +- yysize_overflow |= (yysize1 < yysize); +- yysize = yysize1; +- +- if (yysize_overflow) +- return YYSIZE_MAXIMUM; +- +- if (yyresult) +- { +- /* Avoid sprintf, as that infringes on the user's name space. +- Don't have undefined behavior even if the translation +- produced a string with the wrong number of "%s"s. */ +- char *yyp = yyresult; +- int yyi = 0; +- while ((*yyp = *yyf) != '\0') +- { +- if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) +- { +- yyp += yytnamerr (yyp, yyarg[yyi++]); +- yyf += 2; +- } +- else +- { +- yyp++; +- yyf++; +- } +- } +- } +- return yysize; +- } +-} +-#endif /* YYERROR_VERBOSE */ +- +- +-/*-----------------------------------------------. +-| Release the memory associated to this symbol. | +-`-----------------------------------------------*/ +- +-/*ARGSUSED*/ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +-#else +-static void +-yydestruct (yymsg, yytype, yyvaluep) +- const char *yymsg; +- int yytype; +- YYSTYPE *yyvaluep; +-#endif +-{ +- YYUSE (yyvaluep); +- +- if (!yymsg) +- yymsg = "Deleting"; +- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); +- +- switch (yytype) +- { +- +- default: +- break; +- } +-} +- +- +-/* Prevent warnings from -Wmissing-prototypes. */ +- +-#ifdef YYPARSE_PARAM +-#if defined __STDC__ || defined __cplusplus +-int yyparse (void *YYPARSE_PARAM); +-#else +-int yyparse (); +-#endif +-#else /* ! YYPARSE_PARAM */ +-#if defined __STDC__ || defined __cplusplus +-int yyparse (void); +-#else +-int yyparse (); +-#endif +-#endif /* ! YYPARSE_PARAM */ +- +- +- +-/* The look-ahead symbol. */ +-int yychar; +- +-/* The semantic value of the look-ahead symbol. */ +-YYSTYPE yylval; +- +-/* Number of syntax errors so far. */ +-int yynerrs; +- +- +- +-/*----------. +-| yyparse. | +-`----------*/ +- +-#ifdef YYPARSE_PARAM +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-int +-yyparse (void *YYPARSE_PARAM) +-#else +-int +-yyparse (YYPARSE_PARAM) +- void *YYPARSE_PARAM; +-#endif +-#else /* ! YYPARSE_PARAM */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-int +-yyparse (void) +-#else +-int +-yyparse () +- +-#endif +-#endif +-{ +- +- int yystate; +- int yyn; +- int yyresult; +- /* Number of tokens to shift before error messages enabled. */ +- int yyerrstatus; +- /* Look-ahead token as an internal (translated) token number. */ +- int yytoken = 0; +-#if YYERROR_VERBOSE +- /* Buffer for error messages, and its allocated size. */ +- char yymsgbuf[128]; +- char *yymsg = yymsgbuf; +- YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +-#endif +- +- /* Three stacks and their tools: +- `yyss': related to states, +- `yyvs': related to semantic values, +- `yyls': related to locations. +- +- Refer to the stacks thru separate pointers, to allow yyoverflow +- to reallocate them elsewhere. */ +- +- /* The state stack. */ +- yytype_int16 yyssa[YYINITDEPTH]; +- yytype_int16 *yyss = yyssa; +- yytype_int16 *yyssp; +- +- /* The semantic value stack. */ +- YYSTYPE yyvsa[YYINITDEPTH]; +- YYSTYPE *yyvs = yyvsa; +- YYSTYPE *yyvsp; +- +- +- +-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) +- +- YYSIZE_T yystacksize = YYINITDEPTH; +- +- /* The variables used to return semantic value and location from the +- action routines. */ +- YYSTYPE yyval; +- +- +- /* The number of symbols on the RHS of the reduced rule. +- Keep to zero when no symbol should be popped. */ +- int yylen = 0; +- +- YYDPRINTF ((stderr, "Starting parse\n")); +- +- 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; +- yyvsp = yyvs; +- +- goto yysetstate; +- +-/*------------------------------------------------------------. +-| yynewstate -- Push a new state, which is found in yystate. | +-`------------------------------------------------------------*/ +- yynewstate: +- /* In all cases, when you get here, the value and location stacks +- have just been pushed. So pushing a state here evens the stacks. */ +- yyssp++; +- +- yysetstate: +- *yyssp = yystate; +- +- if (yyss + yystacksize - 1 <= yyssp) +- { +- /* Get the current used size of the three stacks, in elements. */ +- YYSIZE_T yysize = yyssp - yyss + 1; +- +-#ifdef yyoverflow +- { +- /* Give user a chance to reallocate the stack. Use copies of +- these so that the &'s don't force the real ones into +- memory. */ +- YYSTYPE *yyvs1 = yyvs; +- yytype_int16 *yyss1 = yyss; +- +- +- /* Each stack pointer address is followed by the size of the +- data in use in that stack, in bytes. This used to be a +- conditional around just the two extra args, but that might +- be undefined if yyoverflow is a macro. */ +- yyoverflow (YY_("memory exhausted"), +- &yyss1, yysize * sizeof (*yyssp), +- &yyvs1, yysize * sizeof (*yyvsp), +- +- &yystacksize); +- +- yyss = yyss1; +- yyvs = yyvs1; +- } +-#else /* no yyoverflow */ +-# ifndef YYSTACK_RELOCATE +- goto yyexhaustedlab; +-# else +- /* Extend the stack our own way. */ +- if (YYMAXDEPTH <= yystacksize) +- goto yyexhaustedlab; +- yystacksize *= 2; +- if (YYMAXDEPTH < yystacksize) +- yystacksize = YYMAXDEPTH; +- +- { +- yytype_int16 *yyss1 = yyss; +- union yyalloc *yyptr = +- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); +- if (! yyptr) +- goto yyexhaustedlab; +- YYSTACK_RELOCATE (yyss); +- YYSTACK_RELOCATE (yyvs); +- +-# undef YYSTACK_RELOCATE +- if (yyss1 != yyssa) +- YYSTACK_FREE (yyss1); +- } +-# endif +-#endif /* no yyoverflow */ +- +- yyssp = yyss + yysize - 1; +- yyvsp = yyvs + yysize - 1; +- +- +- YYDPRINTF ((stderr, "Stack size increased to %lu\n", +- (unsigned long int) yystacksize)); +- +- if (yyss + yystacksize - 1 <= yyssp) +- YYABORT; +- } +- +- YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +- +- goto yybackup; +- +-/*-----------. +-| yybackup. | +-`-----------*/ +-yybackup: +- +- /* Do appropriate processing given the current state. Read a +- look-ahead token if we need one and don't already have one. */ +- +- /* First try to decide what to do without reference to look-ahead token. */ +- yyn = yypact[yystate]; +- if (yyn == YYPACT_NINF) +- goto yydefault; +- +- /* Not known => get a look-ahead token if don't already have one. */ +- +- /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ +- if (yychar == YYEMPTY) +- { +- YYDPRINTF ((stderr, "Reading a token: ")); +- yychar = YYLEX; +- } +- +- if (yychar <= YYEOF) +- { +- yychar = yytoken = YYEOF; +- YYDPRINTF ((stderr, "Now at end of input.\n")); +- } +- else +- { +- yytoken = YYTRANSLATE (yychar); +- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); +- } +- +- /* If the proper action on seeing token YYTOKEN is to reduce or to +- detect an error, take that action. */ +- yyn += yytoken; +- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) +- goto yydefault; +- yyn = yytable[yyn]; +- if (yyn <= 0) +- { +- if (yyn == 0 || yyn == YYTABLE_NINF) +- goto yyerrlab; +- yyn = -yyn; +- goto yyreduce; +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- /* Count tokens shifted since error; after three, turn off error +- status. */ +- if (yyerrstatus) +- yyerrstatus--; +- +- /* Shift the look-ahead token. */ +- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); +- +- /* Discard the shifted token unless it is eof. */ +- if (yychar != YYEOF) +- yychar = YYEMPTY; +- +- yystate = yyn; +- *++yyvsp = yylval; +- +- goto yynewstate; +- +- +-/*-----------------------------------------------------------. +-| yydefault -- do the default action for the current state. | +-`-----------------------------------------------------------*/ +-yydefault: +- yyn = yydefact[yystate]; +- if (yyn == 0) +- goto yyerrlab; +- goto yyreduce; +- +- +-/*-----------------------------. +-| yyreduce -- Do a reduction. | +-`-----------------------------*/ +-yyreduce: +- /* yyn is the number of a rule to reduce with. */ +- yylen = yyr2[yyn]; +- +- /* If YYLEN is nonzero, implement the default value of the action: +- `$$ = $1'. +- +- Otherwise, the following line sets YYVAL to garbage. +- This behavior is undocumented and Bison +- users should not rely upon it. Assigning to YYVAL +- unconditionally makes the parser a bit smaller, and it avoids a +- GCC warning that YYVAL may be used uninitialized. */ +- yyval = yyvsp[1-yylen]; +- +- +- YY_REDUCE_PRINT (yyn); +- switch (yyn) +- { +- case 7: +-#line 77 "mcparse.y" +- { +- cur_node = mc_add_node (); +- cur_node->user_text = (yyvsp[(1) - (1)].ustr); +- } +- break; +- +- case 8: +-#line 81 "mcparse.y" +- { mc_fatal ("syntax error"); } +- break; +- +- case 10: +-#line 86 "mcparse.y" +- { mc_fatal ("missing ')' in SeverityNames"); } +- break; +- +- case 11: +-#line 87 "mcparse.y" +- { mc_fatal ("missing '(' in SeverityNames"); } +- break; +- +- case 12: +-#line 88 "mcparse.y" +- { mc_fatal ("missing '=' for SeverityNames"); } +- break; +- +- case 14: +-#line 90 "mcparse.y" +- { mc_fatal ("missing ')' in LanguageNames"); } +- break; +- +- case 15: +-#line 91 "mcparse.y" +- { mc_fatal ("missing '(' in LanguageNames"); } +- break; +- +- case 16: +-#line 92 "mcparse.y" +- { mc_fatal ("missing '=' for LanguageNames"); } +- break; +- +- case 18: +-#line 94 "mcparse.y" +- { mc_fatal ("missing ')' in FacilityNames"); } +- break; +- +- case 19: +-#line 95 "mcparse.y" +- { mc_fatal ("missing '(' in FacilityNames"); } +- break; +- +- case 20: +-#line 96 "mcparse.y" +- { mc_fatal ("missing '=' for FacilityNames"); } +- break; +- +- case 21: +-#line 98 "mcparse.y" +- { +- if ((yyvsp[(3) - (3)].ival) != 10 && (yyvsp[(3) - (3)].ival) != 16) +- mc_fatal ("OutputBase allows 10 or 16 as value"); +- mcset_out_values_are_decimal = ((yyvsp[(3) - (3)].ival) == 10 ? 1 : 0); +- } +- break; +- +- case 22: +-#line 104 "mcparse.y" +- { +- mcset_msg_id_typedef = (yyvsp[(3) - (3)].ustr); +- } +- break; +- +- case 23: +-#line 108 "mcparse.y" +- { +- mc_fatal ("MessageIdTypedef expects an identifier"); +- } +- break; +- +- case 24: +-#line 112 "mcparse.y" +- { +- mc_fatal ("missing '=' for MessageIdTypedef"); +- } +- break; +- +- case 27: +-#line 120 "mcparse.y" +- { mc_fatal ("severity ident missing"); } +- break; +- +- case 28: +-#line 125 "mcparse.y" +- { +- mc_add_keyword ((yyvsp[(1) - (4)].ustr), MCTOKEN, "severity", (yyvsp[(3) - (4)].ival), (yyvsp[(4) - (4)].ustr)); +- } +- break; +- +- case 29: +-#line 128 "mcparse.y" +- { mc_fatal ("severity number missing"); } +- break; +- +- case 30: +-#line 129 "mcparse.y" +- { mc_fatal ("severity missing '='"); } +- break; +- +- case 33: +-#line 135 "mcparse.y" +- { mc_fatal ("missing ident in FacilityNames"); } +- break; +- +- case 34: +-#line 140 "mcparse.y" +- { +- mc_add_keyword ((yyvsp[(1) - (4)].ustr), MCTOKEN, "facility", (yyvsp[(3) - (4)].ival), (yyvsp[(4) - (4)].ustr)); +- } +- break; +- +- case 35: +-#line 143 "mcparse.y" +- { mc_fatal ("facility number missing"); } +- break; +- +- case 36: +-#line 144 "mcparse.y" +- { mc_fatal ("facility missing '='"); } +- break; +- +- case 39: +-#line 150 "mcparse.y" +- { mc_fatal ("missing ident in LanguageNames"); } +- break; +- +- case 40: +-#line 155 "mcparse.y" +- { +- mc_add_keyword ((yyvsp[(1) - (6)].ustr), MCTOKEN, "language", (yyvsp[(3) - (6)].ival), (yyvsp[(6) - (6)].ustr)); +- } +- break; +- +- case 41: +-#line 158 "mcparse.y" +- { mc_fatal ("missing filename in LanguageNames"); } +- break; +- +- case 42: +-#line 159 "mcparse.y" +- { mc_fatal ("missing ':' in LanguageNames"); } +- break; +- +- case 43: +-#line 160 "mcparse.y" +- { mc_fatal ("missing language code in LanguageNames"); } +- break; +- +- case 44: +-#line 161 "mcparse.y" +- { mc_fatal ("missing '=' for LanguageNames"); } +- break; +- +- case 45: +-#line 166 "mcparse.y" +- { +- (yyval.ustr) = NULL; +- } +- break; +- +- case 46: +-#line 170 "mcparse.y" +- { +- (yyval.ustr) = (yyvsp[(2) - (2)].ustr); +- } +- break; +- +- case 47: +-#line 173 "mcparse.y" +- { mc_fatal ("illegal token in identifier"); (yyval.ustr) = NULL; } +- break; +- +- case 48: +-#line 178 "mcparse.y" +- { +- cur_node = mc_add_node (); +- cur_node->symbol = mc_last_symbol; +- cur_node->facility = mc_cur_facility; +- cur_node->severity = mc_cur_severity; +- cur_node->id = ((yyvsp[(1) - (2)].ival) & 0xffffUL); +- cur_node->vid = ((yyvsp[(1) - (2)].ival) & 0xffffUL) | mc_sefa_val; +- mc_last_id = (yyvsp[(1) - (2)].ival); +- } +- break; +- +- case 50: +-#line 190 "mcparse.y" +- { (yyval.ival) = (yyvsp[(3) - (3)].ival); } +- break; +- +- case 51: +-#line 191 "mcparse.y" +- { mc_fatal ("missing number in MessageId"); (yyval.ival) = 0; } +- break; +- +- case 52: +-#line 192 "mcparse.y" +- { mc_fatal ("missing '=' for MessageId"); (yyval.ival) = 0; } +- break; +- +- case 53: +-#line 196 "mcparse.y" +- { +- (yyval.ival) = ++mc_last_id; +- } +- break; +- +- case 54: +-#line 200 "mcparse.y" +- { +- (yyval.ival) = (yyvsp[(1) - (1)].ival); +- } +- break; +- +- case 55: +-#line 204 "mcparse.y" +- { +- (yyval.ival) = mc_last_id + (yyvsp[(2) - (2)].ival); +- } +- break; +- +- case 56: +-#line 207 "mcparse.y" +- { mc_fatal ("missing number after MessageId '+'"); } +- break; +- +- case 57: +-#line 212 "mcparse.y" +- { +- (yyval.ival) = 0; +- mc_sefa_val = (mcset_custom_bit ? 1 : 0) << 29; +- mc_last_symbol = NULL; +- mc_cur_severity = NULL; +- mc_cur_facility = NULL; +- } +- break; +- +- case 58: +-#line 220 "mcparse.y" +- { +- if ((yyvsp[(1) - (2)].ival) & 1) +- mc_warn (_("duplicate definition of Severity")); +- (yyval.ival) = (yyvsp[(1) - (2)].ival) | 1; +- } +- break; +- +- case 59: +-#line 226 "mcparse.y" +- { +- if ((yyvsp[(1) - (2)].ival) & 2) +- mc_warn (_("duplicate definition of Facility")); +- (yyval.ival) = (yyvsp[(1) - (2)].ival) | 2; +- } +- break; +- +- case 60: +-#line 232 "mcparse.y" +- { +- if ((yyvsp[(1) - (2)].ival) & 4) +- mc_warn (_("duplicate definition of SymbolicName")); +- (yyval.ival) = (yyvsp[(1) - (2)].ival) | 4; +- } +- break; +- +- case 61: +-#line 240 "mcparse.y" +- { +- mc_sefa_val &= ~ (0x3UL << 30); +- mc_sefa_val |= (((yyvsp[(3) - (3)].tok)->nval & 0x3UL) << 30); +- mc_cur_severity = (yyvsp[(3) - (3)].tok); +- } +- break; +- +- case 62: +-#line 248 "mcparse.y" +- { +- mc_sefa_val &= ~ (0xfffUL << 16); +- mc_sefa_val |= (((yyvsp[(3) - (3)].tok)->nval & 0xfffUL) << 16); +- mc_cur_facility = (yyvsp[(3) - (3)].tok); +- } +- break; +- +- case 63: +-#line 256 "mcparse.y" +- { +- mc_last_symbol = (yyvsp[(3) - (3)].ustr); +- } +- break; +- +- case 66: +-#line 268 "mcparse.y" +- { +- mc_node_lang *h; +- h = mc_add_node_lang (cur_node, (yyvsp[(1) - (4)].tok), cur_node->vid); +- h->message = (yyvsp[(3) - (4)].ustr); +- if (mcset_max_message_length != 0 && unichar_len (h->message) > mcset_max_message_length) +- mc_warn ("message length to long"); +- } +- break; +- +- case 67: +-#line 278 "mcparse.y" +- { +- (yyval.ustr) = (yyvsp[(1) - (1)].ustr); +- } +- break; +- +- case 68: +-#line 282 "mcparse.y" +- { +- unichar *h; +- rc_uint_type l1,l2; +- l1 = unichar_len ((yyvsp[(1) - (2)].ustr)); +- l2 = unichar_len ((yyvsp[(2) - (2)].ustr)); +- h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar)); +- if (l1) memcpy (h, (yyvsp[(1) - (2)].ustr), l1 * sizeof (unichar)); +- if (l2) memcpy (&h[l1], (yyvsp[(2) - (2)].ustr), l2 * sizeof (unichar)); +- h[l1 + l2] = 0; +- (yyval.ustr) = h; +- } +- break; +- +- case 69: +-#line 293 "mcparse.y" +- { mc_fatal ("missing end of message text"); (yyval.ustr) = NULL; } +- break; +- +- case 70: +-#line 294 "mcparse.y" +- { mc_fatal ("missing end of message text"); (yyval.ustr) = (yyvsp[(1) - (2)].ustr); } +- break; +- +- case 71: +-#line 297 "mcparse.y" +- { (yyval.ustr) = (yyvsp[(1) - (1)].ustr); } +- break; +- +- case 72: +-#line 299 "mcparse.y" +- { +- unichar *h; +- rc_uint_type l1,l2; +- l1 = unichar_len ((yyvsp[(1) - (2)].ustr)); +- l2 = unichar_len ((yyvsp[(2) - (2)].ustr)); +- h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar)); +- if (l1) memcpy (h, (yyvsp[(1) - (2)].ustr), l1 * sizeof (unichar)); +- if (l2) memcpy (&h[l1], (yyvsp[(2) - (2)].ustr), l2 * sizeof (unichar)); +- h[l1 + l2] = 0; +- (yyval.ustr) = h; +- } +- break; +- +- case 73: +-#line 313 "mcparse.y" +- { +- (yyval.tok) = (yyvsp[(4) - (5)].tok); +- } +- break; +- +- case 74: +-#line 317 "mcparse.y" +- { +- (yyval.tok) = NULL; +- mc_fatal (_("undeclared language identifier")); +- } +- break; +- +- case 75: +-#line 322 "mcparse.y" +- { +- (yyval.tok) = NULL; +- mc_fatal ("missing newline after Language"); +- } +- break; +- +- case 76: +-#line 327 "mcparse.y" +- { +- (yyval.tok) = NULL; +- mc_fatal ("missing ident for Language"); +- } +- break; +- +- case 77: +-#line 332 "mcparse.y" +- { +- (yyval.tok) = NULL; +- mc_fatal ("missing '=' for Language"); +- } +- break; +- +- case 78: +-#line 338 "mcparse.y" +- { (yyval.ustr) = (yyvsp[(1) - (1)].ustr); } +- break; +- +- case 79: +-#line 339 "mcparse.y" +- { (yyval.ustr) = (yyvsp[(1) - (1)].tok)->usz; } +- break; +- +- case 80: +-#line 343 "mcparse.y" +- { mclex_want_nl = 1; } +- break; +- +- case 81: +-#line 347 "mcparse.y" +- { mclex_want_line = 1; } +- break; +- +- case 82: +-#line 351 "mcparse.y" +- { mclex_want_filename = 1; } +- break; +- +- +-/* Line 1267 of yacc.c. */ +-#line 1939 "mcparse.c" +- default: break; +- } +- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); +- +- YYPOPSTACK (yylen); +- yylen = 0; +- YY_STACK_PRINT (yyss, yyssp); +- +- *++yyvsp = yyval; +- +- +- /* 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 - YYNTOKENS] + *yyssp; +- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) +- yystate = yytable[yystate]; +- else +- yystate = yydefgoto[yyn - YYNTOKENS]; +- +- goto yynewstate; +- +- +-/*------------------------------------. +-| yyerrlab -- here on detecting error | +-`------------------------------------*/ +-yyerrlab: +- /* If not already recovering from an error, report this error. */ +- if (!yyerrstatus) +- { +- ++yynerrs; +-#if ! YYERROR_VERBOSE +- yyerror (YY_("syntax error")); +-#else +- { +- YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); +- if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) +- { +- YYSIZE_T yyalloc = 2 * yysize; +- if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) +- yyalloc = YYSTACK_ALLOC_MAXIMUM; +- if (yymsg != yymsgbuf) +- YYSTACK_FREE (yymsg); +- yymsg = (char *) YYSTACK_ALLOC (yyalloc); +- if (yymsg) +- yymsg_alloc = yyalloc; +- else +- { +- yymsg = yymsgbuf; +- yymsg_alloc = sizeof yymsgbuf; +- } +- } +- +- if (0 < yysize && yysize <= yymsg_alloc) +- { +- (void) yysyntax_error (yymsg, yystate, yychar); +- yyerror (yymsg); +- } +- else +- { +- yyerror (YY_("syntax error")); +- if (yysize != 0) +- goto yyexhaustedlab; +- } +- } +-#endif +- } +- +- +- +- if (yyerrstatus == 3) +- { +- /* If just tried and failed to reuse look-ahead token after an +- error, discard it. */ +- +- if (yychar <= YYEOF) +- { +- /* Return failure if at end of input. */ +- if (yychar == YYEOF) +- YYABORT; +- } +- else +- { +- yydestruct ("Error: discarding", +- yytoken, &yylval); +- yychar = YYEMPTY; +- } +- } +- +- /* Else will try to reuse look-ahead token after shifting the error +- token. */ +- goto yyerrlab1; +- +- +-/*---------------------------------------------------. +-| yyerrorlab -- error raised explicitly by YYERROR. | +-`---------------------------------------------------*/ +-yyerrorlab: +- +- /* Pacify compilers like GCC when the user code never invokes +- YYERROR and the label yyerrorlab therefore never appears in user +- code. */ +- if (/*CONSTCOND*/ 0) +- goto yyerrorlab; +- +- /* Do not reclaim the symbols of the rule which action triggered +- this YYERROR. */ +- YYPOPSTACK (yylen); +- yylen = 0; +- YY_STACK_PRINT (yyss, yyssp); +- yystate = *yyssp; +- goto yyerrlab1; +- +- +-/*-------------------------------------------------------------. +-| yyerrlab1 -- common code for both syntax error and YYERROR. | +-`-------------------------------------------------------------*/ +-yyerrlab1: +- yyerrstatus = 3; /* Each real token shifted decrements this. */ +- +- for (;;) +- { +- yyn = yypact[yystate]; +- if (yyn != YYPACT_NINF) +- { +- yyn += YYTERROR; +- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) +- { +- yyn = yytable[yyn]; +- if (0 < yyn) +- break; +- } +- } +- +- /* Pop the current state because it cannot handle the error token. */ +- if (yyssp == yyss) +- YYABORT; +- +- +- yydestruct ("Error: popping", +- yystos[yystate], yyvsp); +- YYPOPSTACK (1); +- yystate = *yyssp; +- YY_STACK_PRINT (yyss, yyssp); +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- *++yyvsp = yylval; +- +- +- /* Shift the error token. */ +- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); +- +- yystate = yyn; +- goto yynewstate; +- +- +-/*-------------------------------------. +-| yyacceptlab -- YYACCEPT comes here. | +-`-------------------------------------*/ +-yyacceptlab: +- yyresult = 0; +- goto yyreturn; +- +-/*-----------------------------------. +-| yyabortlab -- YYABORT comes here. | +-`-----------------------------------*/ +-yyabortlab: +- yyresult = 1; +- goto yyreturn; +- +-#ifndef yyoverflow +-/*-------------------------------------------------. +-| yyexhaustedlab -- memory exhaustion comes here. | +-`-------------------------------------------------*/ +-yyexhaustedlab: +- yyerror (YY_("memory exhausted")); +- yyresult = 2; +- /* Fall through. */ +-#endif +- +-yyreturn: +- if (yychar != YYEOF && yychar != YYEMPTY) +- yydestruct ("Cleanup: discarding lookahead", +- yytoken, &yylval); +- /* Do not reclaim the symbols of the rule which action triggered +- this YYABORT or YYACCEPT. */ +- YYPOPSTACK (yylen); +- YY_STACK_PRINT (yyss, yyssp); +- while (yyssp != yyss) +- { +- yydestruct ("Cleanup: popping", +- yystos[*yyssp], yyvsp); +- YYPOPSTACK (1); +- } +-#ifndef yyoverflow +- if (yyss != yyssa) +- YYSTACK_FREE (yyss); +-#endif +-#if YYERROR_VERBOSE +- if (yymsg != yymsgbuf) +- YYSTACK_FREE (yymsg); +-#endif +- /* Make sure YYID is used. */ +- return YYID (yyresult); +-} +- +- +-#line 354 "mcparse.y" +- +- +-/* Something else. */ +- +diff -Nur binutils-2.24.orig/binutils/mcparse.h binutils-2.24/binutils/mcparse.h +--- binutils-2.24.orig/binutils/mcparse.h 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/mcparse.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,103 +0,0 @@ +-/* A Bison parser, made by GNU Bison 2.3. */ +- +-/* Skeleton interface for Bison's Yacc-like parsers in C +- +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +- 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., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. */ +- +-/* As a special exception, you may create a larger work that contains +- part or all of the Bison parser skeleton and distribute that work +- under terms of your choice, so long as that work isn't itself a +- parser generator using the skeleton or a modified version thereof +- as a parser skeleton. Alternatively, if you modify or redistribute +- the parser skeleton itself, you may (at your option) remove this +- special exception, which will cause the skeleton and the resulting +- Bison output files to be licensed under the GNU General Public +- License without this special exception. +- +- This special exception was added by the Free Software Foundation in +- version 2.2 of Bison. */ +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- NL = 258, +- MCIDENT = 259, +- MCFILENAME = 260, +- MCLINE = 261, +- MCCOMMENT = 262, +- MCTOKEN = 263, +- MCENDLINE = 264, +- MCLANGUAGENAMES = 265, +- MCFACILITYNAMES = 266, +- MCSEVERITYNAMES = 267, +- MCOUTPUTBASE = 268, +- MCMESSAGEIDTYPEDEF = 269, +- MCLANGUAGE = 270, +- MCMESSAGEID = 271, +- MCSEVERITY = 272, +- MCFACILITY = 273, +- MCSYMBOLICNAME = 274, +- MCNUMBER = 275 +- }; +-#endif +-/* Tokens. */ +-#define NL 258 +-#define MCIDENT 259 +-#define MCFILENAME 260 +-#define MCLINE 261 +-#define MCCOMMENT 262 +-#define MCTOKEN 263 +-#define MCENDLINE 264 +-#define MCLANGUAGENAMES 265 +-#define MCFACILITYNAMES 266 +-#define MCSEVERITYNAMES 267 +-#define MCOUTPUTBASE 268 +-#define MCMESSAGEIDTYPEDEF 269 +-#define MCLANGUAGE 270 +-#define MCMESSAGEID 271 +-#define MCSEVERITY 272 +-#define MCFACILITY 273 +-#define MCSYMBOLICNAME 274 +-#define MCNUMBER 275 +- +- +- +- +-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +-typedef union YYSTYPE +-#line 45 "mcparse.y" +-{ +- rc_uint_type ival; +- unichar *ustr; +- const mc_keyword *tok; +- mc_node *nod; +-} +-/* Line 1529 of yacc.c. */ +-#line 96 "mcparse.h" +- YYSTYPE; +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +-extern YYSTYPE yylval; +- +diff -Nur binutils-2.24.orig/binutils/nlmheader.c binutils-2.24/binutils/nlmheader.c +--- binutils-2.24.orig/binutils/nlmheader.c 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/nlmheader.c 1970-01-01 01:00:00.000000000 +0100 +@@ -1,2698 +0,0 @@ +-/* A Bison parser, made by GNU Bison 2.3. */ +- +-/* Skeleton implementation for Bison's Yacc-like parsers in C +- +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +- 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., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. */ +- +-/* As a special exception, you may create a larger work that contains +- part or all of the Bison parser skeleton and distribute that work +- under terms of your choice, so long as that work isn't itself a +- parser generator using the skeleton or a modified version thereof +- as a parser skeleton. Alternatively, if you modify or redistribute +- the parser skeleton itself, you may (at your option) remove this +- special exception, which will cause the skeleton and the resulting +- Bison output files to be licensed under the GNU General Public +- License without this special exception. +- +- This special exception was added by the Free Software Foundation in +- version 2.2 of Bison. */ +- +-/* C LALR(1) parser skeleton written by Richard Stallman, by +- simplifying the original so-called "semantic" parser. */ +- +-/* All symbols defined below should begin with yy or YY, to avoid +- infringing on user name space. This should be done even for local +- variables, as they might otherwise be expanded by user macros. +- There are some unavoidable exceptions within include files to +- define necessary library symbols; they are noted "INFRINGES ON +- USER NAME SPACE" below. */ +- +-/* Identify Bison output. */ +-#define YYBISON 1 +- +-/* Bison version. */ +-#define YYBISON_VERSION "2.3" +- +-/* Skeleton name. */ +-#define YYSKELETON_NAME "yacc.c" +- +-/* Pure parsers. */ +-#define YYPURE 0 +- +-/* Using locations. */ +-#define YYLSP_NEEDED 0 +- +- +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- CHECK = 258, +- CODESTART = 259, +- COPYRIGHT = 260, +- CUSTOM = 261, +- DATE = 262, +- DEBUG_K = 263, +- DESCRIPTION = 264, +- EXIT = 265, +- EXPORT = 266, +- FLAG_ON = 267, +- FLAG_OFF = 268, +- FULLMAP = 269, +- HELP = 270, +- IMPORT = 271, +- INPUT = 272, +- MAP = 273, +- MESSAGES = 274, +- MODULE = 275, +- MULTIPLE = 276, +- OS_DOMAIN = 277, +- OUTPUT = 278, +- PSEUDOPREEMPTION = 279, +- REENTRANT = 280, +- SCREENNAME = 281, +- SHARELIB = 282, +- STACK = 283, +- START = 284, +- SYNCHRONIZE = 285, +- THREADNAME = 286, +- TYPE = 287, +- VERBOSE = 288, +- VERSIONK = 289, +- XDCDATA = 290, +- STRING = 291, +- QUOTED_STRING = 292 +- }; +-#endif +-/* Tokens. */ +-#define CHECK 258 +-#define CODESTART 259 +-#define COPYRIGHT 260 +-#define CUSTOM 261 +-#define DATE 262 +-#define DEBUG_K 263 +-#define DESCRIPTION 264 +-#define EXIT 265 +-#define EXPORT 266 +-#define FLAG_ON 267 +-#define FLAG_OFF 268 +-#define FULLMAP 269 +-#define HELP 270 +-#define IMPORT 271 +-#define INPUT 272 +-#define MAP 273 +-#define MESSAGES 274 +-#define MODULE 275 +-#define MULTIPLE 276 +-#define OS_DOMAIN 277 +-#define OUTPUT 278 +-#define PSEUDOPREEMPTION 279 +-#define REENTRANT 280 +-#define SCREENNAME 281 +-#define SHARELIB 282 +-#define STACK 283 +-#define START 284 +-#define SYNCHRONIZE 285 +-#define THREADNAME 286 +-#define TYPE 287 +-#define VERBOSE 288 +-#define VERSIONK 289 +-#define XDCDATA 290 +-#define STRING 291 +-#define QUOTED_STRING 292 +- +- +- +- +-/* Copy the first part of user declarations. */ +-#line 1 "nlmheader.y" +-/* nlmheader.y - parse NLM header specification keywords. +- Copyright 1993, 1994, 1995, 1997, 1998, 2001, 2002, 2003, 2005, 2007, +- 2010 Free Software Foundation, Inc. +- +- 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 3 of the License, or +- (at your option) any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +- MA 02110-1301, USA. */ +- +-/* Written by Ian Lance Taylor . +- +- This bison file parses the commands recognized by the NetWare NLM +- linker, except for lists of object files. It stores the +- information in global variables. +- +- This implementation is based on the description in the NetWare Tool +- Maker Specification manual, edition 1.0. */ +- +-#include "sysdep.h" +-#include "safe-ctype.h" +-#include "bfd.h" +-#include "nlm/common.h" +-#include "nlm/internal.h" +-#include "bucomm.h" +-#include "nlmconv.h" +- +-/* Information is stored in the structures pointed to by these +- variables. */ +- +-Nlm_Internal_Fixed_Header *fixed_hdr; +-Nlm_Internal_Variable_Header *var_hdr; +-Nlm_Internal_Version_Header *version_hdr; +-Nlm_Internal_Copyright_Header *copyright_hdr; +-Nlm_Internal_Extended_Header *extended_hdr; +- +-/* Procedure named by CHECK. */ +-char *check_procedure; +-/* File named by CUSTOM. */ +-char *custom_file; +-/* Whether to generate debugging information (DEBUG). */ +-bfd_boolean debug_info; +-/* Procedure named by EXIT. */ +-char *exit_procedure; +-/* Exported symbols (EXPORT). */ +-struct string_list *export_symbols; +-/* List of files from INPUT. */ +-struct string_list *input_files; +-/* Map file name (MAP, FULLMAP). */ +-char *map_file; +-/* Whether a full map has been requested (FULLMAP). */ +-bfd_boolean full_map; +-/* File named by HELP. */ +-char *help_file; +-/* Imported symbols (IMPORT). */ +-struct string_list *import_symbols; +-/* File named by MESSAGES. */ +-char *message_file; +-/* Autoload module list (MODULE). */ +-struct string_list *modules; +-/* File named by OUTPUT. */ +-char *output_file; +-/* File named by SHARELIB. */ +-char *sharelib_file; +-/* Start procedure name (START). */ +-char *start_procedure; +-/* VERBOSE. */ +-bfd_boolean verbose; +-/* RPC description file (XDCDATA). */ +-char *rpc_file; +- +-/* The number of serious errors that have occurred. */ +-int parse_errors; +- +-/* The current symbol prefix when reading a list of import or export +- symbols. */ +-static char *symbol_prefix; +- +-/* Parser error message handler. */ +-#define yyerror(msg) nlmheader_error (msg); +- +-/* Local functions. */ +-static int yylex (void); +-static void nlmlex_file_push (const char *); +-static bfd_boolean nlmlex_file_open (const char *); +-static int nlmlex_buf_init (void); +-static char nlmlex_buf_add (int); +-static long nlmlex_get_number (const char *); +-static void nlmheader_identify (void); +-static void nlmheader_warn (const char *, int); +-static void nlmheader_error (const char *); +-static struct string_list * string_list_cons (char *, struct string_list *); +-static struct string_list * string_list_append (struct string_list *, +- struct string_list *); +-static struct string_list * string_list_append1 (struct string_list *, +- char *); +-static char *xstrdup (const char *); +- +- +- +-/* Enabling traces. */ +-#ifndef YYDEBUG +-# define YYDEBUG 0 +-#endif +- +-/* Enabling verbose error messages. */ +-#ifdef YYERROR_VERBOSE +-# undef YYERROR_VERBOSE +-# define YYERROR_VERBOSE 1 +-#else +-# define YYERROR_VERBOSE 0 +-#endif +- +-/* Enabling the token table. */ +-#ifndef YYTOKEN_TABLE +-# define YYTOKEN_TABLE 0 +-#endif +- +-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +-typedef union YYSTYPE +-#line 113 "nlmheader.y" +-{ +- char *string; +- struct string_list *list; +-} +-/* Line 193 of yacc.c. */ +-#line 286 "nlmheader.c" +- YYSTYPE; +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +- +- +-/* Copy the second part of user declarations. */ +- +- +-/* Line 216 of yacc.c. */ +-#line 299 "nlmheader.c" +- +-#ifdef short +-# undef short +-#endif +- +-#ifdef YYTYPE_UINT8 +-typedef YYTYPE_UINT8 yytype_uint8; +-#else +-typedef unsigned char yytype_uint8; +-#endif +- +-#ifdef YYTYPE_INT8 +-typedef YYTYPE_INT8 yytype_int8; +-#elif (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-typedef signed char yytype_int8; +-#else +-typedef short int yytype_int8; +-#endif +- +-#ifdef YYTYPE_UINT16 +-typedef YYTYPE_UINT16 yytype_uint16; +-#else +-typedef unsigned short int yytype_uint16; +-#endif +- +-#ifdef YYTYPE_INT16 +-typedef YYTYPE_INT16 yytype_int16; +-#else +-typedef short int yytype_int16; +-#endif +- +-#ifndef YYSIZE_T +-# ifdef __SIZE_TYPE__ +-# define YYSIZE_T __SIZE_TYPE__ +-# elif defined size_t +-# define YYSIZE_T size_t +-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYSIZE_T size_t +-# else +-# define YYSIZE_T unsigned int +-# endif +-#endif +- +-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) +- +-#ifndef YY_ +-# if defined YYENABLE_NLS && YYENABLE_NLS +-# if ENABLE_NLS +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YY_(msgid) dgettext ("bison-runtime", msgid) +-# endif +-# endif +-# ifndef YY_ +-# define YY_(msgid) msgid +-# endif +-#endif +- +-/* Suppress unused-variable warnings by "using" E. */ +-#if ! defined lint || defined __GNUC__ +-# define YYUSE(e) ((void) (e)) +-#else +-# define YYUSE(e) /* empty */ +-#endif +- +-/* Identity function, used to suppress warnings about constant conditions. */ +-#ifndef lint +-# define YYID(n) (n) +-#else +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static int +-YYID (int i) +-#else +-static int +-YYID (i) +- int i; +-#endif +-{ +- return i; +-} +-#endif +- +-#if ! defined yyoverflow || YYERROR_VERBOSE +- +-/* The parser invokes alloca or malloc; define the necessary symbols. */ +- +-# ifdef YYSTACK_USE_ALLOCA +-# if YYSTACK_USE_ALLOCA +-# ifdef __GNUC__ +-# define YYSTACK_ALLOC __builtin_alloca +-# elif defined __BUILTIN_VA_ARG_INCR +-# include /* INFRINGES ON USER NAME SPACE */ +-# elif defined _AIX +-# define YYSTACK_ALLOC __alloca +-# elif defined _MSC_VER +-# include /* INFRINGES ON USER NAME SPACE */ +-# define alloca _alloca +-# else +-# define YYSTACK_ALLOC alloca +-# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-# include /* INFRINGES ON USER NAME SPACE */ +-# ifndef _STDLIB_H +-# define _STDLIB_H 1 +-# endif +-# endif +-# endif +-# endif +-# endif +- +-# ifdef YYSTACK_ALLOC +- /* Pacify GCC's `empty if-body' warning. */ +-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +-# ifndef YYSTACK_ALLOC_MAXIMUM +- /* The OS might guarantee only one guard page at the bottom of the stack, +- and a page size can be as small as 4096 bytes. So we cannot safely +- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number +- to allow for a few compiler-allocated temporary stack slots. */ +-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +-# endif +-# else +-# define YYSTACK_ALLOC YYMALLOC +-# define YYSTACK_FREE YYFREE +-# ifndef YYSTACK_ALLOC_MAXIMUM +-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +-# endif +-# if (defined __cplusplus && ! defined _STDLIB_H \ +- && ! ((defined YYMALLOC || defined malloc) \ +- && (defined YYFREE || defined free))) +-# include /* INFRINGES ON USER NAME SPACE */ +-# ifndef _STDLIB_H +-# define _STDLIB_H 1 +-# endif +-# endif +-# ifndef YYMALLOC +-# define YYMALLOC malloc +-# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +-# endif +-# endif +-# ifndef YYFREE +-# define YYFREE free +-# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-void free (void *); /* INFRINGES ON USER NAME SPACE */ +-# endif +-# endif +-# endif +-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ +- +- +-#if (! defined yyoverflow \ +- && (! defined __cplusplus \ +- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) +- +-/* A type that is properly aligned for any stack member. */ +-union yyalloc +-{ +- yytype_int16 yyss; +- YYSTYPE yyvs; +- }; +- +-/* The size of the maximum gap between one aligned stack and the next. */ +-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +- +-/* The size of an array large to enough to hold all stacks, each with +- N elements. */ +-# define YYSTACK_BYTES(N) \ +- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ +- + YYSTACK_GAP_MAXIMUM) +- +-/* Copy COUNT objects from FROM to TO. The source and destination do +- not overlap. */ +-# ifndef YYCOPY +-# if defined __GNUC__ && 1 < __GNUC__ +-# define YYCOPY(To, From, Count) \ +- __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +-# else +-# define YYCOPY(To, From, Count) \ +- do \ +- { \ +- YYSIZE_T yyi; \ +- for (yyi = 0; yyi < (Count); yyi++) \ +- (To)[yyi] = (From)[yyi]; \ +- } \ +- while (YYID (0)) +-# endif +-# endif +- +-/* Relocate STACK from its old location to the new one. The +- local variables YYSIZE and YYSTACKSIZE give the old and new number of +- elements in the stack, and YYPTR gives the new location of the +- stack. Advance YYPTR to a properly aligned location for the next +- stack. */ +-# define YYSTACK_RELOCATE(Stack) \ +- do \ +- { \ +- YYSIZE_T yynewbytes; \ +- YYCOPY (&yyptr->Stack, Stack, yysize); \ +- Stack = &yyptr->Stack; \ +- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ +- yyptr += yynewbytes / sizeof (*yyptr); \ +- } \ +- while (YYID (0)) +- +-#endif +- +-/* YYFINAL -- State number of the termination state. */ +-#define YYFINAL 64 +-/* YYLAST -- Last index in YYTABLE. */ +-#define YYLAST 73 +- +-/* YYNTOKENS -- Number of terminals. */ +-#define YYNTOKENS 40 +-/* YYNNTS -- Number of nonterminals. */ +-#define YYNNTS 11 +-/* YYNRULES -- Number of rules. */ +-#define YYNRULES 52 +-/* YYNRULES -- Number of states. */ +-#define YYNSTATES 82 +- +-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +-#define YYUNDEFTOK 2 +-#define YYMAXUTOK 292 +- +-#define YYTRANSLATE(YYX) \ +- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) +- +-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +-static const yytype_uint8 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, 2, 2, 2, +- 38, 39, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 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, 24, +- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, +- 35, 36, 37 +-}; +- +-#if YYDEBUG +-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in +- YYRHS. */ +-static const yytype_uint8 yyprhs[] = +-{ +- 0, 0, 3, 5, 6, 9, 12, 15, 18, 21, +- 26, 28, 31, 34, 35, 39, 42, 45, 47, 50, +- 53, 54, 58, 61, 63, 66, 69, 72, 74, 76, +- 79, 81, 83, 86, 89, 92, 95, 97, 100, 103, +- 105, 110, 114, 117, 118, 120, 122, 124, 127, 130, +- 134, 136, 137 +-}; +- +-/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +-static const yytype_int8 yyrhs[] = +-{ +- 41, 0, -1, 42, -1, -1, 43, 42, -1, 3, +- 36, -1, 4, 36, -1, 5, 37, -1, 6, 36, +- -1, 7, 36, 36, 36, -1, 8, -1, 9, 37, +- -1, 10, 36, -1, -1, 11, 44, 46, -1, 12, +- 36, -1, 13, 36, -1, 14, -1, 14, 36, -1, +- 15, 36, -1, -1, 16, 45, 46, -1, 17, 50, +- -1, 18, -1, 18, 36, -1, 19, 36, -1, 20, +- 50, -1, 21, -1, 22, -1, 23, 36, -1, 24, +- -1, 25, -1, 26, 37, -1, 27, 36, -1, 28, +- 36, -1, 29, 36, -1, 30, -1, 31, 37, -1, +- 32, 36, -1, 33, -1, 34, 36, 36, 36, -1, +- 34, 36, 36, -1, 35, 36, -1, -1, 47, -1, +- 49, -1, 48, -1, 47, 49, -1, 47, 48, -1, +- 38, 36, 39, -1, 36, -1, -1, 36, 50, -1 +-}; +- +-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +-static const yytype_uint16 yyrline[] = +-{ +- 0, 144, 144, 149, 151, 157, 161, 166, 183, 187, +- 205, 209, 225, 230, 229, 237, 242, 247, 252, 257, +- 262, 261, 269, 273, 277, 281, 285, 289, 293, 297, +- 304, 308, 312, 328, 332, 337, 341, 345, 361, 366, +- 370, 394, 410, 420, 423, 434, 438, 442, 446, 455, +- 466, 483, 486 +-}; +-#endif +- +-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +- First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +-static const char *const yytname[] = +-{ +- "$end", "error", "$undefined", "CHECK", "CODESTART", "COPYRIGHT", +- "CUSTOM", "DATE", "DEBUG_K", "DESCRIPTION", "EXIT", "EXPORT", "FLAG_ON", +- "FLAG_OFF", "FULLMAP", "HELP", "IMPORT", "INPUT", "MAP", "MESSAGES", +- "MODULE", "MULTIPLE", "OS_DOMAIN", "OUTPUT", "PSEUDOPREEMPTION", +- "REENTRANT", "SCREENNAME", "SHARELIB", "STACK", "START", "SYNCHRONIZE", +- "THREADNAME", "TYPE", "VERBOSE", "VERSIONK", "XDCDATA", "STRING", +- "QUOTED_STRING", "'('", "')'", "$accept", "file", "commands", "command", +- "@1", "@2", "symbol_list_opt", "symbol_list", "symbol_prefix", "symbol", +- "string_list", 0 +-}; +-#endif +- +-# ifdef YYPRINT +-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to +- token YYLEX-NUM. */ +-static const yytype_uint16 yytoknum[] = +-{ +- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, +- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, +- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, +- 285, 286, 287, 288, 289, 290, 291, 292, 40, 41 +-}; +-# endif +- +-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +-static const yytype_uint8 yyr1[] = +-{ +- 0, 40, 41, 42, 42, 43, 43, 43, 43, 43, +- 43, 43, 43, 44, 43, 43, 43, 43, 43, 43, +- 45, 43, 43, 43, 43, 43, 43, 43, 43, 43, +- 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, +- 43, 43, 43, 46, 46, 47, 47, 47, 47, 48, +- 49, 50, 50 +-}; +- +-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +-static const yytype_uint8 yyr2[] = +-{ +- 0, 2, 1, 0, 2, 2, 2, 2, 2, 4, +- 1, 2, 2, 0, 3, 2, 2, 1, 2, 2, +- 0, 3, 2, 1, 2, 2, 2, 1, 1, 2, +- 1, 1, 2, 2, 2, 2, 1, 2, 2, 1, +- 4, 3, 2, 0, 1, 1, 1, 2, 2, 3, +- 1, 0, 2 +-}; +- +-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state +- STATE-NUM when YYTABLE doesn't specify something else to do. Zero +- means the default is an error. */ +-static const yytype_uint8 yydefact[] = +-{ +- 3, 0, 0, 0, 0, 0, 10, 0, 0, 13, +- 0, 0, 17, 0, 20, 51, 23, 0, 51, 27, +- 28, 0, 30, 31, 0, 0, 0, 0, 36, 0, +- 0, 39, 0, 0, 0, 2, 3, 5, 6, 7, +- 8, 0, 11, 12, 43, 15, 16, 18, 19, 43, +- 51, 22, 24, 25, 26, 29, 32, 33, 34, 35, +- 37, 38, 0, 42, 1, 4, 0, 50, 0, 14, +- 44, 46, 45, 21, 52, 41, 9, 0, 48, 47, +- 40, 49 +-}; +- +-/* YYDEFGOTO[NTERM-NUM]. */ +-static const yytype_int8 yydefgoto[] = +-{ +- -1, 34, 35, 36, 44, 49, 69, 70, 71, 72, +- 51 +-}; +- +-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing +- STATE-NUM. */ +-#define YYPACT_NINF -20 +-static const yytype_int8 yypact[] = +-{ +- -3, -1, 1, 2, 4, 5, -20, 6, 8, -20, +- 9, 10, 11, 12, -20, 13, 14, 16, 13, -20, +- -20, 17, -20, -20, 18, 20, 21, 22, -20, 23, +- 25, -20, 26, 27, 38, -20, -3, -20, -20, -20, +- -20, 28, -20, -20, -2, -20, -20, -20, -20, -2, +- 13, -20, -20, -20, -20, -20, -20, -20, -20, -20, +- -20, -20, 30, -20, -20, -20, 31, -20, 32, -20, +- -2, -20, -20, -20, -20, 33, -20, 3, -20, -20, +- -20, -20 +-}; +- +-/* YYPGOTO[NTERM-NUM]. */ +-static const yytype_int8 yypgoto[] = +-{ +- -20, -20, 34, -20, -20, -20, 24, -20, -19, -16, +- 15 +-}; +- +-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If +- positive, shift that token. If negative, reduce the rule which +- number is the opposite. If zero, do what YYDEFACT says. +- If YYTABLE_NINF, syntax error. */ +-#define YYTABLE_NINF -1 +-static const yytype_uint8 yytable[] = +-{ +- 1, 2, 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, 54, 67, 37, 68, 38, 64, 39, +- 40, 41, 81, 42, 43, 45, 46, 47, 48, 50, +- 52, 78, 53, 55, 79, 56, 57, 58, 59, 0, +- 60, 61, 62, 63, 66, 74, 75, 76, 77, 80, +- 65, 0, 0, 73 +-}; +- +-static const yytype_int8 yycheck[] = +-{ +- 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, 35, 18, 36, 36, 38, 36, 0, 37, +- 36, 36, 39, 37, 36, 36, 36, 36, 36, 36, +- 36, 70, 36, 36, 70, 37, 36, 36, 36, -1, +- 37, 36, 36, 36, 36, 50, 36, 36, 36, 36, +- 36, -1, -1, 49 +-}; +- +-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing +- symbol of state STATE-NUM. */ +-static const yytype_uint8 yystos[] = +-{ +- 0, 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, 35, 41, 42, 43, 36, 36, 37, +- 36, 36, 37, 36, 44, 36, 36, 36, 36, 45, +- 36, 50, 36, 36, 50, 36, 37, 36, 36, 36, +- 37, 36, 36, 36, 0, 42, 36, 36, 38, 46, +- 47, 48, 49, 46, 50, 36, 36, 36, 48, 49, +- 36, 39 +-}; +- +-#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 yyerrorlab +- +- +-/* 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); \ +- yytoken = YYTRANSLATE (yychar); \ +- YYPOPSTACK (1); \ +- goto yybackup; \ +- } \ +- else \ +- { \ +- yyerror (YY_("syntax error: cannot back up")); \ +- YYERROR; \ +- } \ +-while (YYID (0)) +- +- +-#define YYTERROR 1 +-#define YYERRCODE 256 +- +- +-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. +- If N is 0, then set CURRENT to the empty location which ends +- the previous symbol: RHS[0] (always defined). */ +- +-#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +-#ifndef YYLLOC_DEFAULT +-# define YYLLOC_DEFAULT(Current, Rhs, N) \ +- do \ +- if (YYID (N)) \ +- { \ +- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ +- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ +- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ +- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ +- } \ +- else \ +- { \ +- (Current).first_line = (Current).last_line = \ +- YYRHSLOC (Rhs, 0).last_line; \ +- (Current).first_column = (Current).last_column = \ +- YYRHSLOC (Rhs, 0).last_column; \ +- } \ +- while (YYID (0)) +-#endif +- +- +-/* YY_LOCATION_PRINT -- Print the location on the stream. +- This macro was not mandated originally: define only if we know +- we won't break user code: when these are the locations we know. */ +- +-#ifndef YY_LOCATION_PRINT +-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL +-# define YY_LOCATION_PRINT(File, Loc) \ +- fprintf (File, "%d.%d-%d.%d", \ +- (Loc).first_line, (Loc).first_column, \ +- (Loc).last_line, (Loc).last_column) +-# else +-# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +-# endif +-#endif +- +- +-/* YYLEX -- calling `yylex' with the right arguments. */ +- +-#ifdef YYLEX_PARAM +-# define YYLEX yylex (YYLEX_PARAM) +-#else +-# define YYLEX yylex () +-#endif +- +-/* Enable debugging if requested. */ +-#if YYDEBUG +- +-# ifndef YYFPRINTF +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYFPRINTF fprintf +-# endif +- +-# define YYDPRINTF(Args) \ +-do { \ +- if (yydebug) \ +- YYFPRINTF Args; \ +-} while (YYID (0)) +- +-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +-do { \ +- if (yydebug) \ +- { \ +- YYFPRINTF (stderr, "%s ", Title); \ +- yy_symbol_print (stderr, \ +- Type, Value); \ +- YYFPRINTF (stderr, "\n"); \ +- } \ +-} while (YYID (0)) +- +- +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-/*ARGSUSED*/ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +-#else +-static void +-yy_symbol_value_print (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE const * const yyvaluep; +-#endif +-{ +- if (!yyvaluep) +- return; +-# ifdef YYPRINT +- if (yytype < YYNTOKENS) +- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +-# else +- YYUSE (yyoutput); +-# endif +- switch (yytype) +- { +- default: +- break; +- } +-} +- +- +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +-#else +-static void +-yy_symbol_print (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE const * const yyvaluep; +-#endif +-{ +- if (yytype < YYNTOKENS) +- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +- else +- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); +- +- yy_symbol_value_print (yyoutput, yytype, yyvaluep); +- YYFPRINTF (yyoutput, ")"); +-} +- +-/*------------------------------------------------------------------. +-| yy_stack_print -- Print the state stack from its BOTTOM up to its | +-| TOP (included). | +-`------------------------------------------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +-#else +-static void +-yy_stack_print (bottom, top) +- yytype_int16 *bottom; +- yytype_int16 *top; +-#endif +-{ +- YYFPRINTF (stderr, "Stack now"); +- for (; bottom <= top; ++bottom) +- YYFPRINTF (stderr, " %d", *bottom); +- YYFPRINTF (stderr, "\n"); +-} +- +-# define YY_STACK_PRINT(Bottom, Top) \ +-do { \ +- if (yydebug) \ +- yy_stack_print ((Bottom), (Top)); \ +-} while (YYID (0)) +- +- +-/*------------------------------------------------. +-| Report that the YYRULE is going to be reduced. | +-`------------------------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +-#else +-static void +-yy_reduce_print (yyvsp, yyrule) +- YYSTYPE *yyvsp; +- int yyrule; +-#endif +-{ +- int yynrhs = yyr2[yyrule]; +- int yyi; +- unsigned long int yylno = yyrline[yyrule]; +- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", +- yyrule - 1, yylno); +- /* The symbols being reduced. */ +- for (yyi = 0; yyi < yynrhs; yyi++) +- { +- fprintf (stderr, " $%d = ", yyi + 1); +- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], +- &(yyvsp[(yyi + 1) - (yynrhs)]) +- ); +- fprintf (stderr, "\n"); +- } +-} +- +-# define YY_REDUCE_PRINT(Rule) \ +-do { \ +- if (yydebug) \ +- yy_reduce_print (yyvsp, Rule); \ +-} while (YYID (0)) +- +-/* Nonzero means print parse trace. It is left uninitialized so that +- multiple parsers can coexist. */ +-int yydebug; +-#else /* !YYDEBUG */ +-# define YYDPRINTF(Args) +-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +-# define YY_STACK_PRINT(Bottom, Top) +-# define YY_REDUCE_PRINT(Rule) +-#endif /* !YYDEBUG */ +- +- +-/* YYINITDEPTH -- initial size of the parser's stacks. */ +-#ifndef YYINITDEPTH +-# define YYINITDEPTH 200 +-#endif +- +-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only +- if the built-in stack extension method is used). +- +- Do not make this value too large; the results are undefined if +- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) +- evaluated with infinite-precision integer arithmetic. */ +- +-#ifndef YYMAXDEPTH +-# define YYMAXDEPTH 10000 +-#endif +- +- +- +-#if YYERROR_VERBOSE +- +-# ifndef yystrlen +-# if defined __GLIBC__ && defined _STRING_H +-# define yystrlen strlen +-# else +-/* Return the length of YYSTR. */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static YYSIZE_T +-yystrlen (const char *yystr) +-#else +-static YYSIZE_T +-yystrlen (yystr) +- const char *yystr; +-#endif +-{ +- YYSIZE_T yylen; +- for (yylen = 0; yystr[yylen]; yylen++) +- continue; +- return yylen; +-} +-# endif +-# endif +- +-# ifndef yystpcpy +-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +-# define yystpcpy stpcpy +-# else +-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in +- YYDEST. */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static char * +-yystpcpy (char *yydest, const char *yysrc) +-#else +-static char * +-yystpcpy (yydest, yysrc) +- char *yydest; +- const char *yysrc; +-#endif +-{ +- char *yyd = yydest; +- const char *yys = yysrc; +- +- while ((*yyd++ = *yys++) != '\0') +- continue; +- +- return yyd - 1; +-} +-# endif +-# endif +- +-# ifndef yytnamerr +-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary +- quotes and backslashes, so that it's suitable for yyerror. The +- heuristic is that double-quoting is unnecessary unless the string +- contains an apostrophe, a comma, or backslash (other than +- backslash-backslash). YYSTR is taken from yytname. If YYRES is +- null, do not copy; instead, return the length of what the result +- would have been. */ +-static YYSIZE_T +-yytnamerr (char *yyres, const char *yystr) +-{ +- if (*yystr == '"') +- { +- YYSIZE_T yyn = 0; +- char const *yyp = yystr; +- +- for (;;) +- switch (*++yyp) +- { +- case '\'': +- case ',': +- goto do_not_strip_quotes; +- +- case '\\': +- if (*++yyp != '\\') +- goto do_not_strip_quotes; +- /* Fall through. */ +- default: +- if (yyres) +- yyres[yyn] = *yyp; +- yyn++; +- break; +- +- case '"': +- if (yyres) +- yyres[yyn] = '\0'; +- return yyn; +- } +- do_not_strip_quotes: ; +- } +- +- if (! yyres) +- return yystrlen (yystr); +- +- return yystpcpy (yyres, yystr) - yyres; +-} +-# endif +- +-/* Copy into YYRESULT an error message about the unexpected token +- YYCHAR while in state YYSTATE. Return the number of bytes copied, +- including the terminating null byte. If YYRESULT is null, do not +- copy anything; just return the number of bytes that would be +- copied. As a special case, return 0 if an ordinary "syntax error" +- message will do. Return YYSIZE_MAXIMUM if overflow occurs during +- size calculation. */ +-static YYSIZE_T +-yysyntax_error (char *yyresult, int yystate, int yychar) +-{ +- int yyn = yypact[yystate]; +- +- if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) +- return 0; +- else +- { +- int yytype = YYTRANSLATE (yychar); +- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); +- YYSIZE_T yysize = yysize0; +- YYSIZE_T yysize1; +- int yysize_overflow = 0; +- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; +- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; +- int yyx; +- +-# if 0 +- /* This is so xgettext sees the translatable formats that are +- constructed on the fly. */ +- YY_("syntax error, unexpected %s"); +- YY_("syntax error, unexpected %s, expecting %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s or %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +-# endif +- char *yyfmt; +- char const *yyf; +- static char const yyunexpected[] = "syntax error, unexpected %s"; +- static char const yyexpecting[] = ", expecting %s"; +- static char const yyor[] = " or %s"; +- char yyformat[sizeof yyunexpected +- + sizeof yyexpecting - 1 +- + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) +- * (sizeof yyor - 1))]; +- char const *yyprefix = yyexpecting; +- +- /* Start YYX at -YYN if negative to avoid negative indexes in +- YYCHECK. */ +- int yyxbegin = yyn < 0 ? -yyn : 0; +- +- /* Stay within bounds of both yycheck and yytname. */ +- int yychecklim = YYLAST - yyn + 1; +- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; +- int yycount = 1; +- +- yyarg[0] = yytname[yytype]; +- yyfmt = yystpcpy (yyformat, yyunexpected); +- +- for (yyx = yyxbegin; yyx < yyxend; ++yyx) +- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) +- { +- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) +- { +- yycount = 1; +- yysize = yysize0; +- yyformat[sizeof yyunexpected - 1] = '\0'; +- break; +- } +- yyarg[yycount++] = yytname[yyx]; +- yysize1 = yysize + yytnamerr (0, yytname[yyx]); +- yysize_overflow |= (yysize1 < yysize); +- yysize = yysize1; +- yyfmt = yystpcpy (yyfmt, yyprefix); +- yyprefix = yyor; +- } +- +- yyf = YY_(yyformat); +- yysize1 = yysize + yystrlen (yyf); +- yysize_overflow |= (yysize1 < yysize); +- yysize = yysize1; +- +- if (yysize_overflow) +- return YYSIZE_MAXIMUM; +- +- if (yyresult) +- { +- /* Avoid sprintf, as that infringes on the user's name space. +- Don't have undefined behavior even if the translation +- produced a string with the wrong number of "%s"s. */ +- char *yyp = yyresult; +- int yyi = 0; +- while ((*yyp = *yyf) != '\0') +- { +- if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) +- { +- yyp += yytnamerr (yyp, yyarg[yyi++]); +- yyf += 2; +- } +- else +- { +- yyp++; +- yyf++; +- } +- } +- } +- return yysize; +- } +-} +-#endif /* YYERROR_VERBOSE */ +- +- +-/*-----------------------------------------------. +-| Release the memory associated to this symbol. | +-`-----------------------------------------------*/ +- +-/*ARGSUSED*/ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +-#else +-static void +-yydestruct (yymsg, yytype, yyvaluep) +- const char *yymsg; +- int yytype; +- YYSTYPE *yyvaluep; +-#endif +-{ +- YYUSE (yyvaluep); +- +- if (!yymsg) +- yymsg = "Deleting"; +- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); +- +- switch (yytype) +- { +- +- default: +- break; +- } +-} +- +- +-/* Prevent warnings from -Wmissing-prototypes. */ +- +-#ifdef YYPARSE_PARAM +-#if defined __STDC__ || defined __cplusplus +-int yyparse (void *YYPARSE_PARAM); +-#else +-int yyparse (); +-#endif +-#else /* ! YYPARSE_PARAM */ +-#if defined __STDC__ || defined __cplusplus +-int yyparse (void); +-#else +-int yyparse (); +-#endif +-#endif /* ! YYPARSE_PARAM */ +- +- +- +-/* The look-ahead symbol. */ +-int yychar; +- +-/* The semantic value of the look-ahead symbol. */ +-YYSTYPE yylval; +- +-/* Number of syntax errors so far. */ +-int yynerrs; +- +- +- +-/*----------. +-| yyparse. | +-`----------*/ +- +-#ifdef YYPARSE_PARAM +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-int +-yyparse (void *YYPARSE_PARAM) +-#else +-int +-yyparse (YYPARSE_PARAM) +- void *YYPARSE_PARAM; +-#endif +-#else /* ! YYPARSE_PARAM */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-int +-yyparse (void) +-#else +-int +-yyparse () +- +-#endif +-#endif +-{ +- +- int yystate; +- int yyn; +- int yyresult; +- /* Number of tokens to shift before error messages enabled. */ +- int yyerrstatus; +- /* Look-ahead token as an internal (translated) token number. */ +- int yytoken = 0; +-#if YYERROR_VERBOSE +- /* Buffer for error messages, and its allocated size. */ +- char yymsgbuf[128]; +- char *yymsg = yymsgbuf; +- YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +-#endif +- +- /* Three stacks and their tools: +- `yyss': related to states, +- `yyvs': related to semantic values, +- `yyls': related to locations. +- +- Refer to the stacks thru separate pointers, to allow yyoverflow +- to reallocate them elsewhere. */ +- +- /* The state stack. */ +- yytype_int16 yyssa[YYINITDEPTH]; +- yytype_int16 *yyss = yyssa; +- yytype_int16 *yyssp; +- +- /* The semantic value stack. */ +- YYSTYPE yyvsa[YYINITDEPTH]; +- YYSTYPE *yyvs = yyvsa; +- YYSTYPE *yyvsp; +- +- +- +-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) +- +- YYSIZE_T yystacksize = YYINITDEPTH; +- +- /* The variables used to return semantic value and location from the +- action routines. */ +- YYSTYPE yyval; +- +- +- /* The number of symbols on the RHS of the reduced rule. +- Keep to zero when no symbol should be popped. */ +- int yylen = 0; +- +- YYDPRINTF ((stderr, "Starting parse\n")); +- +- 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; +- yyvsp = yyvs; +- +- goto yysetstate; +- +-/*------------------------------------------------------------. +-| yynewstate -- Push a new state, which is found in yystate. | +-`------------------------------------------------------------*/ +- yynewstate: +- /* In all cases, when you get here, the value and location stacks +- have just been pushed. So pushing a state here evens the stacks. */ +- yyssp++; +- +- yysetstate: +- *yyssp = yystate; +- +- if (yyss + yystacksize - 1 <= yyssp) +- { +- /* Get the current used size of the three stacks, in elements. */ +- YYSIZE_T yysize = yyssp - yyss + 1; +- +-#ifdef yyoverflow +- { +- /* Give user a chance to reallocate the stack. Use copies of +- these so that the &'s don't force the real ones into +- memory. */ +- YYSTYPE *yyvs1 = yyvs; +- yytype_int16 *yyss1 = yyss; +- +- +- /* Each stack pointer address is followed by the size of the +- data in use in that stack, in bytes. This used to be a +- conditional around just the two extra args, but that might +- be undefined if yyoverflow is a macro. */ +- yyoverflow (YY_("memory exhausted"), +- &yyss1, yysize * sizeof (*yyssp), +- &yyvs1, yysize * sizeof (*yyvsp), +- +- &yystacksize); +- +- yyss = yyss1; +- yyvs = yyvs1; +- } +-#else /* no yyoverflow */ +-# ifndef YYSTACK_RELOCATE +- goto yyexhaustedlab; +-# else +- /* Extend the stack our own way. */ +- if (YYMAXDEPTH <= yystacksize) +- goto yyexhaustedlab; +- yystacksize *= 2; +- if (YYMAXDEPTH < yystacksize) +- yystacksize = YYMAXDEPTH; +- +- { +- yytype_int16 *yyss1 = yyss; +- union yyalloc *yyptr = +- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); +- if (! yyptr) +- goto yyexhaustedlab; +- YYSTACK_RELOCATE (yyss); +- YYSTACK_RELOCATE (yyvs); +- +-# undef YYSTACK_RELOCATE +- if (yyss1 != yyssa) +- YYSTACK_FREE (yyss1); +- } +-# endif +-#endif /* no yyoverflow */ +- +- yyssp = yyss + yysize - 1; +- yyvsp = yyvs + yysize - 1; +- +- +- YYDPRINTF ((stderr, "Stack size increased to %lu\n", +- (unsigned long int) yystacksize)); +- +- if (yyss + yystacksize - 1 <= yyssp) +- YYABORT; +- } +- +- YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +- +- goto yybackup; +- +-/*-----------. +-| yybackup. | +-`-----------*/ +-yybackup: +- +- /* Do appropriate processing given the current state. Read a +- look-ahead token if we need one and don't already have one. */ +- +- /* First try to decide what to do without reference to look-ahead token. */ +- yyn = yypact[yystate]; +- if (yyn == YYPACT_NINF) +- goto yydefault; +- +- /* Not known => get a look-ahead token if don't already have one. */ +- +- /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ +- if (yychar == YYEMPTY) +- { +- YYDPRINTF ((stderr, "Reading a token: ")); +- yychar = YYLEX; +- } +- +- if (yychar <= YYEOF) +- { +- yychar = yytoken = YYEOF; +- YYDPRINTF ((stderr, "Now at end of input.\n")); +- } +- else +- { +- yytoken = YYTRANSLATE (yychar); +- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); +- } +- +- /* If the proper action on seeing token YYTOKEN is to reduce or to +- detect an error, take that action. */ +- yyn += yytoken; +- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) +- goto yydefault; +- yyn = yytable[yyn]; +- if (yyn <= 0) +- { +- if (yyn == 0 || yyn == YYTABLE_NINF) +- goto yyerrlab; +- yyn = -yyn; +- goto yyreduce; +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- /* Count tokens shifted since error; after three, turn off error +- status. */ +- if (yyerrstatus) +- yyerrstatus--; +- +- /* Shift the look-ahead token. */ +- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); +- +- /* Discard the shifted token unless it is eof. */ +- if (yychar != YYEOF) +- yychar = YYEMPTY; +- +- yystate = yyn; +- *++yyvsp = yylval; +- +- goto yynewstate; +- +- +-/*-----------------------------------------------------------. +-| yydefault -- do the default action for the current state. | +-`-----------------------------------------------------------*/ +-yydefault: +- yyn = yydefact[yystate]; +- if (yyn == 0) +- goto yyerrlab; +- goto yyreduce; +- +- +-/*-----------------------------. +-| yyreduce -- Do a reduction. | +-`-----------------------------*/ +-yyreduce: +- /* yyn is the number of a rule to reduce with. */ +- yylen = yyr2[yyn]; +- +- /* If YYLEN is nonzero, implement the default value of the action: +- `$$ = $1'. +- +- Otherwise, the following line sets YYVAL to garbage. +- This behavior is undocumented and Bison +- users should not rely upon it. Assigning to YYVAL +- unconditionally makes the parser a bit smaller, and it avoids a +- GCC warning that YYVAL may be used uninitialized. */ +- yyval = yyvsp[1-yylen]; +- +- +- YY_REDUCE_PRINT (yyn); +- switch (yyn) +- { +- case 5: +-#line 158 "nlmheader.y" +- { +- check_procedure = (yyvsp[(2) - (2)].string); +- } +- break; +- +- case 6: +-#line 162 "nlmheader.y" +- { +- nlmheader_warn (_("CODESTART is not implemented; sorry"), -1); +- free ((yyvsp[(2) - (2)].string)); +- } +- break; +- +- case 7: +-#line 167 "nlmheader.y" +- { +- int len; +- +- strncpy (copyright_hdr->stamp, "CoPyRiGhT=", 10); +- len = strlen ((yyvsp[(2) - (2)].string)); +- if (len >= NLM_MAX_COPYRIGHT_MESSAGE_LENGTH) +- { +- nlmheader_warn (_("copyright string is too long"), +- NLM_MAX_COPYRIGHT_MESSAGE_LENGTH - 1); +- len = NLM_MAX_COPYRIGHT_MESSAGE_LENGTH - 1; +- } +- copyright_hdr->copyrightMessageLength = len; +- strncpy (copyright_hdr->copyrightMessage, (yyvsp[(2) - (2)].string), len); +- copyright_hdr->copyrightMessage[len] = '\0'; +- free ((yyvsp[(2) - (2)].string)); +- } +- break; +- +- case 8: +-#line 184 "nlmheader.y" +- { +- custom_file = (yyvsp[(2) - (2)].string); +- } +- break; +- +- case 9: +-#line 188 "nlmheader.y" +- { +- /* We don't set the version stamp here, because we use the +- version stamp to detect whether the required VERSION +- keyword was given. */ +- version_hdr->month = nlmlex_get_number ((yyvsp[(2) - (4)].string)); +- version_hdr->day = nlmlex_get_number ((yyvsp[(3) - (4)].string)); +- version_hdr->year = nlmlex_get_number ((yyvsp[(4) - (4)].string)); +- free ((yyvsp[(2) - (4)].string)); +- free ((yyvsp[(3) - (4)].string)); +- free ((yyvsp[(4) - (4)].string)); +- if (version_hdr->month < 1 || version_hdr->month > 12) +- nlmheader_warn (_("illegal month"), -1); +- if (version_hdr->day < 1 || version_hdr->day > 31) +- nlmheader_warn (_("illegal day"), -1); +- if (version_hdr->year < 1900 || version_hdr->year > 3000) +- nlmheader_warn (_("illegal year"), -1); +- } +- break; +- +- case 10: +-#line 206 "nlmheader.y" +- { +- debug_info = TRUE; +- } +- break; +- +- case 11: +-#line 210 "nlmheader.y" +- { +- int len; +- +- len = strlen ((yyvsp[(2) - (2)].string)); +- if (len > NLM_MAX_DESCRIPTION_LENGTH) +- { +- nlmheader_warn (_("description string is too long"), +- NLM_MAX_DESCRIPTION_LENGTH); +- len = NLM_MAX_DESCRIPTION_LENGTH; +- } +- var_hdr->descriptionLength = len; +- strncpy (var_hdr->descriptionText, (yyvsp[(2) - (2)].string), len); +- var_hdr->descriptionText[len] = '\0'; +- free ((yyvsp[(2) - (2)].string)); +- } +- break; +- +- case 12: +-#line 226 "nlmheader.y" +- { +- exit_procedure = (yyvsp[(2) - (2)].string); +- } +- break; +- +- case 13: +-#line 230 "nlmheader.y" +- { +- symbol_prefix = NULL; +- } +- break; +- +- case 14: +-#line 234 "nlmheader.y" +- { +- export_symbols = string_list_append (export_symbols, (yyvsp[(3) - (3)].list)); +- } +- break; +- +- case 15: +-#line 238 "nlmheader.y" +- { +- fixed_hdr->flags |= nlmlex_get_number ((yyvsp[(2) - (2)].string)); +- free ((yyvsp[(2) - (2)].string)); +- } +- break; +- +- case 16: +-#line 243 "nlmheader.y" +- { +- fixed_hdr->flags &=~ nlmlex_get_number ((yyvsp[(2) - (2)].string)); +- free ((yyvsp[(2) - (2)].string)); +- } +- break; +- +- case 17: +-#line 248 "nlmheader.y" +- { +- map_file = ""; +- full_map = TRUE; +- } +- break; +- +- case 18: +-#line 253 "nlmheader.y" +- { +- map_file = (yyvsp[(2) - (2)].string); +- full_map = TRUE; +- } +- break; +- +- case 19: +-#line 258 "nlmheader.y" +- { +- help_file = (yyvsp[(2) - (2)].string); +- } +- break; +- +- case 20: +-#line 262 "nlmheader.y" +- { +- symbol_prefix = NULL; +- } +- break; +- +- case 21: +-#line 266 "nlmheader.y" +- { +- import_symbols = string_list_append (import_symbols, (yyvsp[(3) - (3)].list)); +- } +- break; +- +- case 22: +-#line 270 "nlmheader.y" +- { +- input_files = string_list_append (input_files, (yyvsp[(2) - (2)].list)); +- } +- break; +- +- case 23: +-#line 274 "nlmheader.y" +- { +- map_file = ""; +- } +- break; +- +- case 24: +-#line 278 "nlmheader.y" +- { +- map_file = (yyvsp[(2) - (2)].string); +- } +- break; +- +- case 25: +-#line 282 "nlmheader.y" +- { +- message_file = (yyvsp[(2) - (2)].string); +- } +- break; +- +- case 26: +-#line 286 "nlmheader.y" +- { +- modules = string_list_append (modules, (yyvsp[(2) - (2)].list)); +- } +- break; +- +- case 27: +-#line 290 "nlmheader.y" +- { +- fixed_hdr->flags |= 0x2; +- } +- break; +- +- case 28: +-#line 294 "nlmheader.y" +- { +- fixed_hdr->flags |= 0x10; +- } +- break; +- +- case 29: +-#line 298 "nlmheader.y" +- { +- if (output_file == NULL) +- output_file = (yyvsp[(2) - (2)].string); +- else +- nlmheader_warn (_("ignoring duplicate OUTPUT statement"), -1); +- } +- break; +- +- case 30: +-#line 305 "nlmheader.y" +- { +- fixed_hdr->flags |= 0x8; +- } +- break; +- +- case 31: +-#line 309 "nlmheader.y" +- { +- fixed_hdr->flags |= 0x1; +- } +- break; +- +- case 32: +-#line 313 "nlmheader.y" +- { +- int len; +- +- len = strlen ((yyvsp[(2) - (2)].string)); +- if (len >= NLM_MAX_SCREEN_NAME_LENGTH) +- { +- nlmheader_warn (_("screen name is too long"), +- NLM_MAX_SCREEN_NAME_LENGTH); +- len = NLM_MAX_SCREEN_NAME_LENGTH; +- } +- var_hdr->screenNameLength = len; +- strncpy (var_hdr->screenName, (yyvsp[(2) - (2)].string), len); +- var_hdr->screenName[NLM_MAX_SCREEN_NAME_LENGTH] = '\0'; +- free ((yyvsp[(2) - (2)].string)); +- } +- break; +- +- case 33: +-#line 329 "nlmheader.y" +- { +- sharelib_file = (yyvsp[(2) - (2)].string); +- } +- break; +- +- case 34: +-#line 333 "nlmheader.y" +- { +- var_hdr->stackSize = nlmlex_get_number ((yyvsp[(2) - (2)].string)); +- free ((yyvsp[(2) - (2)].string)); +- } +- break; +- +- case 35: +-#line 338 "nlmheader.y" +- { +- start_procedure = (yyvsp[(2) - (2)].string); +- } +- break; +- +- case 36: +-#line 342 "nlmheader.y" +- { +- fixed_hdr->flags |= 0x4; +- } +- break; +- +- case 37: +-#line 346 "nlmheader.y" +- { +- int len; +- +- len = strlen ((yyvsp[(2) - (2)].string)); +- if (len >= NLM_MAX_THREAD_NAME_LENGTH) +- { +- nlmheader_warn (_("thread name is too long"), +- NLM_MAX_THREAD_NAME_LENGTH); +- len = NLM_MAX_THREAD_NAME_LENGTH; +- } +- var_hdr->threadNameLength = len; +- strncpy (var_hdr->threadName, (yyvsp[(2) - (2)].string), len); +- var_hdr->threadName[len] = '\0'; +- free ((yyvsp[(2) - (2)].string)); +- } +- break; +- +- case 38: +-#line 362 "nlmheader.y" +- { +- fixed_hdr->moduleType = nlmlex_get_number ((yyvsp[(2) - (2)].string)); +- free ((yyvsp[(2) - (2)].string)); +- } +- break; +- +- case 39: +-#line 367 "nlmheader.y" +- { +- verbose = TRUE; +- } +- break; +- +- case 40: +-#line 371 "nlmheader.y" +- { +- long val; +- +- strncpy (version_hdr->stamp, "VeRsIoN#", 8); +- version_hdr->majorVersion = nlmlex_get_number ((yyvsp[(2) - (4)].string)); +- val = nlmlex_get_number ((yyvsp[(3) - (4)].string)); +- if (val < 0 || val > 99) +- nlmheader_warn (_("illegal minor version number (must be between 0 and 99)"), +- -1); +- else +- version_hdr->minorVersion = val; +- val = nlmlex_get_number ((yyvsp[(4) - (4)].string)); +- if (val < 0) +- nlmheader_warn (_("illegal revision number (must be between 0 and 26)"), +- -1); +- else if (val > 26) +- version_hdr->revision = 0; +- else +- version_hdr->revision = val; +- free ((yyvsp[(2) - (4)].string)); +- free ((yyvsp[(3) - (4)].string)); +- free ((yyvsp[(4) - (4)].string)); +- } +- break; +- +- case 41: +-#line 395 "nlmheader.y" +- { +- long val; +- +- strncpy (version_hdr->stamp, "VeRsIoN#", 8); +- version_hdr->majorVersion = nlmlex_get_number ((yyvsp[(2) - (3)].string)); +- val = nlmlex_get_number ((yyvsp[(3) - (3)].string)); +- if (val < 0 || val > 99) +- nlmheader_warn (_("illegal minor version number (must be between 0 and 99)"), +- -1); +- else +- version_hdr->minorVersion = val; +- version_hdr->revision = 0; +- free ((yyvsp[(2) - (3)].string)); +- free ((yyvsp[(3) - (3)].string)); +- } +- break; +- +- case 42: +-#line 411 "nlmheader.y" +- { +- rpc_file = (yyvsp[(2) - (2)].string); +- } +- break; +- +- case 43: +-#line 420 "nlmheader.y" +- { +- (yyval.list) = NULL; +- } +- break; +- +- case 44: +-#line 424 "nlmheader.y" +- { +- (yyval.list) = (yyvsp[(1) - (1)].list); +- } +- break; +- +- case 45: +-#line 435 "nlmheader.y" +- { +- (yyval.list) = string_list_cons ((yyvsp[(1) - (1)].string), NULL); +- } +- break; +- +- case 46: +-#line 439 "nlmheader.y" +- { +- (yyval.list) = NULL; +- } +- break; +- +- case 47: +-#line 443 "nlmheader.y" +- { +- (yyval.list) = string_list_append1 ((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].string)); +- } +- break; +- +- case 48: +-#line 447 "nlmheader.y" +- { +- (yyval.list) = (yyvsp[(1) - (2)].list); +- } +- break; +- +- case 49: +-#line 456 "nlmheader.y" +- { +- if (symbol_prefix != NULL) +- free (symbol_prefix); +- symbol_prefix = (yyvsp[(2) - (3)].string); +- } +- break; +- +- case 50: +-#line 467 "nlmheader.y" +- { +- if (symbol_prefix == NULL) +- (yyval.string) = (yyvsp[(1) - (1)].string); +- else +- { +- (yyval.string) = xmalloc (strlen (symbol_prefix) + strlen ((yyvsp[(1) - (1)].string)) + 2); +- sprintf ((yyval.string), "%s@%s", symbol_prefix, (yyvsp[(1) - (1)].string)); +- free ((yyvsp[(1) - (1)].string)); +- } +- } +- break; +- +- case 51: +-#line 483 "nlmheader.y" +- { +- (yyval.list) = NULL; +- } +- break; +- +- case 52: +-#line 487 "nlmheader.y" +- { +- (yyval.list) = string_list_cons ((yyvsp[(1) - (2)].string), (yyvsp[(2) - (2)].list)); +- } +- break; +- +- +-/* Line 1267 of yacc.c. */ +-#line 2015 "nlmheader.c" +- default: break; +- } +- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); +- +- YYPOPSTACK (yylen); +- yylen = 0; +- YY_STACK_PRINT (yyss, yyssp); +- +- *++yyvsp = yyval; +- +- +- /* 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 - YYNTOKENS] + *yyssp; +- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) +- yystate = yytable[yystate]; +- else +- yystate = yydefgoto[yyn - YYNTOKENS]; +- +- goto yynewstate; +- +- +-/*------------------------------------. +-| yyerrlab -- here on detecting error | +-`------------------------------------*/ +-yyerrlab: +- /* If not already recovering from an error, report this error. */ +- if (!yyerrstatus) +- { +- ++yynerrs; +-#if ! YYERROR_VERBOSE +- yyerror (YY_("syntax error")); +-#else +- { +- YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); +- if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) +- { +- YYSIZE_T yyalloc = 2 * yysize; +- if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) +- yyalloc = YYSTACK_ALLOC_MAXIMUM; +- if (yymsg != yymsgbuf) +- YYSTACK_FREE (yymsg); +- yymsg = (char *) YYSTACK_ALLOC (yyalloc); +- if (yymsg) +- yymsg_alloc = yyalloc; +- else +- { +- yymsg = yymsgbuf; +- yymsg_alloc = sizeof yymsgbuf; +- } +- } +- +- if (0 < yysize && yysize <= yymsg_alloc) +- { +- (void) yysyntax_error (yymsg, yystate, yychar); +- yyerror (yymsg); +- } +- else +- { +- yyerror (YY_("syntax error")); +- if (yysize != 0) +- goto yyexhaustedlab; +- } +- } +-#endif +- } +- +- +- +- if (yyerrstatus == 3) +- { +- /* If just tried and failed to reuse look-ahead token after an +- error, discard it. */ +- +- if (yychar <= YYEOF) +- { +- /* Return failure if at end of input. */ +- if (yychar == YYEOF) +- YYABORT; +- } +- else +- { +- yydestruct ("Error: discarding", +- yytoken, &yylval); +- yychar = YYEMPTY; +- } +- } +- +- /* Else will try to reuse look-ahead token after shifting the error +- token. */ +- goto yyerrlab1; +- +- +-/*---------------------------------------------------. +-| yyerrorlab -- error raised explicitly by YYERROR. | +-`---------------------------------------------------*/ +-yyerrorlab: +- +- /* Pacify compilers like GCC when the user code never invokes +- YYERROR and the label yyerrorlab therefore never appears in user +- code. */ +- if (/*CONSTCOND*/ 0) +- goto yyerrorlab; +- +- /* Do not reclaim the symbols of the rule which action triggered +- this YYERROR. */ +- YYPOPSTACK (yylen); +- yylen = 0; +- YY_STACK_PRINT (yyss, yyssp); +- yystate = *yyssp; +- goto yyerrlab1; +- +- +-/*-------------------------------------------------------------. +-| yyerrlab1 -- common code for both syntax error and YYERROR. | +-`-------------------------------------------------------------*/ +-yyerrlab1: +- yyerrstatus = 3; /* Each real token shifted decrements this. */ +- +- for (;;) +- { +- yyn = yypact[yystate]; +- if (yyn != YYPACT_NINF) +- { +- yyn += YYTERROR; +- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) +- { +- yyn = yytable[yyn]; +- if (0 < yyn) +- break; +- } +- } +- +- /* Pop the current state because it cannot handle the error token. */ +- if (yyssp == yyss) +- YYABORT; +- +- +- yydestruct ("Error: popping", +- yystos[yystate], yyvsp); +- YYPOPSTACK (1); +- yystate = *yyssp; +- YY_STACK_PRINT (yyss, yyssp); +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- *++yyvsp = yylval; +- +- +- /* Shift the error token. */ +- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); +- +- yystate = yyn; +- goto yynewstate; +- +- +-/*-------------------------------------. +-| yyacceptlab -- YYACCEPT comes here. | +-`-------------------------------------*/ +-yyacceptlab: +- yyresult = 0; +- goto yyreturn; +- +-/*-----------------------------------. +-| yyabortlab -- YYABORT comes here. | +-`-----------------------------------*/ +-yyabortlab: +- yyresult = 1; +- goto yyreturn; +- +-#ifndef yyoverflow +-/*-------------------------------------------------. +-| yyexhaustedlab -- memory exhaustion comes here. | +-`-------------------------------------------------*/ +-yyexhaustedlab: +- yyerror (YY_("memory exhausted")); +- yyresult = 2; +- /* Fall through. */ +-#endif +- +-yyreturn: +- if (yychar != YYEOF && yychar != YYEMPTY) +- yydestruct ("Cleanup: discarding lookahead", +- yytoken, &yylval); +- /* Do not reclaim the symbols of the rule which action triggered +- this YYABORT or YYACCEPT. */ +- YYPOPSTACK (yylen); +- YY_STACK_PRINT (yyss, yyssp); +- while (yyssp != yyss) +- { +- yydestruct ("Cleanup: popping", +- yystos[*yyssp], yyvsp); +- YYPOPSTACK (1); +- } +-#ifndef yyoverflow +- if (yyss != yyssa) +- YYSTACK_FREE (yyss); +-#endif +-#if YYERROR_VERBOSE +- if (yymsg != yymsgbuf) +- YYSTACK_FREE (yymsg); +-#endif +- /* Make sure YYID is used. */ +- return YYID (yyresult); +-} +- +- +-#line 492 "nlmheader.y" +- +- +-/* If strerror is just a macro, we want to use the one from libiberty +- since it will handle undefined values. */ +-#undef strerror +-extern char *strerror PARAMS ((int)); +- +-/* The lexer is simple, too simple for flex. Keywords are only +- recognized at the start of lines. Everything else must be an +- argument. A comma is treated as whitespace. */ +- +-/* The states the lexer can be in. */ +- +-enum lex_state +-{ +- /* At the beginning of a line. */ +- BEGINNING_OF_LINE, +- /* In the middle of a line. */ +- IN_LINE +-}; +- +-/* We need to keep a stack of files to handle file inclusion. */ +- +-struct input +-{ +- /* The file to read from. */ +- FILE *file; +- /* The name of the file. */ +- char *name; +- /* The current line number. */ +- int lineno; +- /* The current state. */ +- enum lex_state state; +- /* The next file on the stack. */ +- struct input *next; +-}; +- +-/* The current input file. */ +- +-static struct input current; +- +-/* The character which introduces comments. */ +-#define COMMENT_CHAR '#' +- +-/* Start the lexer going on the main input file. */ +- +-bfd_boolean +-nlmlex_file (const char *name) +-{ +- current.next = NULL; +- return nlmlex_file_open (name); +-} +- +-/* Start the lexer going on a subsidiary input file. */ +- +-static void +-nlmlex_file_push (const char *name) +-{ +- struct input *push; +- +- push = (struct input *) xmalloc (sizeof (struct input)); +- *push = current; +- if (nlmlex_file_open (name)) +- current.next = push; +- else +- { +- current = *push; +- free (push); +- } +-} +- +-/* Start lexing from a file. */ +- +-static bfd_boolean +-nlmlex_file_open (const char *name) +-{ +- current.file = fopen (name, "r"); +- if (current.file == NULL) +- { +- fprintf (stderr, "%s:%s: %s\n", program_name, name, strerror (errno)); +- ++parse_errors; +- return FALSE; +- } +- current.name = xstrdup (name); +- current.lineno = 1; +- current.state = BEGINNING_OF_LINE; +- return TRUE; +-} +- +-/* Table used to turn keywords into tokens. */ +- +-struct keyword_tokens_struct +-{ +- const char *keyword; +- int token; +-}; +- +-static struct keyword_tokens_struct keyword_tokens[] = +-{ +- { "CHECK", CHECK }, +- { "CODESTART", CODESTART }, +- { "COPYRIGHT", COPYRIGHT }, +- { "CUSTOM", CUSTOM }, +- { "DATE", DATE }, +- { "DEBUG", DEBUG_K }, +- { "DESCRIPTION", DESCRIPTION }, +- { "EXIT", EXIT }, +- { "EXPORT", EXPORT }, +- { "FLAG_ON", FLAG_ON }, +- { "FLAG_OFF", FLAG_OFF }, +- { "FULLMAP", FULLMAP }, +- { "HELP", HELP }, +- { "IMPORT", IMPORT }, +- { "INPUT", INPUT }, +- { "MAP", MAP }, +- { "MESSAGES", MESSAGES }, +- { "MODULE", MODULE }, +- { "MULTIPLE", MULTIPLE }, +- { "OS_DOMAIN", OS_DOMAIN }, +- { "OUTPUT", OUTPUT }, +- { "PSEUDOPREEMPTION", PSEUDOPREEMPTION }, +- { "REENTRANT", REENTRANT }, +- { "SCREENNAME", SCREENNAME }, +- { "SHARELIB", SHARELIB }, +- { "STACK", STACK }, +- { "STACKSIZE", STACK }, +- { "START", START }, +- { "SYNCHRONIZE", SYNCHRONIZE }, +- { "THREADNAME", THREADNAME }, +- { "TYPE", TYPE }, +- { "VERBOSE", VERBOSE }, +- { "VERSION", VERSIONK }, +- { "XDCDATA", XDCDATA } +-}; +- +-#define KEYWORD_COUNT (sizeof (keyword_tokens) / sizeof (keyword_tokens[0])) +- +-/* The lexer accumulates strings in these variables. */ +-static char *lex_buf; +-static int lex_size; +-static int lex_pos; +- +-/* Start accumulating strings into the buffer. */ +-#define BUF_INIT() \ +- ((void) (lex_buf != NULL ? lex_pos = 0 : nlmlex_buf_init ())) +- +-static int +-nlmlex_buf_init (void) +-{ +- lex_size = 10; +- lex_buf = xmalloc (lex_size + 1); +- lex_pos = 0; +- return 0; +-} +- +-/* Finish a string in the buffer. */ +-#define BUF_FINISH() ((void) (lex_buf[lex_pos] = '\0')) +- +-/* Accumulate a character into the buffer. */ +-#define BUF_ADD(c) \ +- ((void) (lex_pos < lex_size \ +- ? lex_buf[lex_pos++] = (c) \ +- : nlmlex_buf_add (c))) +- +-static char +-nlmlex_buf_add (int c) +-{ +- if (lex_pos >= lex_size) +- { +- lex_size *= 2; +- lex_buf = xrealloc (lex_buf, lex_size + 1); +- } +- +- return lex_buf[lex_pos++] = c; +-} +- +-/* The lexer proper. This is called by the bison generated parsing +- code. */ +- +-static int +-yylex (void) +-{ +- int c; +- +-tail_recurse: +- +- c = getc (current.file); +- +- /* Commas are treated as whitespace characters. */ +- while (ISSPACE (c) || c == ',') +- { +- current.state = IN_LINE; +- if (c == '\n') +- { +- ++current.lineno; +- current.state = BEGINNING_OF_LINE; +- } +- c = getc (current.file); +- } +- +- /* At the end of the file we either pop to the previous file or +- finish up. */ +- if (c == EOF) +- { +- fclose (current.file); +- free (current.name); +- if (current.next == NULL) +- return 0; +- else +- { +- struct input *next; +- +- next = current.next; +- current = *next; +- free (next); +- goto tail_recurse; +- } +- } +- +- /* A comment character always means to drop everything until the +- next newline. */ +- if (c == COMMENT_CHAR) +- { +- do +- { +- c = getc (current.file); +- } +- while (c != '\n'); +- ++current.lineno; +- current.state = BEGINNING_OF_LINE; +- goto tail_recurse; +- } +- +- /* An '@' introduces an include file. */ +- if (c == '@') +- { +- do +- { +- c = getc (current.file); +- if (c == '\n') +- ++current.lineno; +- } +- while (ISSPACE (c)); +- BUF_INIT (); +- while (! ISSPACE (c) && c != EOF) +- { +- BUF_ADD (c); +- c = getc (current.file); +- } +- BUF_FINISH (); +- +- ungetc (c, current.file); +- +- nlmlex_file_push (lex_buf); +- goto tail_recurse; +- } +- +- /* A non-space character at the start of a line must be the start of +- a keyword. */ +- if (current.state == BEGINNING_OF_LINE) +- { +- BUF_INIT (); +- while (ISALNUM (c) || c == '_') +- { +- BUF_ADD (TOUPPER (c)); +- c = getc (current.file); +- } +- BUF_FINISH (); +- +- if (c != EOF && ! ISSPACE (c) && c != ',') +- { +- nlmheader_identify (); +- fprintf (stderr, _("%s:%d: illegal character in keyword: %c\n"), +- current.name, current.lineno, c); +- } +- else +- { +- unsigned int i; +- +- for (i = 0; i < KEYWORD_COUNT; i++) +- { +- if (lex_buf[0] == keyword_tokens[i].keyword[0] +- && strcmp (lex_buf, keyword_tokens[i].keyword) == 0) +- { +- /* Pushing back the final whitespace avoids worrying +- about \n here. */ +- ungetc (c, current.file); +- current.state = IN_LINE; +- return keyword_tokens[i].token; +- } +- } +- +- nlmheader_identify (); +- fprintf (stderr, _("%s:%d: unrecognized keyword: %s\n"), +- current.name, current.lineno, lex_buf); +- } +- +- ++parse_errors; +- /* Treat the rest of this line as a comment. */ +- ungetc (COMMENT_CHAR, current.file); +- goto tail_recurse; +- } +- +- /* Parentheses just represent themselves. */ +- if (c == '(' || c == ')') +- return c; +- +- /* Handle quoted strings. */ +- if (c == '"' || c == '\'') +- { +- int quote; +- int start_lineno; +- +- quote = c; +- start_lineno = current.lineno; +- +- c = getc (current.file); +- BUF_INIT (); +- while (c != quote && c != EOF) +- { +- BUF_ADD (c); +- if (c == '\n') +- ++current.lineno; +- c = getc (current.file); +- } +- BUF_FINISH (); +- +- if (c == EOF) +- { +- nlmheader_identify (); +- fprintf (stderr, _("%s:%d: end of file in quoted string\n"), +- current.name, start_lineno); +- ++parse_errors; +- } +- +- /* FIXME: Possible memory leak. */ +- yylval.string = xstrdup (lex_buf); +- return QUOTED_STRING; +- } +- +- /* Gather a generic argument. */ +- BUF_INIT (); +- while (! ISSPACE (c) +- && c != ',' +- && c != COMMENT_CHAR +- && c != '(' +- && c != ')') +- { +- BUF_ADD (c); +- c = getc (current.file); +- } +- BUF_FINISH (); +- +- ungetc (c, current.file); +- +- /* FIXME: Possible memory leak. */ +- yylval.string = xstrdup (lex_buf); +- return STRING; +-} +- +-/* Get a number from a string. */ +- +-static long +-nlmlex_get_number (const char *s) +-{ +- long ret; +- char *send; +- +- ret = strtol (s, &send, 10); +- if (*send != '\0') +- nlmheader_warn (_("bad number"), -1); +- return ret; +-} +- +-/* Prefix the nlmconv warnings with a note as to where they come from. +- We don't use program_name on every warning, because then some +- versions of the emacs next-error function can't recognize the line +- number. */ +- +-static void +-nlmheader_identify (void) +-{ +- static int done; +- +- if (! done) +- { +- fprintf (stderr, _("%s: problems in NLM command language input:\n"), +- program_name); +- done = 1; +- } +-} +- +-/* Issue a warning. */ +- +-static void +-nlmheader_warn (const char *s, int imax) +-{ +- nlmheader_identify (); +- fprintf (stderr, "%s:%d: %s", current.name, current.lineno, s); +- if (imax != -1) +- fprintf (stderr, " (max %d)", imax); +- fprintf (stderr, "\n"); +-} +- +-/* Report an error. */ +- +-static void +-nlmheader_error (const char *s) +-{ +- nlmheader_warn (s, -1); +- ++parse_errors; +-} +- +-/* Add a string to a string list. */ +- +-static struct string_list * +-string_list_cons (char *s, struct string_list *l) +-{ +- struct string_list *ret; +- +- ret = (struct string_list *) xmalloc (sizeof (struct string_list)); +- ret->next = l; +- ret->string = s; +- return ret; +-} +- +-/* Append a string list to another string list. */ +- +-static struct string_list * +-string_list_append (struct string_list *l1, struct string_list *l2) +-{ +- register struct string_list **pp; +- +- for (pp = &l1; *pp != NULL; pp = &(*pp)->next) +- ; +- *pp = l2; +- return l1; +-} +- +-/* Append a string to a string list. */ +- +-static struct string_list * +-string_list_append1 (struct string_list *l, char *s) +-{ +- struct string_list *n; +- register struct string_list **pp; +- +- n = (struct string_list *) xmalloc (sizeof (struct string_list)); +- n->next = NULL; +- n->string = s; +- for (pp = &l; *pp != NULL; pp = &(*pp)->next) +- ; +- *pp = n; +- return l; +-} +- +-/* Duplicate a string in memory. */ +- +-static char * +-xstrdup (const char *s) +-{ +- unsigned long len; +- char *ret; +- +- len = strlen (s); +- ret = xmalloc (len + 1); +- strcpy (ret, s); +- return ret; +-} +- +diff -Nur binutils-2.24.orig/binutils/nlmheader.h binutils-2.24/binutils/nlmheader.h +--- binutils-2.24.orig/binutils/nlmheader.h 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/nlmheader.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,135 +0,0 @@ +-/* A Bison parser, made by GNU Bison 2.3. */ +- +-/* Skeleton interface for Bison's Yacc-like parsers in C +- +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +- 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., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. */ +- +-/* As a special exception, you may create a larger work that contains +- part or all of the Bison parser skeleton and distribute that work +- under terms of your choice, so long as that work isn't itself a +- parser generator using the skeleton or a modified version thereof +- as a parser skeleton. Alternatively, if you modify or redistribute +- the parser skeleton itself, you may (at your option) remove this +- special exception, which will cause the skeleton and the resulting +- Bison output files to be licensed under the GNU General Public +- License without this special exception. +- +- This special exception was added by the Free Software Foundation in +- version 2.2 of Bison. */ +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- CHECK = 258, +- CODESTART = 259, +- COPYRIGHT = 260, +- CUSTOM = 261, +- DATE = 262, +- DEBUG_K = 263, +- DESCRIPTION = 264, +- EXIT = 265, +- EXPORT = 266, +- FLAG_ON = 267, +- FLAG_OFF = 268, +- FULLMAP = 269, +- HELP = 270, +- IMPORT = 271, +- INPUT = 272, +- MAP = 273, +- MESSAGES = 274, +- MODULE = 275, +- MULTIPLE = 276, +- OS_DOMAIN = 277, +- OUTPUT = 278, +- PSEUDOPREEMPTION = 279, +- REENTRANT = 280, +- SCREENNAME = 281, +- SHARELIB = 282, +- STACK = 283, +- START = 284, +- SYNCHRONIZE = 285, +- THREADNAME = 286, +- TYPE = 287, +- VERBOSE = 288, +- VERSIONK = 289, +- XDCDATA = 290, +- STRING = 291, +- QUOTED_STRING = 292 +- }; +-#endif +-/* Tokens. */ +-#define CHECK 258 +-#define CODESTART 259 +-#define COPYRIGHT 260 +-#define CUSTOM 261 +-#define DATE 262 +-#define DEBUG_K 263 +-#define DESCRIPTION 264 +-#define EXIT 265 +-#define EXPORT 266 +-#define FLAG_ON 267 +-#define FLAG_OFF 268 +-#define FULLMAP 269 +-#define HELP 270 +-#define IMPORT 271 +-#define INPUT 272 +-#define MAP 273 +-#define MESSAGES 274 +-#define MODULE 275 +-#define MULTIPLE 276 +-#define OS_DOMAIN 277 +-#define OUTPUT 278 +-#define PSEUDOPREEMPTION 279 +-#define REENTRANT 280 +-#define SCREENNAME 281 +-#define SHARELIB 282 +-#define STACK 283 +-#define START 284 +-#define SYNCHRONIZE 285 +-#define THREADNAME 286 +-#define TYPE 287 +-#define VERBOSE 288 +-#define VERSIONK 289 +-#define XDCDATA 290 +-#define STRING 291 +-#define QUOTED_STRING 292 +- +- +- +- +-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +-typedef union YYSTYPE +-#line 113 "nlmheader.y" +-{ +- char *string; +- struct string_list *list; +-} +-/* Line 1529 of yacc.c. */ +-#line 128 "nlmheader.h" +- YYSTYPE; +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +-extern YYSTYPE yylval; +- +diff -Nur binutils-2.24.orig/binutils/po/.cvsignore binutils-2.24/binutils/po/.cvsignore +--- binutils-2.24.orig/binutils/po/.cvsignore 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-2.24/binutils/po/.cvsignore 2016-04-10 20:30:46.000000000 +0200 +@@ -0,0 +1 @@ ++*.gmo +diff -Nur binutils-2.24.orig/binutils/rcparse.c binutils-2.24/binutils/rcparse.c +--- binutils-2.24.orig/binutils/rcparse.c 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/rcparse.c 1970-01-01 01:00:00.000000000 +0100 +@@ -1,4663 +0,0 @@ +-/* A Bison parser, made by GNU Bison 2.3. */ +- +-/* Skeleton implementation for Bison's Yacc-like parsers in C +- +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +- 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., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. */ +- +-/* As a special exception, you may create a larger work that contains +- part or all of the Bison parser skeleton and distribute that work +- under terms of your choice, so long as that work isn't itself a +- parser generator using the skeleton or a modified version thereof +- as a parser skeleton. Alternatively, if you modify or redistribute +- the parser skeleton itself, you may (at your option) remove this +- special exception, which will cause the skeleton and the resulting +- Bison output files to be licensed under the GNU General Public +- License without this special exception. +- +- This special exception was added by the Free Software Foundation in +- version 2.2 of Bison. */ +- +-/* C LALR(1) parser skeleton written by Richard Stallman, by +- simplifying the original so-called "semantic" parser. */ +- +-/* All symbols defined below should begin with yy or YY, to avoid +- infringing on user name space. This should be done even for local +- variables, as they might otherwise be expanded by user macros. +- There are some unavoidable exceptions within include files to +- define necessary library symbols; they are noted "INFRINGES ON +- USER NAME SPACE" below. */ +- +-/* Identify Bison output. */ +-#define YYBISON 1 +- +-/* Bison version. */ +-#define YYBISON_VERSION "2.3" +- +-/* Skeleton name. */ +-#define YYSKELETON_NAME "yacc.c" +- +-/* Pure parsers. */ +-#define YYPURE 0 +- +-/* Using locations. */ +-#define YYLSP_NEEDED 0 +- +- +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- BEG = 258, +- END = 259, +- ACCELERATORS = 260, +- VIRTKEY = 261, +- ASCII = 262, +- NOINVERT = 263, +- SHIFT = 264, +- CONTROL = 265, +- ALT = 266, +- BITMAP = 267, +- CURSOR = 268, +- DIALOG = 269, +- DIALOGEX = 270, +- EXSTYLE = 271, +- CAPTION = 272, +- CLASS = 273, +- STYLE = 274, +- AUTO3STATE = 275, +- AUTOCHECKBOX = 276, +- AUTORADIOBUTTON = 277, +- CHECKBOX = 278, +- COMBOBOX = 279, +- CTEXT = 280, +- DEFPUSHBUTTON = 281, +- EDITTEXT = 282, +- GROUPBOX = 283, +- LISTBOX = 284, +- LTEXT = 285, +- PUSHBOX = 286, +- PUSHBUTTON = 287, +- RADIOBUTTON = 288, +- RTEXT = 289, +- SCROLLBAR = 290, +- STATE3 = 291, +- USERBUTTON = 292, +- BEDIT = 293, +- HEDIT = 294, +- IEDIT = 295, +- FONT = 296, +- ICON = 297, +- ANICURSOR = 298, +- ANIICON = 299, +- DLGINCLUDE = 300, +- DLGINIT = 301, +- FONTDIR = 302, +- HTML = 303, +- MANIFEST = 304, +- PLUGPLAY = 305, +- VXD = 306, +- TOOLBAR = 307, +- BUTTON = 308, +- LANGUAGE = 309, +- CHARACTERISTICS = 310, +- VERSIONK = 311, +- MENU = 312, +- MENUEX = 313, +- MENUITEM = 314, +- SEPARATOR = 315, +- POPUP = 316, +- CHECKED = 317, +- GRAYED = 318, +- HELP = 319, +- INACTIVE = 320, +- MENUBARBREAK = 321, +- MENUBREAK = 322, +- MESSAGETABLE = 323, +- RCDATA = 324, +- STRINGTABLE = 325, +- VERSIONINFO = 326, +- FILEVERSION = 327, +- PRODUCTVERSION = 328, +- FILEFLAGSMASK = 329, +- FILEFLAGS = 330, +- FILEOS = 331, +- FILETYPE = 332, +- FILESUBTYPE = 333, +- BLOCKSTRINGFILEINFO = 334, +- BLOCKVARFILEINFO = 335, +- VALUE = 336, +- BLOCK = 337, +- MOVEABLE = 338, +- FIXED = 339, +- PURE = 340, +- IMPURE = 341, +- PRELOAD = 342, +- LOADONCALL = 343, +- DISCARDABLE = 344, +- NOT = 345, +- QUOTEDUNISTRING = 346, +- QUOTEDSTRING = 347, +- STRING = 348, +- NUMBER = 349, +- SIZEDUNISTRING = 350, +- SIZEDSTRING = 351, +- IGNORED_TOKEN = 352, +- NEG = 353 +- }; +-#endif +-/* Tokens. */ +-#define BEG 258 +-#define END 259 +-#define ACCELERATORS 260 +-#define VIRTKEY 261 +-#define ASCII 262 +-#define NOINVERT 263 +-#define SHIFT 264 +-#define CONTROL 265 +-#define ALT 266 +-#define BITMAP 267 +-#define CURSOR 268 +-#define DIALOG 269 +-#define DIALOGEX 270 +-#define EXSTYLE 271 +-#define CAPTION 272 +-#define CLASS 273 +-#define STYLE 274 +-#define AUTO3STATE 275 +-#define AUTOCHECKBOX 276 +-#define AUTORADIOBUTTON 277 +-#define CHECKBOX 278 +-#define COMBOBOX 279 +-#define CTEXT 280 +-#define DEFPUSHBUTTON 281 +-#define EDITTEXT 282 +-#define GROUPBOX 283 +-#define LISTBOX 284 +-#define LTEXT 285 +-#define PUSHBOX 286 +-#define PUSHBUTTON 287 +-#define RADIOBUTTON 288 +-#define RTEXT 289 +-#define SCROLLBAR 290 +-#define STATE3 291 +-#define USERBUTTON 292 +-#define BEDIT 293 +-#define HEDIT 294 +-#define IEDIT 295 +-#define FONT 296 +-#define ICON 297 +-#define ANICURSOR 298 +-#define ANIICON 299 +-#define DLGINCLUDE 300 +-#define DLGINIT 301 +-#define FONTDIR 302 +-#define HTML 303 +-#define MANIFEST 304 +-#define PLUGPLAY 305 +-#define VXD 306 +-#define TOOLBAR 307 +-#define BUTTON 308 +-#define LANGUAGE 309 +-#define CHARACTERISTICS 310 +-#define VERSIONK 311 +-#define MENU 312 +-#define MENUEX 313 +-#define MENUITEM 314 +-#define SEPARATOR 315 +-#define POPUP 316 +-#define CHECKED 317 +-#define GRAYED 318 +-#define HELP 319 +-#define INACTIVE 320 +-#define MENUBARBREAK 321 +-#define MENUBREAK 322 +-#define MESSAGETABLE 323 +-#define RCDATA 324 +-#define STRINGTABLE 325 +-#define VERSIONINFO 326 +-#define FILEVERSION 327 +-#define PRODUCTVERSION 328 +-#define FILEFLAGSMASK 329 +-#define FILEFLAGS 330 +-#define FILEOS 331 +-#define FILETYPE 332 +-#define FILESUBTYPE 333 +-#define BLOCKSTRINGFILEINFO 334 +-#define BLOCKVARFILEINFO 335 +-#define VALUE 336 +-#define BLOCK 337 +-#define MOVEABLE 338 +-#define FIXED 339 +-#define PURE 340 +-#define IMPURE 341 +-#define PRELOAD 342 +-#define LOADONCALL 343 +-#define DISCARDABLE 344 +-#define NOT 345 +-#define QUOTEDUNISTRING 346 +-#define QUOTEDSTRING 347 +-#define STRING 348 +-#define NUMBER 349 +-#define SIZEDUNISTRING 350 +-#define SIZEDSTRING 351 +-#define IGNORED_TOKEN 352 +-#define NEG 353 +- +- +- +- +-/* Copy the first part of user declarations. */ +-#line 1 "rcparse.y" +- /* rcparse.y -- parser for Windows rc files +- Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008, +- 2011 Free Software Foundation, Inc. +- Written by Ian Lance Taylor, Cygnus Support. +- Extended by Kai Tietz, Onevision. +- +- 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 3 of the License, or +- (at your option) any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +- 02110-1301, USA. */ +- +- +-/* This is a parser for Windows rc files. It is based on the parser +- by Gunther Ebert . */ +- +-#include "sysdep.h" +-#include "bfd.h" +-#include "bucomm.h" +-#include "libiberty.h" +-#include "windres.h" +-#include "safe-ctype.h" +- +-/* The current language. */ +- +-static unsigned short language; +- +-/* The resource information during a sub statement. */ +- +-static rc_res_res_info sub_res_info; +- +-/* Dialog information. This is built by the nonterminals styles and +- controls. */ +- +-static rc_dialog dialog; +- +-/* This is used when building a style. It is modified by the +- nonterminal styleexpr. */ +- +-static unsigned long style; +- +-/* These are used when building a control. They are set before using +- control_params. */ +- +-static rc_uint_type base_style; +-static rc_uint_type default_style; +-static rc_res_id class; +-static rc_res_id res_text_field; +-static unichar null_unichar; +- +-/* This is used for COMBOBOX, LISTBOX and EDITTEXT which +- do not allow resource 'text' field in control definition. */ +-static const rc_res_id res_null_text = { 1, {{0, &null_unichar}}}; +- +- +- +-/* Enabling traces. */ +-#ifndef YYDEBUG +-# define YYDEBUG 0 +-#endif +- +-/* Enabling verbose error messages. */ +-#ifdef YYERROR_VERBOSE +-# undef YYERROR_VERBOSE +-# define YYERROR_VERBOSE 1 +-#else +-# define YYERROR_VERBOSE 0 +-#endif +- +-/* Enabling the token table. */ +-#ifndef YYTOKEN_TABLE +-# define YYTOKEN_TABLE 0 +-#endif +- +-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +-typedef union YYSTYPE +-#line 69 "rcparse.y" +-{ +- rc_accelerator acc; +- rc_accelerator *pacc; +- rc_dialog_control *dialog_control; +- rc_menuitem *menuitem; +- struct +- { +- rc_rcdata_item *first; +- rc_rcdata_item *last; +- } rcdata; +- rc_rcdata_item *rcdata_item; +- rc_fixed_versioninfo *fixver; +- rc_ver_info *verinfo; +- rc_ver_stringtable *verstringtable; +- rc_ver_stringinfo *verstring; +- rc_ver_varinfo *vervar; +- rc_toolbar_item *toobar_item; +- rc_res_id id; +- rc_res_res_info res_info; +- struct +- { +- rc_uint_type on; +- rc_uint_type off; +- } memflags; +- struct +- { +- rc_uint_type val; +- /* Nonzero if this number was explicitly specified as long. */ +- int dword; +- } i; +- rc_uint_type il; +- rc_uint_type is; +- const char *s; +- struct +- { +- rc_uint_type length; +- const char *s; +- } ss; +- unichar *uni; +- struct +- { +- rc_uint_type length; +- const unichar *s; +- } suni; +-} +-/* Line 193 of yacc.c. */ +-#line 405 "rcparse.c" +- YYSTYPE; +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +- +- +-/* Copy the second part of user declarations. */ +- +- +-/* Line 216 of yacc.c. */ +-#line 418 "rcparse.c" +- +-#ifdef short +-# undef short +-#endif +- +-#ifdef YYTYPE_UINT8 +-typedef YYTYPE_UINT8 yytype_uint8; +-#else +-typedef unsigned char yytype_uint8; +-#endif +- +-#ifdef YYTYPE_INT8 +-typedef YYTYPE_INT8 yytype_int8; +-#elif (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-typedef signed char yytype_int8; +-#else +-typedef short int yytype_int8; +-#endif +- +-#ifdef YYTYPE_UINT16 +-typedef YYTYPE_UINT16 yytype_uint16; +-#else +-typedef unsigned short int yytype_uint16; +-#endif +- +-#ifdef YYTYPE_INT16 +-typedef YYTYPE_INT16 yytype_int16; +-#else +-typedef short int yytype_int16; +-#endif +- +-#ifndef YYSIZE_T +-# ifdef __SIZE_TYPE__ +-# define YYSIZE_T __SIZE_TYPE__ +-# elif defined size_t +-# define YYSIZE_T size_t +-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYSIZE_T size_t +-# else +-# define YYSIZE_T unsigned int +-# endif +-#endif +- +-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) +- +-#ifndef YY_ +-# if defined YYENABLE_NLS && YYENABLE_NLS +-# if ENABLE_NLS +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YY_(msgid) dgettext ("bison-runtime", msgid) +-# endif +-# endif +-# ifndef YY_ +-# define YY_(msgid) msgid +-# endif +-#endif +- +-/* Suppress unused-variable warnings by "using" E. */ +-#if ! defined lint || defined __GNUC__ +-# define YYUSE(e) ((void) (e)) +-#else +-# define YYUSE(e) /* empty */ +-#endif +- +-/* Identity function, used to suppress warnings about constant conditions. */ +-#ifndef lint +-# define YYID(n) (n) +-#else +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static int +-YYID (int i) +-#else +-static int +-YYID (i) +- int i; +-#endif +-{ +- return i; +-} +-#endif +- +-#if ! defined yyoverflow || YYERROR_VERBOSE +- +-/* The parser invokes alloca or malloc; define the necessary symbols. */ +- +-# ifdef YYSTACK_USE_ALLOCA +-# if YYSTACK_USE_ALLOCA +-# ifdef __GNUC__ +-# define YYSTACK_ALLOC __builtin_alloca +-# elif defined __BUILTIN_VA_ARG_INCR +-# include /* INFRINGES ON USER NAME SPACE */ +-# elif defined _AIX +-# define YYSTACK_ALLOC __alloca +-# elif defined _MSC_VER +-# include /* INFRINGES ON USER NAME SPACE */ +-# define alloca _alloca +-# else +-# define YYSTACK_ALLOC alloca +-# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-# include /* INFRINGES ON USER NAME SPACE */ +-# ifndef _STDLIB_H +-# define _STDLIB_H 1 +-# endif +-# endif +-# endif +-# endif +-# endif +- +-# ifdef YYSTACK_ALLOC +- /* Pacify GCC's `empty if-body' warning. */ +-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +-# ifndef YYSTACK_ALLOC_MAXIMUM +- /* The OS might guarantee only one guard page at the bottom of the stack, +- and a page size can be as small as 4096 bytes. So we cannot safely +- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number +- to allow for a few compiler-allocated temporary stack slots. */ +-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +-# endif +-# else +-# define YYSTACK_ALLOC YYMALLOC +-# define YYSTACK_FREE YYFREE +-# ifndef YYSTACK_ALLOC_MAXIMUM +-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +-# endif +-# if (defined __cplusplus && ! defined _STDLIB_H \ +- && ! ((defined YYMALLOC || defined malloc) \ +- && (defined YYFREE || defined free))) +-# include /* INFRINGES ON USER NAME SPACE */ +-# ifndef _STDLIB_H +-# define _STDLIB_H 1 +-# endif +-# endif +-# ifndef YYMALLOC +-# define YYMALLOC malloc +-# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +-# endif +-# endif +-# ifndef YYFREE +-# define YYFREE free +-# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-void free (void *); /* INFRINGES ON USER NAME SPACE */ +-# endif +-# endif +-# endif +-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ +- +- +-#if (! defined yyoverflow \ +- && (! defined __cplusplus \ +- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) +- +-/* A type that is properly aligned for any stack member. */ +-union yyalloc +-{ +- yytype_int16 yyss; +- YYSTYPE yyvs; +- }; +- +-/* The size of the maximum gap between one aligned stack and the next. */ +-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +- +-/* The size of an array large to enough to hold all stacks, each with +- N elements. */ +-# define YYSTACK_BYTES(N) \ +- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ +- + YYSTACK_GAP_MAXIMUM) +- +-/* Copy COUNT objects from FROM to TO. The source and destination do +- not overlap. */ +-# ifndef YYCOPY +-# if defined __GNUC__ && 1 < __GNUC__ +-# define YYCOPY(To, From, Count) \ +- __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +-# else +-# define YYCOPY(To, From, Count) \ +- do \ +- { \ +- YYSIZE_T yyi; \ +- for (yyi = 0; yyi < (Count); yyi++) \ +- (To)[yyi] = (From)[yyi]; \ +- } \ +- while (YYID (0)) +-# endif +-# endif +- +-/* Relocate STACK from its old location to the new one. The +- local variables YYSIZE and YYSTACKSIZE give the old and new number of +- elements in the stack, and YYPTR gives the new location of the +- stack. Advance YYPTR to a properly aligned location for the next +- stack. */ +-# define YYSTACK_RELOCATE(Stack) \ +- do \ +- { \ +- YYSIZE_T yynewbytes; \ +- YYCOPY (&yyptr->Stack, Stack, yysize); \ +- Stack = &yyptr->Stack; \ +- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ +- yyptr += yynewbytes / sizeof (*yyptr); \ +- } \ +- while (YYID (0)) +- +-#endif +- +-/* YYFINAL -- State number of the termination state. */ +-#define YYFINAL 2 +-/* YYLAST -- Last index in YYTABLE. */ +-#define YYLAST 830 +- +-/* YYNTOKENS -- Number of terminals. */ +-#define YYNTOKENS 112 +-/* YYNNTS -- Number of nonterminals. */ +-#define YYNNTS 102 +-/* YYNRULES -- Number of rules. */ +-#define YYNRULES 276 +-/* YYNRULES -- Number of states. */ +-#define YYNSTATES 520 +- +-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +-#define YYUNDEFTOK 2 +-#define YYMAXUTOK 353 +- +-#define YYTRANSLATE(YYX) \ +- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) +- +-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +-static const yytype_uint8 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, 105, 100, 2, +- 110, 111, 103, 101, 108, 102, 2, 104, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 109, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 99, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 98, 2, 106, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 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, 24, +- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, +- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, +- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, +- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, +- 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, +- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, +- 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, +- 95, 96, 97, 107 +-}; +- +-#if YYDEBUG +-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in +- YYRHS. */ +-static const yytype_uint16 yyprhs[] = +-{ +- 0, 0, 3, 4, 7, 10, 13, 16, 19, 22, +- 25, 28, 31, 34, 37, 40, 43, 46, 49, 56, +- 57, 60, 63, 68, 70, 72, 74, 78, 81, 83, +- 85, 87, 89, 91, 93, 98, 103, 104, 118, 119, +- 133, 134, 149, 150, 154, 155, 159, 163, 167, 171, +- 175, 181, 188, 196, 205, 209, 213, 218, 222, 223, +- 226, 227, 232, 233, 238, 239, 244, 245, 250, 251, +- 256, 257, 261, 273, 286, 287, 292, 293, 298, 299, +- 303, 304, 309, 310, 315, 322, 331, 342, 354, 355, +- 360, 361, 365, 366, 371, 372, 377, 378, 383, 384, +- 389, 390, 395, 396, 400, 401, 406, 407, 423, 430, +- 439, 449, 452, 453, 456, 458, 460, 461, 465, 466, +- 470, 471, 475, 476, 480, 485, 490, 494, 501, 502, +- 505, 510, 513, 520, 521, 525, 528, 530, 532, 534, +- 536, 538, 540, 547, 548, 551, 554, 558, 564, 567, +- 573, 580, 588, 598, 603, 604, 607, 608, 610, 612, +- 614, 616, 620, 624, 628, 631, 632, 639, 640, 644, +- 649, 652, 654, 656, 658, 660, 662, 664, 666, 668, +- 670, 672, 679, 684, 693, 694, 698, 701, 708, 709, +- 716, 723, 727, 731, 735, 739, 743, 744, 750, 758, +- 759, 765, 766, 772, 773, 777, 779, 781, 783, 785, +- 788, 790, 793, 794, 797, 801, 806, 810, 811, 814, +- 815, 818, 820, 822, 824, 826, 828, 830, 832, 834, +- 836, 838, 841, 843, 845, 847, 849, 851, 854, 856, +- 859, 861, 864, 866, 869, 873, 878, 880, 884, 885, +- 887, 890, 892, 894, 898, 901, 904, 908, 912, 916, +- 920, 924, 928, 932, 936, 939, 941, 943, 947, 950, +- 954, 958, 962, 966, 970, 974, 978 +-}; +- +-/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +-static const yytype_int16 yyrhs[] = +-{ +- 113, 0, -1, -1, 113, 114, -1, 113, 120, -1, +- 113, 121, -1, 113, 122, -1, 113, 162, -1, 113, +- 163, -1, 113, 164, -1, 113, 165, -1, 113, 170, +- -1, 113, 173, -1, 113, 178, -1, 113, 183, -1, +- 113, 182, -1, 113, 185, -1, 113, 97, -1, 191, +- 5, 194, 3, 115, 4, -1, -1, 115, 116, -1, +- 117, 211, -1, 117, 211, 108, 118, -1, 92, -1, +- 212, -1, 119, -1, 118, 108, 119, -1, 118, 119, +- -1, 6, -1, 7, -1, 8, -1, 9, -1, 10, +- -1, 11, -1, 191, 12, 196, 198, -1, 191, 13, +- 195, 198, -1, -1, 191, 14, 196, 126, 212, 208, +- 208, 208, 123, 127, 3, 128, 4, -1, -1, 191, +- 15, 196, 126, 212, 208, 208, 208, 124, 127, 3, +- 128, 4, -1, -1, 191, 15, 196, 126, 212, 208, +- 208, 208, 208, 125, 127, 3, 128, 4, -1, -1, +- 16, 109, 209, -1, -1, 127, 17, 199, -1, 127, +- 18, 191, -1, 127, 19, 205, -1, 127, 16, 209, +- -1, 127, 18, 199, -1, 127, 41, 209, 108, 199, +- -1, 127, 41, 209, 108, 199, 208, -1, 127, 41, +- 209, 108, 199, 208, 208, -1, 127, 41, 209, 108, +- 199, 208, 208, 208, -1, 127, 57, 191, -1, 127, +- 55, 209, -1, 127, 54, 209, 208, -1, 127, 56, +- 209, -1, -1, 128, 129, -1, -1, 20, 153, 130, +- 151, -1, -1, 21, 153, 131, 151, -1, -1, 22, +- 153, 132, 151, -1, -1, 38, 153, 133, 151, -1, +- -1, 23, 153, 134, 151, -1, -1, 24, 135, 151, +- -1, 10, 153, 209, 152, 156, 208, 208, 208, 208, +- 207, 155, -1, 10, 153, 209, 152, 156, 208, 208, +- 208, 208, 208, 208, 155, -1, -1, 25, 153, 136, +- 151, -1, -1, 26, 153, 137, 151, -1, -1, 27, +- 138, 151, -1, -1, 28, 153, 139, 151, -1, -1, +- 39, 153, 140, 151, -1, 42, 193, 209, 208, 208, +- 155, -1, 42, 193, 209, 208, 208, 208, 208, 155, +- -1, 42, 193, 209, 208, 208, 208, 208, 158, 207, +- 155, -1, 42, 193, 209, 208, 208, 208, 208, 158, +- 208, 208, 155, -1, -1, 40, 153, 141, 151, -1, +- -1, 29, 142, 151, -1, -1, 30, 153, 143, 151, +- -1, -1, 31, 153, 144, 151, -1, -1, 32, 153, +- 145, 151, -1, -1, 33, 153, 146, 151, -1, -1, +- 34, 153, 147, 151, -1, -1, 35, 148, 151, -1, +- -1, 36, 153, 149, 151, -1, -1, 37, 193, 209, +- 108, 209, 108, 209, 108, 209, 108, 209, 108, 150, +- 205, 207, -1, 209, 208, 208, 208, 208, 155, -1, +- 209, 208, 208, 208, 208, 160, 207, 155, -1, 209, +- 208, 208, 208, 208, 160, 208, 208, 155, -1, 108, +- 154, -1, -1, 154, 108, -1, 212, -1, 199, -1, +- -1, 3, 174, 4, -1, -1, 108, 157, 205, -1, +- -1, 108, 159, 205, -1, -1, 108, 161, 205, -1, +- 191, 41, 195, 198, -1, 191, 42, 195, 198, -1, +- 54, 209, 208, -1, 191, 57, 194, 3, 166, 4, +- -1, -1, 166, 167, -1, 59, 199, 208, 168, -1, +- 59, 60, -1, 61, 199, 168, 3, 166, 4, -1, +- -1, 168, 108, 169, -1, 168, 169, -1, 62, -1, +- 63, -1, 64, -1, 65, -1, 66, -1, 67, -1, +- 191, 58, 194, 3, 171, 4, -1, -1, 171, 172, +- -1, 59, 199, -1, 59, 199, 208, -1, 59, 199, +- 208, 208, 207, -1, 59, 60, -1, 61, 199, 3, +- 171, 4, -1, 61, 199, 208, 3, 171, 4, -1, +- 61, 199, 208, 208, 3, 171, 4, -1, 61, 199, +- 208, 208, 208, 207, 3, 171, 4, -1, 191, 68, +- 196, 198, -1, -1, 175, 176, -1, -1, 177, -1, +- 203, -1, 204, -1, 210, -1, 177, 108, 203, -1, +- 177, 108, 204, -1, 177, 108, 210, -1, 177, 108, +- -1, -1, 70, 194, 3, 179, 180, 4, -1, -1, +- 180, 209, 202, -1, 180, 209, 108, 202, -1, 180, +- 1, -1, 191, -1, 48, -1, 69, -1, 49, -1, +- 50, -1, 51, -1, 45, -1, 46, -1, 43, -1, +- 44, -1, 191, 181, 194, 3, 174, 4, -1, 191, +- 181, 194, 198, -1, 191, 52, 194, 209, 208, 3, +- 184, 4, -1, -1, 184, 53, 191, -1, 184, 60, +- -1, 191, 71, 186, 3, 187, 4, -1, -1, 186, +- 72, 209, 207, 207, 207, -1, 186, 73, 209, 207, +- 207, 207, -1, 186, 74, 209, -1, 186, 75, 209, +- -1, 186, 76, 209, -1, 186, 77, 209, -1, 186, +- 78, 209, -1, -1, 187, 79, 3, 188, 4, -1, +- 187, 80, 3, 81, 199, 190, 4, -1, -1, 188, +- 82, 3, 189, 4, -1, -1, 189, 81, 199, 108, +- 199, -1, -1, 190, 208, 208, -1, 212, -1, 192, +- -1, 200, -1, 93, -1, 212, 108, -1, 192, -1, +- 192, 108, -1, -1, 194, 197, -1, 194, 55, 209, +- -1, 194, 54, 209, 208, -1, 194, 56, 209, -1, +- -1, 195, 197, -1, -1, 196, 197, -1, 83, -1, +- 84, -1, 85, -1, 86, -1, 87, -1, 88, -1, +- 89, -1, 92, -1, 93, -1, 200, -1, 199, 200, +- -1, 91, -1, 92, -1, 204, -1, 203, -1, 201, +- -1, 202, 201, -1, 96, -1, 203, 96, -1, 95, +- -1, 204, 95, -1, 206, -1, 90, 206, -1, 205, +- 98, 206, -1, 205, 98, 90, 206, -1, 94, -1, +- 110, 209, 111, -1, -1, 208, -1, 108, 209, -1, +- 210, -1, 94, -1, 110, 210, 111, -1, 106, 210, +- -1, 102, 210, -1, 210, 103, 210, -1, 210, 104, +- 210, -1, 210, 105, 210, -1, 210, 101, 210, -1, +- 210, 102, 210, -1, 210, 100, 210, -1, 210, 99, +- 210, -1, 210, 98, 210, -1, 108, 212, -1, 213, +- -1, 94, -1, 110, 210, 111, -1, 106, 210, -1, +- 213, 103, 210, -1, 213, 104, 210, -1, 213, 105, +- 210, -1, 213, 101, 210, -1, 213, 102, 210, -1, +- 213, 100, 210, -1, 213, 99, 210, -1, 213, 98, +- 210, -1 +-}; +- +-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +-static const yytype_uint16 yyrline[] = +-{ +- 0, 179, 179, 181, 182, 183, 184, 185, 186, 187, +- 188, 189, 190, 191, 192, 193, 194, 195, 201, 212, +- 215, 236, 241, 253, 273, 283, 287, 292, 299, 303, +- 308, 312, 316, 320, 329, 341, 355, 353, 380, 378, +- 407, 405, 437, 440, 446, 448, 454, 458, 463, 467, +- 471, 484, 499, 514, 529, 533, 537, 541, 547, 549, +- 561, 560, 573, 572, 585, 584, 597, 596, 612, 611, +- 624, 623, 637, 648, 658, 657, 670, 669, 682, 681, +- 694, 693, 706, 705, 720, 725, 731, 737, 744, 743, +- 759, 758, 771, 770, 783, 782, 794, 793, 806, 805, +- 818, 817, 830, 829, 842, 841, 855, 853, 874, 885, +- 896, 908, 919, 922, 926, 931, 941, 944, 954, 953, +- 960, 959, 966, 965, 973, 985, 998, 1007, 1018, 1021, +- 1038, 1042, 1046, 1054, 1057, 1061, 1068, 1072, 1076, 1080, +- 1084, 1088, 1097, 1108, 1111, 1128, 1132, 1136, 1140, 1144, +- 1148, 1152, 1156, 1166, 1179, 1179, 1191, 1195, 1202, 1210, +- 1218, 1226, 1235, 1244, 1253, 1263, 1262, 1267, 1269, 1274, +- 1279, 1287, 1291, 1296, 1301, 1306, 1311, 1316, 1321, 1326, +- 1331, 1342, 1349, 1359, 1365, 1366, 1385, 1410, 1421, 1426, +- 1433, 1440, 1445, 1450, 1455, 1460, 1475, 1478, 1482, 1490, +- 1493, 1501, 1504, 1512, 1515, 1524, 1529, 1538, 1542, 1552, +- 1557, 1561, 1572, 1578, 1584, 1589, 1594, 1605, 1610, 1622, +- 1627, 1639, 1644, 1649, 1654, 1659, 1664, 1669, 1679, 1683, +- 1691, 1696, 1711, 1715, 1724, 1728, 1740, 1745, 1761, 1765, +- 1777, 1781, 1803, 1807, 1811, 1815, 1822, 1826, 1836, 1839, +- 1848, 1857, 1866, 1870, 1874, 1879, 1884, 1889, 1894, 1899, +- 1904, 1909, 1914, 1919, 1930, 1939, 1950, 1954, 1958, 1963, +- 1968, 1973, 1978, 1983, 1988, 1993, 1998 +-}; +-#endif +- +-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +- First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +-static const char *const yytname[] = +-{ +- "$end", "error", "$undefined", "BEG", "END", "ACCELERATORS", "VIRTKEY", +- "ASCII", "NOINVERT", "SHIFT", "CONTROL", "ALT", "BITMAP", "CURSOR", +- "DIALOG", "DIALOGEX", "EXSTYLE", "CAPTION", "CLASS", "STYLE", +- "AUTO3STATE", "AUTOCHECKBOX", "AUTORADIOBUTTON", "CHECKBOX", "COMBOBOX", +- "CTEXT", "DEFPUSHBUTTON", "EDITTEXT", "GROUPBOX", "LISTBOX", "LTEXT", +- "PUSHBOX", "PUSHBUTTON", "RADIOBUTTON", "RTEXT", "SCROLLBAR", "STATE3", +- "USERBUTTON", "BEDIT", "HEDIT", "IEDIT", "FONT", "ICON", "ANICURSOR", +- "ANIICON", "DLGINCLUDE", "DLGINIT", "FONTDIR", "HTML", "MANIFEST", +- "PLUGPLAY", "VXD", "TOOLBAR", "BUTTON", "LANGUAGE", "CHARACTERISTICS", +- "VERSIONK", "MENU", "MENUEX", "MENUITEM", "SEPARATOR", "POPUP", +- "CHECKED", "GRAYED", "HELP", "INACTIVE", "MENUBARBREAK", "MENUBREAK", +- "MESSAGETABLE", "RCDATA", "STRINGTABLE", "VERSIONINFO", "FILEVERSION", +- "PRODUCTVERSION", "FILEFLAGSMASK", "FILEFLAGS", "FILEOS", "FILETYPE", +- "FILESUBTYPE", "BLOCKSTRINGFILEINFO", "BLOCKVARFILEINFO", "VALUE", +- "BLOCK", "MOVEABLE", "FIXED", "PURE", "IMPURE", "PRELOAD", "LOADONCALL", +- "DISCARDABLE", "NOT", "QUOTEDUNISTRING", "QUOTEDSTRING", "STRING", +- "NUMBER", "SIZEDUNISTRING", "SIZEDSTRING", "IGNORED_TOKEN", "'|'", "'^'", +- "'&'", "'+'", "'-'", "'*'", "'/'", "'%'", "'~'", "NEG", "','", "'='", +- "'('", "')'", "$accept", "input", "accelerator", "acc_entries", +- "acc_entry", "acc_event", "acc_options", "acc_option", "bitmap", +- "cursor", "dialog", "@1", "@2", "@3", "exstyle", "styles", "controls", +- "control", "@4", "@5", "@6", "@7", "@8", "@9", "@10", "@11", "@12", +- "@13", "@14", "@15", "@16", "@17", "@18", "@19", "@20", "@21", "@22", +- "@23", "@24", "control_params", "cresid", "optresidc", "resid", +- "opt_control_data", "control_styleexpr", "@25", "icon_styleexpr", "@26", +- "control_params_styleexpr", "@27", "font", "icon", "language", "menu", +- "menuitems", "menuitem", "menuitem_flags", "menuitem_flag", "menuex", +- "menuexitems", "menuexitem", "messagetable", "optrcdata_data", "@28", +- "optrcdata_data_int", "rcdata_data", "stringtable", "@29", "string_data", +- "rcdata_id", "user", "toolbar", "toolbar_data", "versioninfo", +- "fixedverinfo", "verblocks", "verstringtables", "vervals", "vertrans", +- "id", "resname", "resref", "suboptions", "memflags_move_discard", +- "memflags_move", "memflag", "file_name", "res_unicode_string_concat", +- "res_unicode_string", "res_unicode_sizedstring", +- "res_unicode_sizedstring_concat", "sizedstring", "sizedunistring", +- "styleexpr", "parennumber", "optcnumexpr", "cnumexpr", "numexpr", +- "sizednumexpr", "cposnumexpr", "posnumexpr", "sizedposnumexpr", 0 +-}; +-#endif +- +-# ifdef YYPRINT +-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to +- token YYLEX-NUM. */ +-static const yytype_uint16 yytoknum[] = +-{ +- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, +- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, +- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, +- 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, +- 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, +- 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, +- 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, +- 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, +- 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, +- 345, 346, 347, 348, 349, 350, 351, 352, 124, 94, +- 38, 43, 45, 42, 47, 37, 126, 353, 44, 61, +- 40, 41 +-}; +-# endif +- +-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +-static const yytype_uint8 yyr1[] = +-{ +- 0, 112, 113, 113, 113, 113, 113, 113, 113, 113, +- 113, 113, 113, 113, 113, 113, 113, 113, 114, 115, +- 115, 116, 116, 117, 117, 118, 118, 118, 119, 119, +- 119, 119, 119, 119, 120, 121, 123, 122, 124, 122, +- 125, 122, 126, 126, 127, 127, 127, 127, 127, 127, +- 127, 127, 127, 127, 127, 127, 127, 127, 128, 128, +- 130, 129, 131, 129, 132, 129, 133, 129, 134, 129, +- 135, 129, 129, 129, 136, 129, 137, 129, 138, 129, +- 139, 129, 140, 129, 129, 129, 129, 129, 141, 129, +- 142, 129, 143, 129, 144, 129, 145, 129, 146, 129, +- 147, 129, 148, 129, 149, 129, 150, 129, 151, 151, +- 151, 152, 153, 153, 154, 154, 155, 155, 157, 156, +- 159, 158, 161, 160, 162, 163, 164, 165, 166, 166, +- 167, 167, 167, 168, 168, 168, 169, 169, 169, 169, +- 169, 169, 170, 171, 171, 172, 172, 172, 172, 172, +- 172, 172, 172, 173, 175, 174, 176, 176, 177, 177, +- 177, 177, 177, 177, 177, 179, 178, 180, 180, 180, +- 180, 181, 181, 181, 181, 181, 181, 181, 181, 181, +- 181, 182, 182, 183, 184, 184, 184, 185, 186, 186, +- 186, 186, 186, 186, 186, 186, 187, 187, 187, 188, +- 188, 189, 189, 190, 190, 191, 191, 192, 192, 193, +- 193, 193, 194, 194, 194, 194, 194, 195, 195, 196, +- 196, 197, 197, 197, 197, 197, 197, 197, 198, 198, +- 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, +- 204, 204, 205, 205, 205, 205, 206, 206, 207, 207, +- 208, 209, 210, 210, 210, 210, 210, 210, 210, 210, +- 210, 210, 210, 210, 211, 212, 213, 213, 213, 213, +- 213, 213, 213, 213, 213, 213, 213 +-}; +- +-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +-static const yytype_uint8 yyr2[] = +-{ +- 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 6, 0, +- 2, 2, 4, 1, 1, 1, 3, 2, 1, 1, +- 1, 1, 1, 1, 4, 4, 0, 13, 0, 13, +- 0, 14, 0, 3, 0, 3, 3, 3, 3, 3, +- 5, 6, 7, 8, 3, 3, 4, 3, 0, 2, +- 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, +- 0, 3, 11, 12, 0, 4, 0, 4, 0, 3, +- 0, 4, 0, 4, 6, 8, 10, 11, 0, 4, +- 0, 3, 0, 4, 0, 4, 0, 4, 0, 4, +- 0, 4, 0, 3, 0, 4, 0, 15, 6, 8, +- 9, 2, 0, 2, 1, 1, 0, 3, 0, 3, +- 0, 3, 0, 3, 4, 4, 3, 6, 0, 2, +- 4, 2, 6, 0, 3, 2, 1, 1, 1, 1, +- 1, 1, 6, 0, 2, 2, 3, 5, 2, 5, +- 6, 7, 9, 4, 0, 2, 0, 1, 1, 1, +- 1, 3, 3, 3, 2, 0, 6, 0, 3, 4, +- 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 6, 4, 8, 0, 3, 2, 6, 0, 6, +- 6, 3, 3, 3, 3, 3, 0, 5, 7, 0, +- 5, 0, 5, 0, 3, 1, 1, 1, 1, 2, +- 1, 2, 0, 2, 3, 4, 3, 0, 2, 0, +- 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, +- 1, 2, 1, 2, 3, 4, 1, 3, 0, 1, +- 2, 1, 1, 3, 2, 2, 3, 3, 3, 3, +- 3, 3, 3, 3, 2, 1, 1, 3, 2, 3, +- 3, 3, 3, 3, 3, 3, 3 +-}; +- +-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state +- STATE-NUM when YYTABLE doesn't specify something else to do. Zero +- means the default is an error. */ +-static const yytype_uint16 yydefact[] = +-{ +- 2, 0, 1, 0, 212, 232, 233, 208, 266, 17, +- 0, 0, 3, 4, 5, 6, 7, 8, 9, 10, +- 11, 12, 13, 15, 14, 16, 0, 206, 207, 205, +- 265, 252, 0, 0, 0, 0, 251, 0, 268, 0, +- 212, 219, 217, 219, 219, 217, 217, 179, 180, 177, +- 178, 172, 174, 175, 176, 212, 212, 212, 219, 173, +- 188, 212, 171, 0, 0, 0, 0, 0, 0, 0, +- 0, 255, 254, 0, 0, 126, 0, 0, 0, 0, +- 0, 0, 0, 0, 165, 0, 0, 0, 221, 222, +- 223, 224, 225, 226, 227, 213, 267, 0, 0, 0, +- 42, 42, 0, 0, 0, 0, 0, 0, 0, 0, +- 276, 275, 274, 272, 273, 269, 270, 271, 253, 250, +- 263, 262, 261, 259, 260, 256, 257, 258, 167, 0, +- 214, 216, 19, 228, 229, 220, 34, 218, 35, 0, +- 0, 0, 124, 125, 0, 128, 143, 153, 196, 0, +- 0, 0, 0, 0, 0, 0, 154, 182, 0, 215, +- 0, 0, 0, 0, 0, 0, 0, 0, 248, 248, +- 191, 192, 193, 194, 195, 0, 156, 170, 166, 0, +- 18, 23, 20, 0, 24, 43, 0, 0, 184, 127, +- 0, 0, 129, 142, 0, 0, 144, 187, 0, 0, +- 248, 249, 248, 181, 240, 238, 155, 157, 158, 159, +- 160, 0, 236, 168, 235, 234, 0, 21, 0, 0, +- 0, 131, 0, 230, 133, 148, 145, 0, 199, 0, +- 248, 248, 164, 239, 241, 169, 237, 264, 0, 36, +- 38, 183, 0, 186, 231, 133, 0, 146, 143, 0, +- 0, 0, 189, 190, 161, 162, 163, 28, 29, 30, +- 31, 32, 33, 22, 25, 44, 44, 40, 185, 130, +- 128, 136, 137, 138, 139, 140, 141, 0, 135, 248, +- 0, 143, 0, 197, 0, 203, 0, 27, 0, 0, +- 44, 0, 134, 147, 149, 0, 143, 248, 201, 0, +- 26, 58, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 58, 0, 132, 150, 0, 0, 0, 198, 0, +- 0, 48, 45, 46, 49, 207, 0, 246, 0, 47, +- 242, 0, 0, 55, 57, 54, 0, 58, 151, 143, +- 200, 0, 204, 37, 112, 112, 112, 112, 112, 70, +- 112, 112, 78, 112, 90, 112, 112, 112, 112, 112, +- 102, 112, 0, 112, 112, 112, 0, 59, 243, 0, +- 0, 0, 56, 39, 0, 0, 0, 0, 0, 115, +- 114, 60, 62, 64, 68, 0, 74, 76, 0, 80, +- 0, 92, 94, 96, 98, 100, 0, 104, 210, 0, +- 0, 66, 82, 88, 0, 247, 0, 244, 50, 41, +- 152, 0, 0, 113, 0, 0, 0, 0, 71, 0, +- 0, 0, 79, 0, 91, 0, 0, 0, 0, 0, +- 103, 0, 211, 0, 209, 0, 0, 0, 0, 245, +- 51, 202, 0, 0, 61, 63, 65, 69, 0, 75, +- 77, 81, 93, 95, 97, 99, 101, 105, 0, 67, +- 83, 89, 0, 52, 111, 118, 0, 0, 0, 116, +- 53, 0, 0, 0, 0, 154, 84, 0, 119, 0, +- 116, 0, 0, 116, 0, 122, 108, 248, 0, 117, +- 120, 85, 248, 248, 0, 116, 249, 0, 0, 116, +- 249, 116, 249, 123, 109, 116, 0, 121, 86, 116, +- 72, 116, 110, 0, 87, 73, 106, 0, 248, 107 +-}; +- +-/* YYDEFGOTO[NTERM-NUM]. */ +-static const yytype_int16 yydefgoto[] = +-{ +- -1, 1, 12, 160, 182, 183, 263, 264, 13, 14, +- 15, 265, 266, 290, 140, 288, 320, 367, 414, 415, +- 416, 435, 417, 385, 420, 421, 388, 423, 436, 437, +- 390, 425, 426, 427, 428, 429, 396, 431, 517, 418, +- 443, 377, 378, 476, 466, 471, 492, 498, 487, 494, +- 16, 17, 18, 19, 165, 192, 246, 278, 20, 166, +- 196, 21, 175, 176, 206, 207, 22, 128, 158, 61, +- 23, 24, 220, 25, 108, 167, 250, 317, 299, 26, +- 27, 399, 37, 99, 98, 95, 136, 379, 223, 212, +- 213, 214, 215, 329, 330, 200, 201, 419, 36, 217, +- 380, 30 +-}; +- +-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing +- STATE-NUM. */ +-#define YYPACT_NINF -446 +-static const yytype_int16 yypact[] = +-{ +- -446, 75, -446, 317, -446, -446, -446, -446, -446, -446, +- 317, 317, -446, -446, -446, -446, -446, -446, -446, -446, +- -446, -446, -446, -446, -446, -446, 463, -446, -446, -446, +- 589, -446, 317, 317, 317, -93, 626, 209, -446, 437, +- -446, -446, -446, -446, -446, -446, -446, -446, -446, -446, +- -446, -446, -446, -446, -446, -446, -446, -446, -446, -446, +- -446, -446, -446, 317, 317, 317, 317, 317, 317, 317, +- 317, -446, -446, 526, 317, -446, 317, 317, 317, 317, +- 317, 317, 317, 317, -446, 317, 317, 317, -446, -446, +- -446, -446, -446, -446, -446, -446, -446, 267, 675, 675, +- 275, 275, 675, 675, 491, 404, 441, 675, 168, 256, +- 719, 379, 397, 213, 213, -446, -446, -446, -446, -446, +- 719, 379, 397, 213, 213, -446, -446, -446, -446, -93, +- -446, -446, -446, -446, -446, -446, -446, -446, -446, -65, +- 144, 144, -446, -446, -93, -446, -446, -446, -446, 317, +- 317, 317, 317, 317, 317, 317, -446, -446, 18, -446, +- 21, 317, -93, -93, 31, 140, 155, 126, -93, -93, +- -446, -446, -446, -446, -446, 47, 177, -446, -446, 212, +- -446, -446, -446, -34, -446, -446, -93, -93, -446, -446, +- -36, -5, -446, -446, -25, -5, -446, -446, 119, 131, +- -93, -446, -93, -446, -446, -446, -446, 54, 68, 84, +- 626, 2, -446, 2, 68, 84, 144, 87, -93, -93, +- 25, -446, 95, -446, -5, -446, 95, 62, -446, 102, +- -93, -93, 177, -446, -446, 2, -446, -446, 552, -446, +- -93, -446, 306, -446, -446, -446, 76, -93, -446, 8, +- 6, -5, -446, -446, 68, 84, 626, -446, -446, -446, +- -446, -446, -446, 167, -446, -446, -446, -446, -446, 271, +- -446, -446, -446, -446, -446, -446, -446, 763, -446, -93, +- 161, -446, 11, -446, 197, -5, 552, -446, 374, 548, +- -446, 178, -446, -446, -446, 190, -446, -93, -446, 3, +- -446, -446, 317, -5, 306, -47, 317, 317, 317, 317, +- 306, -446, 565, -446, -446, 194, 201, -1, -446, -93, +- 639, -446, -5, -446, -5, 143, -33, -446, 317, 110, +- -446, 105, -93, -446, -446, -446, 676, -446, -446, -446, +- -446, -5, -446, -446, 311, 311, 311, 311, 311, -446, +- 311, 311, -446, 311, -446, 311, 311, 311, 311, 311, +- -446, 311, 306, 311, 311, 311, 306, -446, -446, 104, +- -42, -5, -446, -446, 713, 207, 99, 317, 113, -5, +- -446, -446, -446, -446, -446, 317, -446, -446, 317, -446, +- 317, -446, -446, -446, -446, -446, 317, -446, 115, 317, +- 120, -446, -446, -446, 317, -446, -33, -446, 95, -446, +- -446, -5, 152, -446, 317, 317, 317, 317, -446, -93, +- 317, 317, -446, 317, -446, 317, 317, 317, 317, 317, +- -446, 317, -446, 153, -446, 317, 317, 317, -93, -446, +- -93, -5, 311, 159, -446, -446, -446, -446, -93, -446, +- -446, -446, -446, -446, -446, -446, -446, -446, 317, -446, +- -446, -446, -93, -93, -446, -446, -93, -93, 173, 15, +- -446, -47, -93, -93, 317, -446, -446, -93, 110, -93, +- 27, 180, 244, 29, -93, -446, -446, -93, 317, -446, +- -446, -446, -93, -93, -47, 273, -93, 192, -47, 273, +- -93, 273, -93, 110, -446, 273, 317, 110, -446, 273, +- -446, 273, -446, 193, -446, -446, -446, -47, -75, -446 +-}; +- +-/* YYPGOTO[NTERM-NUM]. */ +-static const yytype_int16 yypgoto[] = +-{ +- -446, -446, -446, -446, -446, -446, -446, -236, -446, -446, +- -446, -446, -446, -446, 184, -262, -273, -446, -446, -446, +- -446, -446, -446, -446, -446, -446, -446, -446, -446, -446, +- -446, -446, -446, -446, -446, -446, -446, -446, -446, 219, +- -446, 442, -123, 274, -446, -446, -446, -446, -446, -446, +- -446, -446, -446, -446, 77, -446, 101, 88, -446, -239, +- -446, -446, -109, -446, -446, -446, -446, -446, -446, -446, +- -446, -446, -446, -446, -446, -446, -446, -446, -446, -24, +- -245, 4, 169, 211, 270, 710, 175, -178, 5, -173, +- 157, -156, -122, -445, -325, -161, -30, -3, 26, -446, +- 20, -446 +-}; +- +-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If +- positive, shift that token. If negative, reduce the rule which +- number is the opposite. If zero, do what YYDEFACT says. +- If YYTABLE_NINF, syntax error. */ +-#define YYTABLE_NINF -231 +-static const yytype_int16 yytable[] = +-{ +- 35, 368, 62, 340, 289, 75, 28, 318, 202, 280, +- 283, 281, 222, 224, 296, 74, 226, 227, 475, 177, +- 208, 29, 178, 370, 221, 180, 478, 287, 312, 241, +- 475, 28, 475, 74, 188, 225, 38, 39, 336, 230, +- 236, 231, 295, 326, 161, 407, 29, 327, 406, 503, +- 300, 203, 327, 507, 209, 5, 6, 315, 71, 72, +- 73, 327, 236, 328, 374, 248, 5, 6, 328, 252, +- 253, 119, 518, 285, 216, 2, 254, 328, 242, 270, +- 341, 439, 129, 130, 131, 243, 5, 6, 284, 110, +- 111, 112, 113, 114, 115, 116, 117, 204, 205, 159, +- 375, 144, 120, 121, 122, 123, 124, 125, 126, 127, +- 255, 74, 31, 181, 164, 8, 74, 398, 293, 74, +- 32, 398, 228, 74, 33, 322, 324, 10, 34, 3, +- 197, 11, 186, 187, 229, 485, 316, 490, 271, 272, +- 273, 274, 275, 276, 189, 4, 168, 169, 170, 171, +- 172, 173, 174, 5, 6, 179, 218, 219, 185, 193, +- 162, 163, 232, 376, 233, 294, 5, 6, 7, 8, +- 74, 148, 9, 257, 258, 259, 260, 261, 262, 234, +- 184, 10, 313, 251, 277, 11, 5, 6, 239, 240, +- 5, 6, 245, 408, 314, 238, 247, 249, 338, 190, +- 298, 191, 210, 74, 339, 198, 199, 411, 370, 97, +- 267, 410, 84, 371, 194, 405, 195, 279, 268, 282, +- 194, 413, 195, 432, 104, 105, 106, 244, 434, 244, +- 109, 244, 244, 441, -230, -230, 237, 190, 8, 191, +- 149, 150, 151, 152, 153, 154, 155, 28, 489, 194, +- 10, 195, 297, 194, 11, 195, 102, 103, 256, 156, +- 442, 458, 29, 85, 86, 87, 194, 465, 195, 319, +- 132, 31, 204, 205, 138, 286, 475, 142, 143, 32, +- 323, 474, 147, 33, 157, 141, 335, 34, 488, 342, +- 244, 139, 88, 89, 90, 91, 92, 93, 94, 321, +- 506, 516, 372, 331, 332, 333, 334, 204, 205, 325, +- 85, 86, 87, 100, 101, 28, 81, 82, 83, 464, +- 211, 85, 86, 87, 29, 369, 495, 244, 107, 244, +- 29, 499, 501, 271, 272, 273, 274, 275, 276, 88, +- 89, 90, 91, 92, 93, 94, 269, 291, 133, 134, +- 88, 89, 90, 91, 92, 93, 94, 519, 88, 89, +- 90, 91, 92, 93, 94, 292, 482, 28, 235, 0, +- 404, 28, 0, 0, 412, 0, 0, 301, 440, 277, +- 0, 244, 400, 0, 244, 0, 400, 0, 0, 448, +- 302, 303, 304, 305, 0, 0, 433, 5, 6, 7, +- 8, 438, 5, 6, 0, 8, 0, 145, 462, 0, +- 463, 31, 10, 244, 0, 306, 11, 10, 467, 32, +- 0, 11, 0, 33, 0, 0, 0, 34, 307, 308, +- 309, 310, 469, 470, 0, 0, 472, 473, 0, 477, +- 0, 0, 479, 480, 146, 0, 244, 483, 0, 484, +- 0, 0, 0, 0, 493, 468, 0, 496, 85, 86, +- 87, 0, 500, 502, 0, 0, 505, 0, 40, 0, +- 509, 481, 511, 0, 0, 41, 42, 43, 44, 78, +- 79, 80, 81, 82, 83, 497, 0, 88, 89, 90, +- 91, 92, 93, 94, 0, 85, 86, 87, 79, 80, +- 81, 82, 83, 513, 45, 46, 47, 48, 49, 50, +- 0, 51, 52, 53, 54, 55, 0, 0, 0, 0, +- 56, 57, 0, 0, 88, 89, 90, 91, 92, 93, +- 94, 58, 59, 0, 60, 76, 77, 78, 79, 80, +- 81, 82, 83, 0, 0, 85, 86, 87, 96, 0, +- 0, 311, 0, 0, 5, 6, 7, 8, 257, 258, +- 259, 260, 261, 262, 302, 303, 304, 305, 337, 10, +- 0, 0, 0, 11, 88, 89, 90, 91, 92, 93, +- 94, 302, 303, 304, 305, 31, 0, 0, 0, 306, +- 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, +- 0, 34, 307, 308, 309, 310, 306, 422, 0, 424, +- 0, 0, 0, 0, 0, 430, 0, 0, 0, 307, +- 308, 309, 310, 0, 76, 77, 78, 79, 80, 81, +- 82, 83, 0, 444, 445, 446, 447, 118, 0, 449, +- 450, 0, 451, 343, 452, 453, 454, 455, 456, 344, +- 457, 0, 0, 0, 459, 460, 461, 0, 0, 345, +- 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, +- 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, +- 373, 366, 0, 0, 0, 0, 344, 63, 64, 65, +- 66, 67, 68, 69, 70, 0, 345, 346, 347, 348, +- 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, +- 359, 360, 361, 362, 363, 364, 365, 409, 366, 0, +- 0, 0, 0, 344, 76, 77, 78, 79, 80, 81, +- 82, 83, 0, 345, 346, 347, 348, 349, 350, 351, +- 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, +- 362, 363, 364, 365, 486, 366, 0, 491, 88, 89, +- 90, 91, 92, 93, 94, 0, 0, 133, 134, 504, +- 0, 0, 0, 508, 0, 510, 0, 0, 0, 512, +- 0, 0, 0, 514, 0, 515, 0, 381, 382, 383, +- 384, 0, 386, 387, 0, 389, 0, 391, 392, 393, +- 394, 395, 0, 397, 0, 401, 402, 403, 135, 137, +- 135, 135, 137, 137, 0, 0, 0, 135, 77, 78, +- 79, 80, 81, 82, 83, 271, 272, 273, 274, 275, +- 276 +-}; +- +-static const yytype_int16 yycheck[] = +-{ +- 3, 326, 26, 4, 266, 35, 1, 4, 169, 248, +- 4, 3, 190, 191, 3, 108, 194, 195, 3, 1, +- 176, 1, 4, 98, 60, 4, 471, 263, 290, 4, +- 3, 26, 3, 108, 3, 60, 10, 11, 311, 200, +- 213, 202, 281, 90, 109, 370, 26, 94, 90, 494, +- 286, 4, 94, 498, 176, 91, 92, 296, 32, 33, +- 34, 94, 235, 110, 337, 3, 91, 92, 110, 230, +- 231, 74, 517, 251, 108, 0, 232, 110, 53, 3, +- 81, 406, 85, 86, 87, 60, 91, 92, 82, 63, +- 64, 65, 66, 67, 68, 69, 70, 95, 96, 129, +- 339, 104, 76, 77, 78, 79, 80, 81, 82, 83, +- 232, 108, 94, 92, 144, 94, 108, 362, 279, 108, +- 102, 366, 3, 108, 106, 303, 304, 106, 110, 54, +- 4, 110, 162, 163, 3, 108, 297, 108, 62, 63, +- 64, 65, 66, 67, 4, 70, 149, 150, 151, 152, +- 153, 154, 155, 91, 92, 158, 186, 187, 161, 4, +- 140, 141, 108, 341, 96, 4, 91, 92, 93, 94, +- 108, 3, 97, 6, 7, 8, 9, 10, 11, 95, +- 160, 106, 4, 81, 108, 110, 91, 92, 218, 219, +- 91, 92, 222, 371, 4, 108, 226, 227, 4, 59, +- 3, 61, 176, 108, 3, 79, 80, 108, 98, 40, +- 240, 4, 3, 108, 59, 111, 61, 247, 242, 249, +- 59, 108, 61, 108, 55, 56, 57, 222, 108, 224, +- 61, 226, 227, 411, 91, 92, 216, 59, 94, 61, +- 72, 73, 74, 75, 76, 77, 78, 242, 4, 59, +- 106, 61, 282, 59, 110, 61, 45, 46, 232, 3, +- 108, 108, 242, 54, 55, 56, 59, 108, 61, 299, +- 3, 94, 95, 96, 99, 108, 3, 102, 103, 102, +- 304, 108, 107, 106, 109, 101, 310, 110, 108, 319, +- 285, 16, 83, 84, 85, 86, 87, 88, 89, 302, +- 108, 108, 332, 306, 307, 308, 309, 95, 96, 304, +- 54, 55, 56, 43, 44, 310, 103, 104, 105, 442, +- 108, 54, 55, 56, 304, 328, 487, 322, 58, 324, +- 310, 492, 493, 62, 63, 64, 65, 66, 67, 83, +- 84, 85, 86, 87, 88, 89, 245, 270, 92, 93, +- 83, 84, 85, 86, 87, 88, 89, 518, 83, 84, +- 85, 86, 87, 88, 89, 277, 475, 362, 211, -1, +- 366, 366, -1, -1, 377, -1, -1, 3, 408, 108, +- -1, 376, 362, -1, 379, -1, 366, -1, -1, 419, +- 16, 17, 18, 19, -1, -1, 399, 91, 92, 93, +- 94, 404, 91, 92, -1, 94, -1, 3, 438, -1, +- 440, 94, 106, 408, -1, 41, 110, 106, 448, 102, +- -1, 110, -1, 106, -1, -1, -1, 110, 54, 55, +- 56, 57, 462, 463, -1, -1, 466, 467, -1, 469, +- -1, -1, 472, 473, 3, -1, 441, 477, -1, 479, +- -1, -1, -1, -1, 484, 458, -1, 487, 54, 55, +- 56, -1, 492, 493, -1, -1, 496, -1, 5, -1, +- 500, 474, 502, -1, -1, 12, 13, 14, 15, 100, +- 101, 102, 103, 104, 105, 488, -1, 83, 84, 85, +- 86, 87, 88, 89, -1, 54, 55, 56, 101, 102, +- 103, 104, 105, 506, 41, 42, 43, 44, 45, 46, +- -1, 48, 49, 50, 51, 52, -1, -1, -1, -1, +- 57, 58, -1, -1, 83, 84, 85, 86, 87, 88, +- 89, 68, 69, -1, 71, 98, 99, 100, 101, 102, +- 103, 104, 105, -1, -1, 54, 55, 56, 111, -1, +- -1, 3, -1, -1, 91, 92, 93, 94, 6, 7, +- 8, 9, 10, 11, 16, 17, 18, 19, 3, 106, +- -1, -1, -1, 110, 83, 84, 85, 86, 87, 88, +- 89, 16, 17, 18, 19, 94, -1, -1, -1, 41, +- -1, -1, -1, 102, -1, -1, -1, 106, -1, -1, +- -1, 110, 54, 55, 56, 57, 41, 388, -1, 390, +- -1, -1, -1, -1, -1, 396, -1, -1, -1, 54, +- 55, 56, 57, -1, 98, 99, 100, 101, 102, 103, +- 104, 105, -1, 414, 415, 416, 417, 111, -1, 420, +- 421, -1, 423, 4, 425, 426, 427, 428, 429, 10, +- 431, -1, -1, -1, 435, 436, 437, -1, -1, 20, +- 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, +- 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, +- 4, 42, -1, -1, -1, -1, 10, 98, 99, 100, +- 101, 102, 103, 104, 105, -1, 20, 21, 22, 23, +- 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, +- 34, 35, 36, 37, 38, 39, 40, 4, 42, -1, +- -1, -1, -1, 10, 98, 99, 100, 101, 102, 103, +- 104, 105, -1, 20, 21, 22, 23, 24, 25, 26, +- 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, +- 37, 38, 39, 40, 480, 42, -1, 483, 83, 84, +- 85, 86, 87, 88, 89, -1, -1, 92, 93, 495, +- -1, -1, -1, 499, -1, 501, -1, -1, -1, 505, +- -1, -1, -1, 509, -1, 511, -1, 345, 346, 347, +- 348, -1, 350, 351, -1, 353, -1, 355, 356, 357, +- 358, 359, -1, 361, -1, 363, 364, 365, 98, 99, +- 100, 101, 102, 103, -1, -1, -1, 107, 99, 100, +- 101, 102, 103, 104, 105, 62, 63, 64, 65, 66, +- 67 +-}; +- +-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing +- symbol of state STATE-NUM. */ +-static const yytype_uint8 yystos[] = +-{ +- 0, 113, 0, 54, 70, 91, 92, 93, 94, 97, +- 106, 110, 114, 120, 121, 122, 162, 163, 164, 165, +- 170, 173, 178, 182, 183, 185, 191, 192, 200, 212, +- 213, 94, 102, 106, 110, 209, 210, 194, 210, 210, +- 5, 12, 13, 14, 15, 41, 42, 43, 44, 45, +- 46, 48, 49, 50, 51, 52, 57, 58, 68, 69, +- 71, 181, 191, 98, 99, 100, 101, 102, 103, 104, +- 105, 210, 210, 210, 108, 208, 98, 99, 100, 101, +- 102, 103, 104, 105, 3, 54, 55, 56, 83, 84, +- 85, 86, 87, 88, 89, 197, 111, 194, 196, 195, +- 196, 196, 195, 195, 194, 194, 194, 196, 186, 194, +- 210, 210, 210, 210, 210, 210, 210, 210, 111, 209, +- 210, 210, 210, 210, 210, 210, 210, 210, 179, 209, +- 209, 209, 3, 92, 93, 197, 198, 197, 198, 16, +- 126, 126, 198, 198, 209, 3, 3, 198, 3, 72, +- 73, 74, 75, 76, 77, 78, 3, 198, 180, 208, +- 115, 109, 212, 212, 208, 166, 171, 187, 209, 209, +- 209, 209, 209, 209, 209, 174, 175, 1, 4, 209, +- 4, 92, 116, 117, 212, 209, 208, 208, 3, 4, +- 59, 61, 167, 4, 59, 61, 172, 4, 79, 80, +- 207, 208, 207, 4, 95, 96, 176, 177, 203, 204, +- 210, 108, 201, 202, 203, 204, 108, 211, 208, 208, +- 184, 60, 199, 200, 199, 60, 199, 199, 3, 3, +- 207, 207, 108, 96, 95, 202, 201, 212, 108, 208, +- 208, 4, 53, 60, 200, 208, 168, 208, 3, 208, +- 188, 81, 207, 207, 203, 204, 210, 6, 7, 8, +- 9, 10, 11, 118, 119, 123, 124, 208, 191, 168, +- 3, 62, 63, 64, 65, 66, 67, 108, 169, 208, +- 171, 3, 208, 4, 82, 199, 108, 119, 127, 127, +- 125, 166, 169, 207, 4, 171, 3, 208, 3, 190, +- 119, 3, 16, 17, 18, 19, 41, 54, 55, 56, +- 57, 3, 127, 4, 4, 171, 207, 189, 4, 208, +- 128, 209, 199, 191, 199, 200, 90, 94, 110, 205, +- 206, 209, 209, 209, 209, 191, 128, 3, 4, 3, +- 4, 81, 208, 4, 10, 20, 21, 22, 23, 24, +- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, +- 35, 36, 37, 38, 39, 40, 42, 129, 206, 209, +- 98, 108, 208, 4, 128, 171, 199, 153, 154, 199, +- 212, 153, 153, 153, 153, 135, 153, 153, 138, 153, +- 142, 153, 153, 153, 153, 153, 148, 153, 192, 193, +- 212, 153, 153, 153, 193, 111, 90, 206, 199, 4, +- 4, 108, 209, 108, 130, 131, 132, 134, 151, 209, +- 136, 137, 151, 139, 151, 143, 144, 145, 146, 147, +- 151, 149, 108, 209, 108, 133, 140, 141, 209, 206, +- 208, 199, 108, 152, 151, 151, 151, 151, 208, 151, +- 151, 151, 151, 151, 151, 151, 151, 151, 108, 151, +- 151, 151, 208, 208, 154, 108, 156, 208, 209, 208, +- 208, 157, 208, 208, 108, 3, 155, 208, 205, 208, +- 208, 209, 174, 208, 208, 108, 155, 160, 108, 4, +- 108, 155, 158, 208, 161, 207, 208, 209, 159, 207, +- 208, 207, 208, 205, 155, 208, 108, 205, 155, 208, +- 155, 208, 155, 209, 155, 155, 108, 150, 205, 207 +-}; +- +-#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 yyerrorlab +- +- +-/* 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); \ +- yytoken = YYTRANSLATE (yychar); \ +- YYPOPSTACK (1); \ +- goto yybackup; \ +- } \ +- else \ +- { \ +- yyerror (YY_("syntax error: cannot back up")); \ +- YYERROR; \ +- } \ +-while (YYID (0)) +- +- +-#define YYTERROR 1 +-#define YYERRCODE 256 +- +- +-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. +- If N is 0, then set CURRENT to the empty location which ends +- the previous symbol: RHS[0] (always defined). */ +- +-#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +-#ifndef YYLLOC_DEFAULT +-# define YYLLOC_DEFAULT(Current, Rhs, N) \ +- do \ +- if (YYID (N)) \ +- { \ +- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ +- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ +- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ +- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ +- } \ +- else \ +- { \ +- (Current).first_line = (Current).last_line = \ +- YYRHSLOC (Rhs, 0).last_line; \ +- (Current).first_column = (Current).last_column = \ +- YYRHSLOC (Rhs, 0).last_column; \ +- } \ +- while (YYID (0)) +-#endif +- +- +-/* YY_LOCATION_PRINT -- Print the location on the stream. +- This macro was not mandated originally: define only if we know +- we won't break user code: when these are the locations we know. */ +- +-#ifndef YY_LOCATION_PRINT +-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL +-# define YY_LOCATION_PRINT(File, Loc) \ +- fprintf (File, "%d.%d-%d.%d", \ +- (Loc).first_line, (Loc).first_column, \ +- (Loc).last_line, (Loc).last_column) +-# else +-# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +-# endif +-#endif +- +- +-/* YYLEX -- calling `yylex' with the right arguments. */ +- +-#ifdef YYLEX_PARAM +-# define YYLEX yylex (YYLEX_PARAM) +-#else +-# define YYLEX yylex () +-#endif +- +-/* Enable debugging if requested. */ +-#if YYDEBUG +- +-# ifndef YYFPRINTF +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYFPRINTF fprintf +-# endif +- +-# define YYDPRINTF(Args) \ +-do { \ +- if (yydebug) \ +- YYFPRINTF Args; \ +-} while (YYID (0)) +- +-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +-do { \ +- if (yydebug) \ +- { \ +- YYFPRINTF (stderr, "%s ", Title); \ +- yy_symbol_print (stderr, \ +- Type, Value); \ +- YYFPRINTF (stderr, "\n"); \ +- } \ +-} while (YYID (0)) +- +- +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-/*ARGSUSED*/ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +-#else +-static void +-yy_symbol_value_print (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE const * const yyvaluep; +-#endif +-{ +- if (!yyvaluep) +- return; +-# ifdef YYPRINT +- if (yytype < YYNTOKENS) +- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +-# else +- YYUSE (yyoutput); +-# endif +- switch (yytype) +- { +- default: +- break; +- } +-} +- +- +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +-#else +-static void +-yy_symbol_print (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE const * const yyvaluep; +-#endif +-{ +- if (yytype < YYNTOKENS) +- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +- else +- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); +- +- yy_symbol_value_print (yyoutput, yytype, yyvaluep); +- YYFPRINTF (yyoutput, ")"); +-} +- +-/*------------------------------------------------------------------. +-| yy_stack_print -- Print the state stack from its BOTTOM up to its | +-| TOP (included). | +-`------------------------------------------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +-#else +-static void +-yy_stack_print (bottom, top) +- yytype_int16 *bottom; +- yytype_int16 *top; +-#endif +-{ +- YYFPRINTF (stderr, "Stack now"); +- for (; bottom <= top; ++bottom) +- YYFPRINTF (stderr, " %d", *bottom); +- YYFPRINTF (stderr, "\n"); +-} +- +-# define YY_STACK_PRINT(Bottom, Top) \ +-do { \ +- if (yydebug) \ +- yy_stack_print ((Bottom), (Top)); \ +-} while (YYID (0)) +- +- +-/*------------------------------------------------. +-| Report that the YYRULE is going to be reduced. | +-`------------------------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +-#else +-static void +-yy_reduce_print (yyvsp, yyrule) +- YYSTYPE *yyvsp; +- int yyrule; +-#endif +-{ +- int yynrhs = yyr2[yyrule]; +- int yyi; +- unsigned long int yylno = yyrline[yyrule]; +- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", +- yyrule - 1, yylno); +- /* The symbols being reduced. */ +- for (yyi = 0; yyi < yynrhs; yyi++) +- { +- fprintf (stderr, " $%d = ", yyi + 1); +- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], +- &(yyvsp[(yyi + 1) - (yynrhs)]) +- ); +- fprintf (stderr, "\n"); +- } +-} +- +-# define YY_REDUCE_PRINT(Rule) \ +-do { \ +- if (yydebug) \ +- yy_reduce_print (yyvsp, Rule); \ +-} while (YYID (0)) +- +-/* Nonzero means print parse trace. It is left uninitialized so that +- multiple parsers can coexist. */ +-int yydebug; +-#else /* !YYDEBUG */ +-# define YYDPRINTF(Args) +-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +-# define YY_STACK_PRINT(Bottom, Top) +-# define YY_REDUCE_PRINT(Rule) +-#endif /* !YYDEBUG */ +- +- +-/* YYINITDEPTH -- initial size of the parser's stacks. */ +-#ifndef YYINITDEPTH +-# define YYINITDEPTH 200 +-#endif +- +-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only +- if the built-in stack extension method is used). +- +- Do not make this value too large; the results are undefined if +- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) +- evaluated with infinite-precision integer arithmetic. */ +- +-#ifndef YYMAXDEPTH +-# define YYMAXDEPTH 10000 +-#endif +- +- +- +-#if YYERROR_VERBOSE +- +-# ifndef yystrlen +-# if defined __GLIBC__ && defined _STRING_H +-# define yystrlen strlen +-# else +-/* Return the length of YYSTR. */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static YYSIZE_T +-yystrlen (const char *yystr) +-#else +-static YYSIZE_T +-yystrlen (yystr) +- const char *yystr; +-#endif +-{ +- YYSIZE_T yylen; +- for (yylen = 0; yystr[yylen]; yylen++) +- continue; +- return yylen; +-} +-# endif +-# endif +- +-# ifndef yystpcpy +-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +-# define yystpcpy stpcpy +-# else +-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in +- YYDEST. */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static char * +-yystpcpy (char *yydest, const char *yysrc) +-#else +-static char * +-yystpcpy (yydest, yysrc) +- char *yydest; +- const char *yysrc; +-#endif +-{ +- char *yyd = yydest; +- const char *yys = yysrc; +- +- while ((*yyd++ = *yys++) != '\0') +- continue; +- +- return yyd - 1; +-} +-# endif +-# endif +- +-# ifndef yytnamerr +-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary +- quotes and backslashes, so that it's suitable for yyerror. The +- heuristic is that double-quoting is unnecessary unless the string +- contains an apostrophe, a comma, or backslash (other than +- backslash-backslash). YYSTR is taken from yytname. If YYRES is +- null, do not copy; instead, return the length of what the result +- would have been. */ +-static YYSIZE_T +-yytnamerr (char *yyres, const char *yystr) +-{ +- if (*yystr == '"') +- { +- YYSIZE_T yyn = 0; +- char const *yyp = yystr; +- +- for (;;) +- switch (*++yyp) +- { +- case '\'': +- case ',': +- goto do_not_strip_quotes; +- +- case '\\': +- if (*++yyp != '\\') +- goto do_not_strip_quotes; +- /* Fall through. */ +- default: +- if (yyres) +- yyres[yyn] = *yyp; +- yyn++; +- break; +- +- case '"': +- if (yyres) +- yyres[yyn] = '\0'; +- return yyn; +- } +- do_not_strip_quotes: ; +- } +- +- if (! yyres) +- return yystrlen (yystr); +- +- return yystpcpy (yyres, yystr) - yyres; +-} +-# endif +- +-/* Copy into YYRESULT an error message about the unexpected token +- YYCHAR while in state YYSTATE. Return the number of bytes copied, +- including the terminating null byte. If YYRESULT is null, do not +- copy anything; just return the number of bytes that would be +- copied. As a special case, return 0 if an ordinary "syntax error" +- message will do. Return YYSIZE_MAXIMUM if overflow occurs during +- size calculation. */ +-static YYSIZE_T +-yysyntax_error (char *yyresult, int yystate, int yychar) +-{ +- int yyn = yypact[yystate]; +- +- if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) +- return 0; +- else +- { +- int yytype = YYTRANSLATE (yychar); +- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); +- YYSIZE_T yysize = yysize0; +- YYSIZE_T yysize1; +- int yysize_overflow = 0; +- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; +- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; +- int yyx; +- +-# if 0 +- /* This is so xgettext sees the translatable formats that are +- constructed on the fly. */ +- YY_("syntax error, unexpected %s"); +- YY_("syntax error, unexpected %s, expecting %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s or %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +-# endif +- char *yyfmt; +- char const *yyf; +- static char const yyunexpected[] = "syntax error, unexpected %s"; +- static char const yyexpecting[] = ", expecting %s"; +- static char const yyor[] = " or %s"; +- char yyformat[sizeof yyunexpected +- + sizeof yyexpecting - 1 +- + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) +- * (sizeof yyor - 1))]; +- char const *yyprefix = yyexpecting; +- +- /* Start YYX at -YYN if negative to avoid negative indexes in +- YYCHECK. */ +- int yyxbegin = yyn < 0 ? -yyn : 0; +- +- /* Stay within bounds of both yycheck and yytname. */ +- int yychecklim = YYLAST - yyn + 1; +- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; +- int yycount = 1; +- +- yyarg[0] = yytname[yytype]; +- yyfmt = yystpcpy (yyformat, yyunexpected); +- +- for (yyx = yyxbegin; yyx < yyxend; ++yyx) +- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) +- { +- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) +- { +- yycount = 1; +- yysize = yysize0; +- yyformat[sizeof yyunexpected - 1] = '\0'; +- break; +- } +- yyarg[yycount++] = yytname[yyx]; +- yysize1 = yysize + yytnamerr (0, yytname[yyx]); +- yysize_overflow |= (yysize1 < yysize); +- yysize = yysize1; +- yyfmt = yystpcpy (yyfmt, yyprefix); +- yyprefix = yyor; +- } +- +- yyf = YY_(yyformat); +- yysize1 = yysize + yystrlen (yyf); +- yysize_overflow |= (yysize1 < yysize); +- yysize = yysize1; +- +- if (yysize_overflow) +- return YYSIZE_MAXIMUM; +- +- if (yyresult) +- { +- /* Avoid sprintf, as that infringes on the user's name space. +- Don't have undefined behavior even if the translation +- produced a string with the wrong number of "%s"s. */ +- char *yyp = yyresult; +- int yyi = 0; +- while ((*yyp = *yyf) != '\0') +- { +- if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) +- { +- yyp += yytnamerr (yyp, yyarg[yyi++]); +- yyf += 2; +- } +- else +- { +- yyp++; +- yyf++; +- } +- } +- } +- return yysize; +- } +-} +-#endif /* YYERROR_VERBOSE */ +- +- +-/*-----------------------------------------------. +-| Release the memory associated to this symbol. | +-`-----------------------------------------------*/ +- +-/*ARGSUSED*/ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +-#else +-static void +-yydestruct (yymsg, yytype, yyvaluep) +- const char *yymsg; +- int yytype; +- YYSTYPE *yyvaluep; +-#endif +-{ +- YYUSE (yyvaluep); +- +- if (!yymsg) +- yymsg = "Deleting"; +- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); +- +- switch (yytype) +- { +- +- default: +- break; +- } +-} +- +- +-/* Prevent warnings from -Wmissing-prototypes. */ +- +-#ifdef YYPARSE_PARAM +-#if defined __STDC__ || defined __cplusplus +-int yyparse (void *YYPARSE_PARAM); +-#else +-int yyparse (); +-#endif +-#else /* ! YYPARSE_PARAM */ +-#if defined __STDC__ || defined __cplusplus +-int yyparse (void); +-#else +-int yyparse (); +-#endif +-#endif /* ! YYPARSE_PARAM */ +- +- +- +-/* The look-ahead symbol. */ +-int yychar; +- +-/* The semantic value of the look-ahead symbol. */ +-YYSTYPE yylval; +- +-/* Number of syntax errors so far. */ +-int yynerrs; +- +- +- +-/*----------. +-| yyparse. | +-`----------*/ +- +-#ifdef YYPARSE_PARAM +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-int +-yyparse (void *YYPARSE_PARAM) +-#else +-int +-yyparse (YYPARSE_PARAM) +- void *YYPARSE_PARAM; +-#endif +-#else /* ! YYPARSE_PARAM */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-int +-yyparse (void) +-#else +-int +-yyparse () +- +-#endif +-#endif +-{ +- +- int yystate; +- int yyn; +- int yyresult; +- /* Number of tokens to shift before error messages enabled. */ +- int yyerrstatus; +- /* Look-ahead token as an internal (translated) token number. */ +- int yytoken = 0; +-#if YYERROR_VERBOSE +- /* Buffer for error messages, and its allocated size. */ +- char yymsgbuf[128]; +- char *yymsg = yymsgbuf; +- YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +-#endif +- +- /* Three stacks and their tools: +- `yyss': related to states, +- `yyvs': related to semantic values, +- `yyls': related to locations. +- +- Refer to the stacks thru separate pointers, to allow yyoverflow +- to reallocate them elsewhere. */ +- +- /* The state stack. */ +- yytype_int16 yyssa[YYINITDEPTH]; +- yytype_int16 *yyss = yyssa; +- yytype_int16 *yyssp; +- +- /* The semantic value stack. */ +- YYSTYPE yyvsa[YYINITDEPTH]; +- YYSTYPE *yyvs = yyvsa; +- YYSTYPE *yyvsp; +- +- +- +-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) +- +- YYSIZE_T yystacksize = YYINITDEPTH; +- +- /* The variables used to return semantic value and location from the +- action routines. */ +- YYSTYPE yyval; +- +- +- /* The number of symbols on the RHS of the reduced rule. +- Keep to zero when no symbol should be popped. */ +- int yylen = 0; +- +- YYDPRINTF ((stderr, "Starting parse\n")); +- +- 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; +- yyvsp = yyvs; +- +- goto yysetstate; +- +-/*------------------------------------------------------------. +-| yynewstate -- Push a new state, which is found in yystate. | +-`------------------------------------------------------------*/ +- yynewstate: +- /* In all cases, when you get here, the value and location stacks +- have just been pushed. So pushing a state here evens the stacks. */ +- yyssp++; +- +- yysetstate: +- *yyssp = yystate; +- +- if (yyss + yystacksize - 1 <= yyssp) +- { +- /* Get the current used size of the three stacks, in elements. */ +- YYSIZE_T yysize = yyssp - yyss + 1; +- +-#ifdef yyoverflow +- { +- /* Give user a chance to reallocate the stack. Use copies of +- these so that the &'s don't force the real ones into +- memory. */ +- YYSTYPE *yyvs1 = yyvs; +- yytype_int16 *yyss1 = yyss; +- +- +- /* Each stack pointer address is followed by the size of the +- data in use in that stack, in bytes. This used to be a +- conditional around just the two extra args, but that might +- be undefined if yyoverflow is a macro. */ +- yyoverflow (YY_("memory exhausted"), +- &yyss1, yysize * sizeof (*yyssp), +- &yyvs1, yysize * sizeof (*yyvsp), +- +- &yystacksize); +- +- yyss = yyss1; +- yyvs = yyvs1; +- } +-#else /* no yyoverflow */ +-# ifndef YYSTACK_RELOCATE +- goto yyexhaustedlab; +-# else +- /* Extend the stack our own way. */ +- if (YYMAXDEPTH <= yystacksize) +- goto yyexhaustedlab; +- yystacksize *= 2; +- if (YYMAXDEPTH < yystacksize) +- yystacksize = YYMAXDEPTH; +- +- { +- yytype_int16 *yyss1 = yyss; +- union yyalloc *yyptr = +- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); +- if (! yyptr) +- goto yyexhaustedlab; +- YYSTACK_RELOCATE (yyss); +- YYSTACK_RELOCATE (yyvs); +- +-# undef YYSTACK_RELOCATE +- if (yyss1 != yyssa) +- YYSTACK_FREE (yyss1); +- } +-# endif +-#endif /* no yyoverflow */ +- +- yyssp = yyss + yysize - 1; +- yyvsp = yyvs + yysize - 1; +- +- +- YYDPRINTF ((stderr, "Stack size increased to %lu\n", +- (unsigned long int) yystacksize)); +- +- if (yyss + yystacksize - 1 <= yyssp) +- YYABORT; +- } +- +- YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +- +- goto yybackup; +- +-/*-----------. +-| yybackup. | +-`-----------*/ +-yybackup: +- +- /* Do appropriate processing given the current state. Read a +- look-ahead token if we need one and don't already have one. */ +- +- /* First try to decide what to do without reference to look-ahead token. */ +- yyn = yypact[yystate]; +- if (yyn == YYPACT_NINF) +- goto yydefault; +- +- /* Not known => get a look-ahead token if don't already have one. */ +- +- /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ +- if (yychar == YYEMPTY) +- { +- YYDPRINTF ((stderr, "Reading a token: ")); +- yychar = YYLEX; +- } +- +- if (yychar <= YYEOF) +- { +- yychar = yytoken = YYEOF; +- YYDPRINTF ((stderr, "Now at end of input.\n")); +- } +- else +- { +- yytoken = YYTRANSLATE (yychar); +- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); +- } +- +- /* If the proper action on seeing token YYTOKEN is to reduce or to +- detect an error, take that action. */ +- yyn += yytoken; +- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) +- goto yydefault; +- yyn = yytable[yyn]; +- if (yyn <= 0) +- { +- if (yyn == 0 || yyn == YYTABLE_NINF) +- goto yyerrlab; +- yyn = -yyn; +- goto yyreduce; +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- /* Count tokens shifted since error; after three, turn off error +- status. */ +- if (yyerrstatus) +- yyerrstatus--; +- +- /* Shift the look-ahead token. */ +- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); +- +- /* Discard the shifted token unless it is eof. */ +- if (yychar != YYEOF) +- yychar = YYEMPTY; +- +- yystate = yyn; +- *++yyvsp = yylval; +- +- goto yynewstate; +- +- +-/*-----------------------------------------------------------. +-| yydefault -- do the default action for the current state. | +-`-----------------------------------------------------------*/ +-yydefault: +- yyn = yydefact[yystate]; +- if (yyn == 0) +- goto yyerrlab; +- goto yyreduce; +- +- +-/*-----------------------------. +-| yyreduce -- Do a reduction. | +-`-----------------------------*/ +-yyreduce: +- /* yyn is the number of a rule to reduce with. */ +- yylen = yyr2[yyn]; +- +- /* If YYLEN is nonzero, implement the default value of the action: +- `$$ = $1'. +- +- Otherwise, the following line sets YYVAL to garbage. +- This behavior is undocumented and Bison +- users should not rely upon it. Assigning to YYVAL +- unconditionally makes the parser a bit smaller, and it avoids a +- GCC warning that YYVAL may be used uninitialized. */ +- yyval = yyvsp[1-yylen]; +- +- +- YY_REDUCE_PRINT (yyn); +- switch (yyn) +- { +- case 18: +-#line 202 "rcparse.y" +- { +- define_accelerator ((yyvsp[(1) - (6)].id), &(yyvsp[(3) - (6)].res_info), (yyvsp[(5) - (6)].pacc)); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 19: +-#line 212 "rcparse.y" +- { +- (yyval.pacc) = NULL; +- } +- break; +- +- case 20: +-#line 216 "rcparse.y" +- { +- rc_accelerator *a; +- +- a = (rc_accelerator *) res_alloc (sizeof *a); +- *a = (yyvsp[(2) - (2)].acc); +- if ((yyvsp[(1) - (2)].pacc) == NULL) +- (yyval.pacc) = a; +- else +- { +- rc_accelerator **pp; +- +- for (pp = &(yyvsp[(1) - (2)].pacc)->next; *pp != NULL; pp = &(*pp)->next) +- ; +- *pp = a; +- (yyval.pacc) = (yyvsp[(1) - (2)].pacc); +- } +- } +- break; +- +- case 21: +-#line 237 "rcparse.y" +- { +- (yyval.acc) = (yyvsp[(1) - (2)].acc); +- (yyval.acc).id = (yyvsp[(2) - (2)].il); +- } +- break; +- +- case 22: +-#line 242 "rcparse.y" +- { +- (yyval.acc) = (yyvsp[(1) - (4)].acc); +- (yyval.acc).id = (yyvsp[(2) - (4)].il); +- (yyval.acc).flags |= (yyvsp[(4) - (4)].is); +- if (((yyval.acc).flags & ACC_VIRTKEY) == 0 +- && ((yyval.acc).flags & (ACC_SHIFT | ACC_CONTROL)) != 0) +- rcparse_warning (_("inappropriate modifiers for non-VIRTKEY")); +- } +- break; +- +- case 23: +-#line 254 "rcparse.y" +- { +- const char *s = (yyvsp[(1) - (1)].s); +- char ch; +- +- (yyval.acc).next = NULL; +- (yyval.acc).id = 0; +- ch = *s; +- if (ch != '^') +- (yyval.acc).flags = 0; +- else +- { +- (yyval.acc).flags = ACC_CONTROL | ACC_VIRTKEY; +- ++s; +- ch = TOUPPER (s[0]); +- } +- (yyval.acc).key = ch; +- if (s[1] != '\0') +- rcparse_warning (_("accelerator should only be one character")); +- } +- break; +- +- case 24: +-#line 274 "rcparse.y" +- { +- (yyval.acc).next = NULL; +- (yyval.acc).flags = 0; +- (yyval.acc).id = 0; +- (yyval.acc).key = (yyvsp[(1) - (1)].il); +- } +- break; +- +- case 25: +-#line 284 "rcparse.y" +- { +- (yyval.is) = (yyvsp[(1) - (1)].is); +- } +- break; +- +- case 26: +-#line 288 "rcparse.y" +- { +- (yyval.is) = (yyvsp[(1) - (3)].is) | (yyvsp[(3) - (3)].is); +- } +- break; +- +- case 27: +-#line 293 "rcparse.y" +- { +- (yyval.is) = (yyvsp[(1) - (2)].is) | (yyvsp[(2) - (2)].is); +- } +- break; +- +- case 28: +-#line 300 "rcparse.y" +- { +- (yyval.is) = ACC_VIRTKEY; +- } +- break; +- +- case 29: +-#line 304 "rcparse.y" +- { +- /* This is just the absence of VIRTKEY. */ +- (yyval.is) = 0; +- } +- break; +- +- case 30: +-#line 309 "rcparse.y" +- { +- (yyval.is) = ACC_NOINVERT; +- } +- break; +- +- case 31: +-#line 313 "rcparse.y" +- { +- (yyval.is) = ACC_SHIFT; +- } +- break; +- +- case 32: +-#line 317 "rcparse.y" +- { +- (yyval.is) = ACC_CONTROL; +- } +- break; +- +- case 33: +-#line 321 "rcparse.y" +- { +- (yyval.is) = ACC_ALT; +- } +- break; +- +- case 34: +-#line 330 "rcparse.y" +- { +- define_bitmap ((yyvsp[(1) - (4)].id), &(yyvsp[(3) - (4)].res_info), (yyvsp[(4) - (4)].s)); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 35: +-#line 342 "rcparse.y" +- { +- define_cursor ((yyvsp[(1) - (4)].id), &(yyvsp[(3) - (4)].res_info), (yyvsp[(4) - (4)].s)); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 36: +-#line 355 "rcparse.y" +- { +- memset (&dialog, 0, sizeof dialog); +- dialog.x = (yyvsp[(5) - (8)].il); +- dialog.y = (yyvsp[(6) - (8)].il); +- dialog.width = (yyvsp[(7) - (8)].il); +- dialog.height = (yyvsp[(8) - (8)].il); +- dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU; +- dialog.exstyle = (yyvsp[(4) - (8)].il); +- dialog.menu.named = 1; +- dialog.class.named = 1; +- dialog.font = NULL; +- dialog.ex = NULL; +- dialog.controls = NULL; +- sub_res_info = (yyvsp[(3) - (8)].res_info); +- style = 0; +- } +- break; +- +- case 37: +-#line 372 "rcparse.y" +- { +- define_dialog ((yyvsp[(1) - (13)].id), &sub_res_info, &dialog); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 38: +-#line 380 "rcparse.y" +- { +- memset (&dialog, 0, sizeof dialog); +- dialog.x = (yyvsp[(5) - (8)].il); +- dialog.y = (yyvsp[(6) - (8)].il); +- dialog.width = (yyvsp[(7) - (8)].il); +- dialog.height = (yyvsp[(8) - (8)].il); +- dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU; +- dialog.exstyle = (yyvsp[(4) - (8)].il); +- dialog.menu.named = 1; +- dialog.class.named = 1; +- dialog.font = NULL; +- dialog.ex = ((rc_dialog_ex *) +- res_alloc (sizeof (rc_dialog_ex))); +- memset (dialog.ex, 0, sizeof (rc_dialog_ex)); +- dialog.controls = NULL; +- sub_res_info = (yyvsp[(3) - (8)].res_info); +- style = 0; +- } +- break; +- +- case 39: +-#line 399 "rcparse.y" +- { +- define_dialog ((yyvsp[(1) - (13)].id), &sub_res_info, &dialog); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 40: +-#line 407 "rcparse.y" +- { +- memset (&dialog, 0, sizeof dialog); +- dialog.x = (yyvsp[(5) - (9)].il); +- dialog.y = (yyvsp[(6) - (9)].il); +- dialog.width = (yyvsp[(7) - (9)].il); +- dialog.height = (yyvsp[(8) - (9)].il); +- dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU; +- dialog.exstyle = (yyvsp[(4) - (9)].il); +- dialog.menu.named = 1; +- dialog.class.named = 1; +- dialog.font = NULL; +- dialog.ex = ((rc_dialog_ex *) +- res_alloc (sizeof (rc_dialog_ex))); +- memset (dialog.ex, 0, sizeof (rc_dialog_ex)); +- dialog.ex->help = (yyvsp[(9) - (9)].il); +- dialog.controls = NULL; +- sub_res_info = (yyvsp[(3) - (9)].res_info); +- style = 0; +- } +- break; +- +- case 41: +-#line 427 "rcparse.y" +- { +- define_dialog ((yyvsp[(1) - (14)].id), &sub_res_info, &dialog); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 42: +-#line 437 "rcparse.y" +- { +- (yyval.il) = 0; +- } +- break; +- +- case 43: +-#line 441 "rcparse.y" +- { +- (yyval.il) = (yyvsp[(3) - (3)].il); +- } +- break; +- +- case 45: +-#line 449 "rcparse.y" +- { +- dialog.style |= WS_CAPTION; +- style |= WS_CAPTION; +- dialog.caption = (yyvsp[(3) - (3)].uni); +- } +- break; +- +- case 46: +-#line 455 "rcparse.y" +- { +- dialog.class = (yyvsp[(3) - (3)].id); +- } +- break; +- +- case 47: +-#line 460 "rcparse.y" +- { +- dialog.style = style; +- } +- break; +- +- case 48: +-#line 464 "rcparse.y" +- { +- dialog.exstyle = (yyvsp[(3) - (3)].il); +- } +- break; +- +- case 49: +-#line 468 "rcparse.y" +- { +- res_unistring_to_id (& dialog.class, (yyvsp[(3) - (3)].uni)); +- } +- break; +- +- case 50: +-#line 472 "rcparse.y" +- { +- dialog.style |= DS_SETFONT; +- style |= DS_SETFONT; +- dialog.pointsize = (yyvsp[(3) - (5)].il); +- dialog.font = (yyvsp[(5) - (5)].uni); +- if (dialog.ex != NULL) +- { +- dialog.ex->weight = 0; +- dialog.ex->italic = 0; +- dialog.ex->charset = 1; +- } +- } +- break; +- +- case 51: +-#line 485 "rcparse.y" +- { +- dialog.style |= DS_SETFONT; +- style |= DS_SETFONT; +- dialog.pointsize = (yyvsp[(3) - (6)].il); +- dialog.font = (yyvsp[(5) - (6)].uni); +- if (dialog.ex == NULL) +- rcparse_warning (_("extended FONT requires DIALOGEX")); +- else +- { +- dialog.ex->weight = (yyvsp[(6) - (6)].il); +- dialog.ex->italic = 0; +- dialog.ex->charset = 1; +- } +- } +- break; +- +- case 52: +-#line 500 "rcparse.y" +- { +- dialog.style |= DS_SETFONT; +- style |= DS_SETFONT; +- dialog.pointsize = (yyvsp[(3) - (7)].il); +- dialog.font = (yyvsp[(5) - (7)].uni); +- if (dialog.ex == NULL) +- rcparse_warning (_("extended FONT requires DIALOGEX")); +- else +- { +- dialog.ex->weight = (yyvsp[(6) - (7)].il); +- dialog.ex->italic = (yyvsp[(7) - (7)].il); +- dialog.ex->charset = 1; +- } +- } +- break; +- +- case 53: +-#line 515 "rcparse.y" +- { +- dialog.style |= DS_SETFONT; +- style |= DS_SETFONT; +- dialog.pointsize = (yyvsp[(3) - (8)].il); +- dialog.font = (yyvsp[(5) - (8)].uni); +- if (dialog.ex == NULL) +- rcparse_warning (_("extended FONT requires DIALOGEX")); +- else +- { +- dialog.ex->weight = (yyvsp[(6) - (8)].il); +- dialog.ex->italic = (yyvsp[(7) - (8)].il); +- dialog.ex->charset = (yyvsp[(8) - (8)].il); +- } +- } +- break; +- +- case 54: +-#line 530 "rcparse.y" +- { +- dialog.menu = (yyvsp[(3) - (3)].id); +- } +- break; +- +- case 55: +-#line 534 "rcparse.y" +- { +- sub_res_info.characteristics = (yyvsp[(3) - (3)].il); +- } +- break; +- +- case 56: +-#line 538 "rcparse.y" +- { +- sub_res_info.language = (yyvsp[(3) - (4)].il) | ((yyvsp[(4) - (4)].il) << SUBLANG_SHIFT); +- } +- break; +- +- case 57: +-#line 542 "rcparse.y" +- { +- sub_res_info.version = (yyvsp[(3) - (3)].il); +- } +- break; +- +- case 59: +-#line 550 "rcparse.y" +- { +- rc_dialog_control **pp; +- +- for (pp = &dialog.controls; *pp != NULL; pp = &(*pp)->next) +- ; +- *pp = (yyvsp[(2) - (2)].dialog_control); +- } +- break; +- +- case 60: +-#line 561 "rcparse.y" +- { +- default_style = BS_AUTO3STATE | WS_TABSTOP; +- base_style = BS_AUTO3STATE; +- class.named = 0; +- class.u.id = CTL_BUTTON; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 61: +-#line 569 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- } +- break; +- +- case 62: +-#line 573 "rcparse.y" +- { +- default_style = BS_AUTOCHECKBOX | WS_TABSTOP; +- base_style = BS_AUTOCHECKBOX; +- class.named = 0; +- class.u.id = CTL_BUTTON; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 63: +-#line 581 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- } +- break; +- +- case 64: +-#line 585 "rcparse.y" +- { +- default_style = BS_AUTORADIOBUTTON | WS_TABSTOP; +- base_style = BS_AUTORADIOBUTTON; +- class.named = 0; +- class.u.id = CTL_BUTTON; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 65: +-#line 593 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- } +- break; +- +- case 66: +-#line 597 "rcparse.y" +- { +- default_style = ES_LEFT | WS_BORDER | WS_TABSTOP; +- base_style = ES_LEFT | WS_BORDER | WS_TABSTOP; +- class.named = 0; +- class.u.id = CTL_EDIT; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 67: +-#line 605 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- if (dialog.ex == NULL) +- rcparse_warning (_("BEDIT requires DIALOGEX")); +- res_string_to_id (&(yyval.dialog_control)->class, "BEDIT"); +- } +- break; +- +- case 68: +-#line 612 "rcparse.y" +- { +- default_style = BS_CHECKBOX | WS_TABSTOP; +- base_style = BS_CHECKBOX | WS_TABSTOP; +- class.named = 0; +- class.u.id = CTL_BUTTON; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 69: +-#line 620 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- } +- break; +- +- case 70: +-#line 624 "rcparse.y" +- { +- /* This is as per MSDN documentation. With some (???) +- versions of MS rc.exe their is no default style. */ +- default_style = CBS_SIMPLE | WS_TABSTOP; +- base_style = 0; +- class.named = 0; +- class.u.id = CTL_COMBOBOX; +- res_text_field = res_null_text; +- } +- break; +- +- case 71: +-#line 634 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(3) - (3)].dialog_control); +- } +- break; +- +- case 72: +-#line 639 "rcparse.y" +- { +- (yyval.dialog_control) = define_control ((yyvsp[(2) - (11)].id), (yyvsp[(3) - (11)].il), (yyvsp[(6) - (11)].il), (yyvsp[(7) - (11)].il), (yyvsp[(8) - (11)].il), (yyvsp[(9) - (11)].il), (yyvsp[(4) - (11)].id), style, (yyvsp[(10) - (11)].il)); +- if ((yyvsp[(11) - (11)].rcdata_item) != NULL) +- { +- if (dialog.ex == NULL) +- rcparse_warning (_("control data requires DIALOGEX")); +- (yyval.dialog_control)->data = (yyvsp[(11) - (11)].rcdata_item); +- } +- } +- break; +- +- case 73: +-#line 650 "rcparse.y" +- { +- (yyval.dialog_control) = define_control ((yyvsp[(2) - (12)].id), (yyvsp[(3) - (12)].il), (yyvsp[(6) - (12)].il), (yyvsp[(7) - (12)].il), (yyvsp[(8) - (12)].il), (yyvsp[(9) - (12)].il), (yyvsp[(4) - (12)].id), style, (yyvsp[(10) - (12)].il)); +- if (dialog.ex == NULL) +- rcparse_warning (_("help ID requires DIALOGEX")); +- (yyval.dialog_control)->help = (yyvsp[(11) - (12)].il); +- (yyval.dialog_control)->data = (yyvsp[(12) - (12)].rcdata_item); +- } +- break; +- +- case 74: +-#line 658 "rcparse.y" +- { +- default_style = SS_CENTER | WS_GROUP; +- base_style = SS_CENTER; +- class.named = 0; +- class.u.id = CTL_STATIC; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 75: +-#line 666 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- } +- break; +- +- case 76: +-#line 670 "rcparse.y" +- { +- default_style = BS_DEFPUSHBUTTON | WS_TABSTOP; +- base_style = BS_DEFPUSHBUTTON | WS_TABSTOP; +- class.named = 0; +- class.u.id = CTL_BUTTON; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 77: +-#line 678 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- } +- break; +- +- case 78: +-#line 682 "rcparse.y" +- { +- default_style = ES_LEFT | WS_BORDER | WS_TABSTOP; +- base_style = ES_LEFT | WS_BORDER | WS_TABSTOP; +- class.named = 0; +- class.u.id = CTL_EDIT; +- res_text_field = res_null_text; +- } +- break; +- +- case 79: +-#line 690 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(3) - (3)].dialog_control); +- } +- break; +- +- case 80: +-#line 694 "rcparse.y" +- { +- default_style = BS_GROUPBOX; +- base_style = BS_GROUPBOX; +- class.named = 0; +- class.u.id = CTL_BUTTON; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 81: +-#line 702 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- } +- break; +- +- case 82: +-#line 706 "rcparse.y" +- { +- default_style = ES_LEFT | WS_BORDER | WS_TABSTOP; +- base_style = ES_LEFT | WS_BORDER | WS_TABSTOP; +- class.named = 0; +- class.u.id = CTL_EDIT; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 83: +-#line 714 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- if (dialog.ex == NULL) +- rcparse_warning (_("IEDIT requires DIALOGEX")); +- res_string_to_id (&(yyval.dialog_control)->class, "HEDIT"); +- } +- break; +- +- case 84: +-#line 721 "rcparse.y" +- { +- (yyval.dialog_control) = define_icon_control ((yyvsp[(2) - (6)].id), (yyvsp[(3) - (6)].il), (yyvsp[(4) - (6)].il), (yyvsp[(5) - (6)].il), 0, 0, 0, (yyvsp[(6) - (6)].rcdata_item), +- dialog.ex); +- } +- break; +- +- case 85: +-#line 727 "rcparse.y" +- { +- (yyval.dialog_control) = define_icon_control ((yyvsp[(2) - (8)].id), (yyvsp[(3) - (8)].il), (yyvsp[(4) - (8)].il), (yyvsp[(5) - (8)].il), 0, 0, 0, (yyvsp[(8) - (8)].rcdata_item), +- dialog.ex); +- } +- break; +- +- case 86: +-#line 733 "rcparse.y" +- { +- (yyval.dialog_control) = define_icon_control ((yyvsp[(2) - (10)].id), (yyvsp[(3) - (10)].il), (yyvsp[(4) - (10)].il), (yyvsp[(5) - (10)].il), style, (yyvsp[(9) - (10)].il), 0, (yyvsp[(10) - (10)].rcdata_item), +- dialog.ex); +- } +- break; +- +- case 87: +-#line 739 "rcparse.y" +- { +- (yyval.dialog_control) = define_icon_control ((yyvsp[(2) - (11)].id), (yyvsp[(3) - (11)].il), (yyvsp[(4) - (11)].il), (yyvsp[(5) - (11)].il), style, (yyvsp[(9) - (11)].il), (yyvsp[(10) - (11)].il), (yyvsp[(11) - (11)].rcdata_item), +- dialog.ex); +- } +- break; +- +- case 88: +-#line 744 "rcparse.y" +- { +- default_style = ES_LEFT | WS_BORDER | WS_TABSTOP; +- base_style = ES_LEFT | WS_BORDER | WS_TABSTOP; +- class.named = 0; +- class.u.id = CTL_EDIT; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 89: +-#line 752 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- if (dialog.ex == NULL) +- rcparse_warning (_("IEDIT requires DIALOGEX")); +- res_string_to_id (&(yyval.dialog_control)->class, "IEDIT"); +- } +- break; +- +- case 90: +-#line 759 "rcparse.y" +- { +- default_style = LBS_NOTIFY | WS_BORDER; +- base_style = LBS_NOTIFY | WS_BORDER; +- class.named = 0; +- class.u.id = CTL_LISTBOX; +- res_text_field = res_null_text; +- } +- break; +- +- case 91: +-#line 767 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(3) - (3)].dialog_control); +- } +- break; +- +- case 92: +-#line 771 "rcparse.y" +- { +- default_style = SS_LEFT | WS_GROUP; +- base_style = SS_LEFT; +- class.named = 0; +- class.u.id = CTL_STATIC; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 93: +-#line 779 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- } +- break; +- +- case 94: +-#line 783 "rcparse.y" +- { +- default_style = BS_PUSHBOX | WS_TABSTOP; +- base_style = BS_PUSHBOX; +- class.named = 0; +- class.u.id = CTL_BUTTON; +- } +- break; +- +- case 95: +-#line 790 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- } +- break; +- +- case 96: +-#line 794 "rcparse.y" +- { +- default_style = BS_PUSHBUTTON | WS_TABSTOP; +- base_style = BS_PUSHBUTTON | WS_TABSTOP; +- class.named = 0; +- class.u.id = CTL_BUTTON; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 97: +-#line 802 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- } +- break; +- +- case 98: +-#line 806 "rcparse.y" +- { +- default_style = BS_RADIOBUTTON | WS_TABSTOP; +- base_style = BS_RADIOBUTTON; +- class.named = 0; +- class.u.id = CTL_BUTTON; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 99: +-#line 814 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- } +- break; +- +- case 100: +-#line 818 "rcparse.y" +- { +- default_style = SS_RIGHT | WS_GROUP; +- base_style = SS_RIGHT; +- class.named = 0; +- class.u.id = CTL_STATIC; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 101: +-#line 826 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- } +- break; +- +- case 102: +-#line 830 "rcparse.y" +- { +- default_style = SBS_HORZ; +- base_style = 0; +- class.named = 0; +- class.u.id = CTL_SCROLLBAR; +- res_text_field = res_null_text; +- } +- break; +- +- case 103: +-#line 838 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(3) - (3)].dialog_control); +- } +- break; +- +- case 104: +-#line 842 "rcparse.y" +- { +- default_style = BS_3STATE | WS_TABSTOP; +- base_style = BS_3STATE; +- class.named = 0; +- class.u.id = CTL_BUTTON; +- res_text_field = (yyvsp[(2) - (2)].id); +- } +- break; +- +- case 105: +-#line 850 "rcparse.y" +- { +- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control); +- } +- break; +- +- case 106: +-#line 855 "rcparse.y" +- { style = WS_CHILD | WS_VISIBLE; } +- break; +- +- case 107: +-#line 857 "rcparse.y" +- { +- rc_res_id cid; +- cid.named = 0; +- cid.u.id = CTL_BUTTON; +- (yyval.dialog_control) = define_control ((yyvsp[(2) - (15)].id), (yyvsp[(3) - (15)].il), (yyvsp[(5) - (15)].il), (yyvsp[(7) - (15)].il), (yyvsp[(9) - (15)].il), (yyvsp[(11) - (15)].il), cid, +- style, (yyvsp[(15) - (15)].il)); +- } +- break; +- +- case 108: +-#line 875 "rcparse.y" +- { +- (yyval.dialog_control) = define_control (res_text_field, (yyvsp[(1) - (6)].il), (yyvsp[(2) - (6)].il), (yyvsp[(3) - (6)].il), (yyvsp[(4) - (6)].il), (yyvsp[(5) - (6)].il), class, +- default_style | WS_CHILD | WS_VISIBLE, 0); +- if ((yyvsp[(6) - (6)].rcdata_item) != NULL) +- { +- if (dialog.ex == NULL) +- rcparse_warning (_("control data requires DIALOGEX")); +- (yyval.dialog_control)->data = (yyvsp[(6) - (6)].rcdata_item); +- } +- } +- break; +- +- case 109: +-#line 887 "rcparse.y" +- { +- (yyval.dialog_control) = define_control (res_text_field, (yyvsp[(1) - (8)].il), (yyvsp[(2) - (8)].il), (yyvsp[(3) - (8)].il), (yyvsp[(4) - (8)].il), (yyvsp[(5) - (8)].il), class, style, (yyvsp[(7) - (8)].il)); +- if ((yyvsp[(8) - (8)].rcdata_item) != NULL) +- { +- if (dialog.ex == NULL) +- rcparse_warning (_("control data requires DIALOGEX")); +- (yyval.dialog_control)->data = (yyvsp[(8) - (8)].rcdata_item); +- } +- } +- break; +- +- case 110: +-#line 898 "rcparse.y" +- { +- (yyval.dialog_control) = define_control (res_text_field, (yyvsp[(1) - (9)].il), (yyvsp[(2) - (9)].il), (yyvsp[(3) - (9)].il), (yyvsp[(4) - (9)].il), (yyvsp[(5) - (9)].il), class, style, (yyvsp[(7) - (9)].il)); +- if (dialog.ex == NULL) +- rcparse_warning (_("help ID requires DIALOGEX")); +- (yyval.dialog_control)->help = (yyvsp[(8) - (9)].il); +- (yyval.dialog_control)->data = (yyvsp[(9) - (9)].rcdata_item); +- } +- break; +- +- case 111: +-#line 909 "rcparse.y" +- { +- if ((yyvsp[(2) - (2)].id).named) +- res_unistring_to_id (&(yyval.id), (yyvsp[(2) - (2)].id).u.n.name); +- else +- (yyval.id)=(yyvsp[(2) - (2)].id); +- } +- break; +- +- case 112: +-#line 919 "rcparse.y" +- { +- res_string_to_id (&(yyval.id), ""); +- } +- break; +- +- case 113: +-#line 922 "rcparse.y" +- { (yyval.id)=(yyvsp[(1) - (2)].id); } +- break; +- +- case 114: +-#line 927 "rcparse.y" +- { +- (yyval.id).named = 0; +- (yyval.id).u.id = (yyvsp[(1) - (1)].il); +- } +- break; +- +- case 115: +-#line 932 "rcparse.y" +- { +- (yyval.id).named = 1; +- (yyval.id).u.n.name = (yyvsp[(1) - (1)].uni); +- (yyval.id).u.n.length = unichar_len ((yyvsp[(1) - (1)].uni)); +- } +- break; +- +- case 116: +-#line 941 "rcparse.y" +- { +- (yyval.rcdata_item) = NULL; +- } +- break; +- +- case 117: +-#line 945 "rcparse.y" +- { +- (yyval.rcdata_item) = (yyvsp[(2) - (3)].rcdata).first; +- } +- break; +- +- case 118: +-#line 954 "rcparse.y" +- { style = WS_CHILD | WS_VISIBLE; } +- break; +- +- case 120: +-#line 960 "rcparse.y" +- { style = SS_ICON | WS_CHILD | WS_VISIBLE; } +- break; +- +- case 122: +-#line 966 "rcparse.y" +- { style = base_style | WS_CHILD | WS_VISIBLE; } +- break; +- +- case 124: +-#line 974 "rcparse.y" +- { +- define_font ((yyvsp[(1) - (4)].id), &(yyvsp[(3) - (4)].res_info), (yyvsp[(4) - (4)].s)); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 125: +-#line 986 "rcparse.y" +- { +- define_icon ((yyvsp[(1) - (4)].id), &(yyvsp[(3) - (4)].res_info), (yyvsp[(4) - (4)].s)); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 126: +-#line 999 "rcparse.y" +- { +- language = (yyvsp[(2) - (3)].il) | ((yyvsp[(3) - (3)].il) << SUBLANG_SHIFT); +- } +- break; +- +- case 127: +-#line 1008 "rcparse.y" +- { +- define_menu ((yyvsp[(1) - (6)].id), &(yyvsp[(3) - (6)].res_info), (yyvsp[(5) - (6)].menuitem)); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 128: +-#line 1018 "rcparse.y" +- { +- (yyval.menuitem) = NULL; +- } +- break; +- +- case 129: +-#line 1022 "rcparse.y" +- { +- if ((yyvsp[(1) - (2)].menuitem) == NULL) +- (yyval.menuitem) = (yyvsp[(2) - (2)].menuitem); +- else +- { +- rc_menuitem **pp; +- +- for (pp = &(yyvsp[(1) - (2)].menuitem)->next; *pp != NULL; pp = &(*pp)->next) +- ; +- *pp = (yyvsp[(2) - (2)].menuitem); +- (yyval.menuitem) = (yyvsp[(1) - (2)].menuitem); +- } +- } +- break; +- +- case 130: +-#line 1039 "rcparse.y" +- { +- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (4)].uni), (yyvsp[(3) - (4)].il), (yyvsp[(4) - (4)].is), 0, 0, NULL); +- } +- break; +- +- case 131: +-#line 1043 "rcparse.y" +- { +- (yyval.menuitem) = define_menuitem (NULL, 0, 0, 0, 0, NULL); +- } +- break; +- +- case 132: +-#line 1047 "rcparse.y" +- { +- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (6)].uni), 0, (yyvsp[(3) - (6)].is), 0, 0, (yyvsp[(5) - (6)].menuitem)); +- } +- break; +- +- case 133: +-#line 1054 "rcparse.y" +- { +- (yyval.is) = 0; +- } +- break; +- +- case 134: +-#line 1058 "rcparse.y" +- { +- (yyval.is) = (yyvsp[(1) - (3)].is) | (yyvsp[(3) - (3)].is); +- } +- break; +- +- case 135: +-#line 1062 "rcparse.y" +- { +- (yyval.is) = (yyvsp[(1) - (2)].is) | (yyvsp[(2) - (2)].is); +- } +- break; +- +- case 136: +-#line 1069 "rcparse.y" +- { +- (yyval.is) = MENUITEM_CHECKED; +- } +- break; +- +- case 137: +-#line 1073 "rcparse.y" +- { +- (yyval.is) = MENUITEM_GRAYED; +- } +- break; +- +- case 138: +-#line 1077 "rcparse.y" +- { +- (yyval.is) = MENUITEM_HELP; +- } +- break; +- +- case 139: +-#line 1081 "rcparse.y" +- { +- (yyval.is) = MENUITEM_INACTIVE; +- } +- break; +- +- case 140: +-#line 1085 "rcparse.y" +- { +- (yyval.is) = MENUITEM_MENUBARBREAK; +- } +- break; +- +- case 141: +-#line 1089 "rcparse.y" +- { +- (yyval.is) = MENUITEM_MENUBREAK; +- } +- break; +- +- case 142: +-#line 1098 "rcparse.y" +- { +- define_menu ((yyvsp[(1) - (6)].id), &(yyvsp[(3) - (6)].res_info), (yyvsp[(5) - (6)].menuitem)); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 143: +-#line 1108 "rcparse.y" +- { +- (yyval.menuitem) = NULL; +- } +- break; +- +- case 144: +-#line 1112 "rcparse.y" +- { +- if ((yyvsp[(1) - (2)].menuitem) == NULL) +- (yyval.menuitem) = (yyvsp[(2) - (2)].menuitem); +- else +- { +- rc_menuitem **pp; +- +- for (pp = &(yyvsp[(1) - (2)].menuitem)->next; *pp != NULL; pp = &(*pp)->next) +- ; +- *pp = (yyvsp[(2) - (2)].menuitem); +- (yyval.menuitem) = (yyvsp[(1) - (2)].menuitem); +- } +- } +- break; +- +- case 145: +-#line 1129 "rcparse.y" +- { +- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (2)].uni), 0, 0, 0, 0, NULL); +- } +- break; +- +- case 146: +-#line 1133 "rcparse.y" +- { +- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (3)].uni), (yyvsp[(3) - (3)].il), 0, 0, 0, NULL); +- } +- break; +- +- case 147: +-#line 1137 "rcparse.y" +- { +- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (5)].uni), (yyvsp[(3) - (5)].il), (yyvsp[(4) - (5)].il), (yyvsp[(5) - (5)].il), 0, NULL); +- } +- break; +- +- case 148: +-#line 1141 "rcparse.y" +- { +- (yyval.menuitem) = define_menuitem (NULL, 0, 0, 0, 0, NULL); +- } +- break; +- +- case 149: +-#line 1145 "rcparse.y" +- { +- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (5)].uni), 0, 0, 0, 0, (yyvsp[(4) - (5)].menuitem)); +- } +- break; +- +- case 150: +-#line 1149 "rcparse.y" +- { +- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (6)].uni), (yyvsp[(3) - (6)].il), 0, 0, 0, (yyvsp[(5) - (6)].menuitem)); +- } +- break; +- +- case 151: +-#line 1153 "rcparse.y" +- { +- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (7)].uni), (yyvsp[(3) - (7)].il), (yyvsp[(4) - (7)].il), 0, 0, (yyvsp[(6) - (7)].menuitem)); +- } +- break; +- +- case 152: +-#line 1158 "rcparse.y" +- { +- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (9)].uni), (yyvsp[(3) - (9)].il), (yyvsp[(4) - (9)].il), (yyvsp[(5) - (9)].il), (yyvsp[(6) - (9)].il), (yyvsp[(8) - (9)].menuitem)); +- } +- break; +- +- case 153: +-#line 1167 "rcparse.y" +- { +- define_messagetable ((yyvsp[(1) - (4)].id), &(yyvsp[(3) - (4)].res_info), (yyvsp[(4) - (4)].s)); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 154: +-#line 1179 "rcparse.y" +- { +- rcparse_rcdata (); +- } +- break; +- +- case 155: +-#line 1183 "rcparse.y" +- { +- rcparse_normal (); +- (yyval.rcdata) = (yyvsp[(2) - (2)].rcdata); +- } +- break; +- +- case 156: +-#line 1191 "rcparse.y" +- { +- (yyval.rcdata).first = NULL; +- (yyval.rcdata).last = NULL; +- } +- break; +- +- case 157: +-#line 1196 "rcparse.y" +- { +- (yyval.rcdata) = (yyvsp[(1) - (1)].rcdata); +- } +- break; +- +- case 158: +-#line 1203 "rcparse.y" +- { +- rc_rcdata_item *ri; +- +- ri = define_rcdata_string ((yyvsp[(1) - (1)].ss).s, (yyvsp[(1) - (1)].ss).length); +- (yyval.rcdata).first = ri; +- (yyval.rcdata).last = ri; +- } +- break; +- +- case 159: +-#line 1211 "rcparse.y" +- { +- rc_rcdata_item *ri; +- +- ri = define_rcdata_unistring ((yyvsp[(1) - (1)].suni).s, (yyvsp[(1) - (1)].suni).length); +- (yyval.rcdata).first = ri; +- (yyval.rcdata).last = ri; +- } +- break; +- +- case 160: +-#line 1219 "rcparse.y" +- { +- rc_rcdata_item *ri; +- +- ri = define_rcdata_number ((yyvsp[(1) - (1)].i).val, (yyvsp[(1) - (1)].i).dword); +- (yyval.rcdata).first = ri; +- (yyval.rcdata).last = ri; +- } +- break; +- +- case 161: +-#line 1227 "rcparse.y" +- { +- rc_rcdata_item *ri; +- +- ri = define_rcdata_string ((yyvsp[(3) - (3)].ss).s, (yyvsp[(3) - (3)].ss).length); +- (yyval.rcdata).first = (yyvsp[(1) - (3)].rcdata).first; +- (yyvsp[(1) - (3)].rcdata).last->next = ri; +- (yyval.rcdata).last = ri; +- } +- break; +- +- case 162: +-#line 1236 "rcparse.y" +- { +- rc_rcdata_item *ri; +- +- ri = define_rcdata_unistring ((yyvsp[(3) - (3)].suni).s, (yyvsp[(3) - (3)].suni).length); +- (yyval.rcdata).first = (yyvsp[(1) - (3)].rcdata).first; +- (yyvsp[(1) - (3)].rcdata).last->next = ri; +- (yyval.rcdata).last = ri; +- } +- break; +- +- case 163: +-#line 1245 "rcparse.y" +- { +- rc_rcdata_item *ri; +- +- ri = define_rcdata_number ((yyvsp[(3) - (3)].i).val, (yyvsp[(3) - (3)].i).dword); +- (yyval.rcdata).first = (yyvsp[(1) - (3)].rcdata).first; +- (yyvsp[(1) - (3)].rcdata).last->next = ri; +- (yyval.rcdata).last = ri; +- } +- break; +- +- case 164: +-#line 1254 "rcparse.y" +- { +- (yyval.rcdata)=(yyvsp[(1) - (2)].rcdata); +- } +- break; +- +- case 165: +-#line 1263 "rcparse.y" +- { sub_res_info = (yyvsp[(2) - (3)].res_info); rcparse_rcdata (); } +- break; +- +- case 166: +-#line 1264 "rcparse.y" +- { rcparse_normal (); } +- break; +- +- case 168: +-#line 1270 "rcparse.y" +- { +- define_stringtable (&sub_res_info, (yyvsp[(2) - (3)].il), (yyvsp[(3) - (3)].suni).s, (yyvsp[(3) - (3)].suni).length); +- rcparse_discard_strings (); +- } +- break; +- +- case 169: +-#line 1275 "rcparse.y" +- { +- define_stringtable (&sub_res_info, (yyvsp[(2) - (4)].il), (yyvsp[(4) - (4)].suni).s, (yyvsp[(4) - (4)].suni).length); +- rcparse_discard_strings (); +- } +- break; +- +- case 170: +-#line 1280 "rcparse.y" +- { +- rcparse_warning (_("invalid stringtable resource.")); +- abort (); +- } +- break; +- +- case 171: +-#line 1288 "rcparse.y" +- { +- (yyval.id)=(yyvsp[(1) - (1)].id); +- } +- break; +- +- case 172: +-#line 1292 "rcparse.y" +- { +- (yyval.id).named = 0; +- (yyval.id).u.id = 23; +- } +- break; +- +- case 173: +-#line 1297 "rcparse.y" +- { +- (yyval.id).named = 0; +- (yyval.id).u.id = RT_RCDATA; +- } +- break; +- +- case 174: +-#line 1302 "rcparse.y" +- { +- (yyval.id).named = 0; +- (yyval.id).u.id = RT_MANIFEST; +- } +- break; +- +- case 175: +-#line 1307 "rcparse.y" +- { +- (yyval.id).named = 0; +- (yyval.id).u.id = RT_PLUGPLAY; +- } +- break; +- +- case 176: +-#line 1312 "rcparse.y" +- { +- (yyval.id).named = 0; +- (yyval.id).u.id = RT_VXD; +- } +- break; +- +- case 177: +-#line 1317 "rcparse.y" +- { +- (yyval.id).named = 0; +- (yyval.id).u.id = RT_DLGINCLUDE; +- } +- break; +- +- case 178: +-#line 1322 "rcparse.y" +- { +- (yyval.id).named = 0; +- (yyval.id).u.id = RT_DLGINIT; +- } +- break; +- +- case 179: +-#line 1327 "rcparse.y" +- { +- (yyval.id).named = 0; +- (yyval.id).u.id = RT_ANICURSOR; +- } +- break; +- +- case 180: +-#line 1332 "rcparse.y" +- { +- (yyval.id).named = 0; +- (yyval.id).u.id = RT_ANIICON; +- } +- break; +- +- case 181: +-#line 1343 "rcparse.y" +- { +- define_user_data ((yyvsp[(1) - (6)].id), (yyvsp[(2) - (6)].id), &(yyvsp[(3) - (6)].res_info), (yyvsp[(5) - (6)].rcdata).first); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 182: +-#line 1350 "rcparse.y" +- { +- define_user_file ((yyvsp[(1) - (4)].id), (yyvsp[(2) - (4)].id), &(yyvsp[(3) - (4)].res_info), (yyvsp[(4) - (4)].s)); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 183: +-#line 1360 "rcparse.y" +- { +- define_toolbar ((yyvsp[(1) - (8)].id), &(yyvsp[(3) - (8)].res_info), (yyvsp[(4) - (8)].il), (yyvsp[(5) - (8)].il), (yyvsp[(7) - (8)].toobar_item)); +- } +- break; +- +- case 184: +-#line 1365 "rcparse.y" +- { (yyval.toobar_item)= NULL; } +- break; +- +- case 185: +-#line 1367 "rcparse.y" +- { +- rc_toolbar_item *c,*n; +- c = (yyvsp[(1) - (3)].toobar_item); +- n= (rc_toolbar_item *) +- res_alloc (sizeof (rc_toolbar_item)); +- if (c != NULL) +- while (c->next != NULL) +- c = c->next; +- n->prev = c; +- n->next = NULL; +- if (c != NULL) +- c->next = n; +- n->id = (yyvsp[(3) - (3)].id); +- if ((yyvsp[(1) - (3)].toobar_item) == NULL) +- (yyval.toobar_item) = n; +- else +- (yyval.toobar_item) = (yyvsp[(1) - (3)].toobar_item); +- } +- break; +- +- case 186: +-#line 1386 "rcparse.y" +- { +- rc_toolbar_item *c,*n; +- c = (yyvsp[(1) - (2)].toobar_item); +- n= (rc_toolbar_item *) +- res_alloc (sizeof (rc_toolbar_item)); +- if (c != NULL) +- while (c->next != NULL) +- c = c->next; +- n->prev = c; +- n->next = NULL; +- if (c != NULL) +- c->next = n; +- n->id.named = 0; +- n->id.u.id = 0; +- if ((yyvsp[(1) - (2)].toobar_item) == NULL) +- (yyval.toobar_item) = n; +- else +- (yyval.toobar_item) = (yyvsp[(1) - (2)].toobar_item); +- } +- break; +- +- case 187: +-#line 1411 "rcparse.y" +- { +- define_versioninfo ((yyvsp[(1) - (6)].id), language, (yyvsp[(3) - (6)].fixver), (yyvsp[(5) - (6)].verinfo)); +- if (yychar != YYEMPTY) +- YYERROR; +- rcparse_discard_strings (); +- } +- break; +- +- case 188: +-#line 1421 "rcparse.y" +- { +- (yyval.fixver) = ((rc_fixed_versioninfo *) +- res_alloc (sizeof (rc_fixed_versioninfo))); +- memset ((yyval.fixver), 0, sizeof (rc_fixed_versioninfo)); +- } +- break; +- +- case 189: +-#line 1428 "rcparse.y" +- { +- (yyvsp[(1) - (6)].fixver)->file_version_ms = ((yyvsp[(3) - (6)].il) << 16) | (yyvsp[(4) - (6)].il); +- (yyvsp[(1) - (6)].fixver)->file_version_ls = ((yyvsp[(5) - (6)].il) << 16) | (yyvsp[(6) - (6)].il); +- (yyval.fixver) = (yyvsp[(1) - (6)].fixver); +- } +- break; +- +- case 190: +-#line 1435 "rcparse.y" +- { +- (yyvsp[(1) - (6)].fixver)->product_version_ms = ((yyvsp[(3) - (6)].il) << 16) | (yyvsp[(4) - (6)].il); +- (yyvsp[(1) - (6)].fixver)->product_version_ls = ((yyvsp[(5) - (6)].il) << 16) | (yyvsp[(6) - (6)].il); +- (yyval.fixver) = (yyvsp[(1) - (6)].fixver); +- } +- break; +- +- case 191: +-#line 1441 "rcparse.y" +- { +- (yyvsp[(1) - (3)].fixver)->file_flags_mask = (yyvsp[(3) - (3)].il); +- (yyval.fixver) = (yyvsp[(1) - (3)].fixver); +- } +- break; +- +- case 192: +-#line 1446 "rcparse.y" +- { +- (yyvsp[(1) - (3)].fixver)->file_flags = (yyvsp[(3) - (3)].il); +- (yyval.fixver) = (yyvsp[(1) - (3)].fixver); +- } +- break; +- +- case 193: +-#line 1451 "rcparse.y" +- { +- (yyvsp[(1) - (3)].fixver)->file_os = (yyvsp[(3) - (3)].il); +- (yyval.fixver) = (yyvsp[(1) - (3)].fixver); +- } +- break; +- +- case 194: +-#line 1456 "rcparse.y" +- { +- (yyvsp[(1) - (3)].fixver)->file_type = (yyvsp[(3) - (3)].il); +- (yyval.fixver) = (yyvsp[(1) - (3)].fixver); +- } +- break; +- +- case 195: +-#line 1461 "rcparse.y" +- { +- (yyvsp[(1) - (3)].fixver)->file_subtype = (yyvsp[(3) - (3)].il); +- (yyval.fixver) = (yyvsp[(1) - (3)].fixver); +- } +- break; +- +- case 196: +-#line 1475 "rcparse.y" +- { +- (yyval.verinfo) = NULL; +- } +- break; +- +- case 197: +-#line 1479 "rcparse.y" +- { +- (yyval.verinfo) = append_ver_stringfileinfo ((yyvsp[(1) - (5)].verinfo), (yyvsp[(4) - (5)].verstringtable)); +- } +- break; +- +- case 198: +-#line 1483 "rcparse.y" +- { +- (yyval.verinfo) = append_ver_varfileinfo ((yyvsp[(1) - (7)].verinfo), (yyvsp[(5) - (7)].uni), (yyvsp[(6) - (7)].vervar)); +- } +- break; +- +- case 199: +-#line 1490 "rcparse.y" +- { +- (yyval.verstringtable) = NULL; +- } +- break; +- +- case 200: +-#line 1494 "rcparse.y" +- { +- (yyval.verstringtable) = append_ver_stringtable ((yyvsp[(1) - (5)].verstringtable), (yyvsp[(2) - (5)].s), (yyvsp[(4) - (5)].verstring)); +- } +- break; +- +- case 201: +-#line 1501 "rcparse.y" +- { +- (yyval.verstring) = NULL; +- } +- break; +- +- case 202: +-#line 1505 "rcparse.y" +- { +- (yyval.verstring) = append_verval ((yyvsp[(1) - (5)].verstring), (yyvsp[(3) - (5)].uni), (yyvsp[(5) - (5)].uni)); +- } +- break; +- +- case 203: +-#line 1512 "rcparse.y" +- { +- (yyval.vervar) = NULL; +- } +- break; +- +- case 204: +-#line 1516 "rcparse.y" +- { +- (yyval.vervar) = append_vertrans ((yyvsp[(1) - (3)].vervar), (yyvsp[(2) - (3)].il), (yyvsp[(3) - (3)].il)); +- } +- break; +- +- case 205: +-#line 1525 "rcparse.y" +- { +- (yyval.id).named = 0; +- (yyval.id).u.id = (yyvsp[(1) - (1)].il); +- } +- break; +- +- case 206: +-#line 1530 "rcparse.y" +- { +- res_unistring_to_id (&(yyval.id), (yyvsp[(1) - (1)].uni)); +- } +- break; +- +- case 207: +-#line 1539 "rcparse.y" +- { +- (yyval.uni) = (yyvsp[(1) - (1)].uni); +- } +- break; +- +- case 208: +-#line 1543 "rcparse.y" +- { +- unichar *h = NULL; +- unicode_from_ascii ((rc_uint_type *) NULL, &h, (yyvsp[(1) - (1)].s)); +- (yyval.uni) = h; +- } +- break; +- +- case 209: +-#line 1553 "rcparse.y" +- { +- (yyval.id).named = 0; +- (yyval.id).u.id = (yyvsp[(1) - (2)].il); +- } +- break; +- +- case 210: +-#line 1558 "rcparse.y" +- { +- res_unistring_to_id (&(yyval.id), (yyvsp[(1) - (1)].uni)); +- } +- break; +- +- case 211: +-#line 1562 "rcparse.y" +- { +- res_unistring_to_id (&(yyval.id), (yyvsp[(1) - (2)].uni)); +- } +- break; +- +- case 212: +-#line 1572 "rcparse.y" +- { +- memset (&(yyval.res_info), 0, sizeof (rc_res_res_info)); +- (yyval.res_info).language = language; +- /* FIXME: Is this the right default? */ +- (yyval.res_info).memflags = MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE; +- } +- break; +- +- case 213: +-#line 1579 "rcparse.y" +- { +- (yyval.res_info) = (yyvsp[(1) - (2)].res_info); +- (yyval.res_info).memflags |= (yyvsp[(2) - (2)].memflags).on; +- (yyval.res_info).memflags &=~ (yyvsp[(2) - (2)].memflags).off; +- } +- break; +- +- case 214: +-#line 1585 "rcparse.y" +- { +- (yyval.res_info) = (yyvsp[(1) - (3)].res_info); +- (yyval.res_info).characteristics = (yyvsp[(3) - (3)].il); +- } +- break; +- +- case 215: +-#line 1590 "rcparse.y" +- { +- (yyval.res_info) = (yyvsp[(1) - (4)].res_info); +- (yyval.res_info).language = (yyvsp[(3) - (4)].il) | ((yyvsp[(4) - (4)].il) << SUBLANG_SHIFT); +- } +- break; +- +- case 216: +-#line 1595 "rcparse.y" +- { +- (yyval.res_info) = (yyvsp[(1) - (3)].res_info); +- (yyval.res_info).version = (yyvsp[(3) - (3)].il); +- } +- break; +- +- case 217: +-#line 1605 "rcparse.y" +- { +- memset (&(yyval.res_info), 0, sizeof (rc_res_res_info)); +- (yyval.res_info).language = language; +- (yyval.res_info).memflags = MEMFLAG_MOVEABLE | MEMFLAG_DISCARDABLE; +- } +- break; +- +- case 218: +-#line 1611 "rcparse.y" +- { +- (yyval.res_info) = (yyvsp[(1) - (2)].res_info); +- (yyval.res_info).memflags |= (yyvsp[(2) - (2)].memflags).on; +- (yyval.res_info).memflags &=~ (yyvsp[(2) - (2)].memflags).off; +- } +- break; +- +- case 219: +-#line 1622 "rcparse.y" +- { +- memset (&(yyval.res_info), 0, sizeof (rc_res_res_info)); +- (yyval.res_info).language = language; +- (yyval.res_info).memflags = MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE; +- } +- break; +- +- case 220: +-#line 1628 "rcparse.y" +- { +- (yyval.res_info) = (yyvsp[(1) - (2)].res_info); +- (yyval.res_info).memflags |= (yyvsp[(2) - (2)].memflags).on; +- (yyval.res_info).memflags &=~ (yyvsp[(2) - (2)].memflags).off; +- } +- break; +- +- case 221: +-#line 1640 "rcparse.y" +- { +- (yyval.memflags).on = MEMFLAG_MOVEABLE; +- (yyval.memflags).off = 0; +- } +- break; +- +- case 222: +-#line 1645 "rcparse.y" +- { +- (yyval.memflags).on = 0; +- (yyval.memflags).off = MEMFLAG_MOVEABLE; +- } +- break; +- +- case 223: +-#line 1650 "rcparse.y" +- { +- (yyval.memflags).on = MEMFLAG_PURE; +- (yyval.memflags).off = 0; +- } +- break; +- +- case 224: +-#line 1655 "rcparse.y" +- { +- (yyval.memflags).on = 0; +- (yyval.memflags).off = MEMFLAG_PURE; +- } +- break; +- +- case 225: +-#line 1660 "rcparse.y" +- { +- (yyval.memflags).on = MEMFLAG_PRELOAD; +- (yyval.memflags).off = 0; +- } +- break; +- +- case 226: +-#line 1665 "rcparse.y" +- { +- (yyval.memflags).on = 0; +- (yyval.memflags).off = MEMFLAG_PRELOAD; +- } +- break; +- +- case 227: +-#line 1670 "rcparse.y" +- { +- (yyval.memflags).on = MEMFLAG_DISCARDABLE; +- (yyval.memflags).off = 0; +- } +- break; +- +- case 228: +-#line 1680 "rcparse.y" +- { +- (yyval.s) = (yyvsp[(1) - (1)].s); +- } +- break; +- +- case 229: +-#line 1684 "rcparse.y" +- { +- (yyval.s) = (yyvsp[(1) - (1)].s); +- } +- break; +- +- case 230: +-#line 1692 "rcparse.y" +- { +- (yyval.uni) = (yyvsp[(1) - (1)].uni); +- } +- break; +- +- case 231: +-#line 1697 "rcparse.y" +- { +- rc_uint_type l1 = unichar_len ((yyvsp[(1) - (2)].uni)); +- rc_uint_type l2 = unichar_len ((yyvsp[(2) - (2)].uni)); +- unichar *h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar)); +- if (l1 != 0) +- memcpy (h, (yyvsp[(1) - (2)].uni), l1 * sizeof (unichar)); +- if (l2 != 0) +- memcpy (h + l1, (yyvsp[(2) - (2)].uni), l2 * sizeof (unichar)); +- h[l1 + l2] = 0; +- (yyval.uni) = h; +- } +- break; +- +- case 232: +-#line 1712 "rcparse.y" +- { +- (yyval.uni) = unichar_dup ((yyvsp[(1) - (1)].uni)); +- } +- break; +- +- case 233: +-#line 1716 "rcparse.y" +- { +- unichar *h = NULL; +- unicode_from_ascii ((rc_uint_type *) NULL, &h, (yyvsp[(1) - (1)].s)); +- (yyval.uni) = h; +- } +- break; +- +- case 234: +-#line 1725 "rcparse.y" +- { +- (yyval.suni) = (yyvsp[(1) - (1)].suni); +- } +- break; +- +- case 235: +-#line 1729 "rcparse.y" +- { +- unichar *h = NULL; +- rc_uint_type l = 0; +- unicode_from_ascii_len (&l, &h, (yyvsp[(1) - (1)].ss).s, (yyvsp[(1) - (1)].ss).length); +- (yyval.suni).s = h; +- (yyval.suni).length = l; +- } +- break; +- +- case 236: +-#line 1741 "rcparse.y" +- { +- (yyval.suni) = (yyvsp[(1) - (1)].suni); +- } +- break; +- +- case 237: +-#line 1746 "rcparse.y" +- { +- rc_uint_type l1 = (yyvsp[(1) - (2)].suni).length; +- rc_uint_type l2 = (yyvsp[(2) - (2)].suni).length; +- unichar *h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar)); +- if (l1 != 0) +- memcpy (h, (yyvsp[(1) - (2)].suni).s, l1 * sizeof (unichar)); +- if (l2 != 0) +- memcpy (h + l1, (yyvsp[(2) - (2)].suni).s, l2 * sizeof (unichar)); +- h[l1 + l2] = 0; +- (yyval.suni).length = l1 + l2; +- (yyval.suni).s = h; +- } +- break; +- +- case 238: +-#line 1762 "rcparse.y" +- { +- (yyval.ss) = (yyvsp[(1) - (1)].ss); +- } +- break; +- +- case 239: +-#line 1766 "rcparse.y" +- { +- rc_uint_type l = (yyvsp[(1) - (2)].ss).length + (yyvsp[(2) - (2)].ss).length; +- char *h = (char *) res_alloc (l); +- memcpy (h, (yyvsp[(1) - (2)].ss).s, (yyvsp[(1) - (2)].ss).length); +- memcpy (h + (yyvsp[(1) - (2)].ss).length, (yyvsp[(2) - (2)].ss).s, (yyvsp[(2) - (2)].ss).length); +- (yyval.ss).s = h; +- (yyval.ss).length = l; +- } +- break; +- +- case 240: +-#line 1778 "rcparse.y" +- { +- (yyval.suni) = (yyvsp[(1) - (1)].suni); +- } +- break; +- +- case 241: +-#line 1782 "rcparse.y" +- { +- rc_uint_type l = (yyvsp[(1) - (2)].suni).length + (yyvsp[(2) - (2)].suni).length; +- unichar *h = (unichar *) res_alloc (l * sizeof (unichar)); +- memcpy (h, (yyvsp[(1) - (2)].suni).s, (yyvsp[(1) - (2)].suni).length * sizeof (unichar)); +- memcpy (h + (yyvsp[(1) - (2)].suni).length, (yyvsp[(2) - (2)].suni).s, (yyvsp[(2) - (2)].suni).length * sizeof (unichar)); +- (yyval.suni).s = h; +- (yyval.suni).length = l; +- } +- break; +- +- case 242: +-#line 1804 "rcparse.y" +- { +- style |= (yyvsp[(1) - (1)].il); +- } +- break; +- +- case 243: +-#line 1808 "rcparse.y" +- { +- style &=~ (yyvsp[(2) - (2)].il); +- } +- break; +- +- case 244: +-#line 1812 "rcparse.y" +- { +- style |= (yyvsp[(3) - (3)].il); +- } +- break; +- +- case 245: +-#line 1816 "rcparse.y" +- { +- style &=~ (yyvsp[(4) - (4)].il); +- } +- break; +- +- case 246: +-#line 1823 "rcparse.y" +- { +- (yyval.il) = (yyvsp[(1) - (1)].i).val; +- } +- break; +- +- case 247: +-#line 1827 "rcparse.y" +- { +- (yyval.il) = (yyvsp[(2) - (3)].il); +- } +- break; +- +- case 248: +-#line 1836 "rcparse.y" +- { +- (yyval.il) = 0; +- } +- break; +- +- case 249: +-#line 1840 "rcparse.y" +- { +- (yyval.il) = (yyvsp[(1) - (1)].il); +- } +- break; +- +- case 250: +-#line 1849 "rcparse.y" +- { +- (yyval.il) = (yyvsp[(2) - (2)].il); +- } +- break; +- +- case 251: +-#line 1858 "rcparse.y" +- { +- (yyval.il) = (yyvsp[(1) - (1)].i).val; +- } +- break; +- +- case 252: +-#line 1867 "rcparse.y" +- { +- (yyval.i) = (yyvsp[(1) - (1)].i); +- } +- break; +- +- case 253: +-#line 1871 "rcparse.y" +- { +- (yyval.i) = (yyvsp[(2) - (3)].i); +- } +- break; +- +- case 254: +-#line 1875 "rcparse.y" +- { +- (yyval.i).val = ~ (yyvsp[(2) - (2)].i).val; +- (yyval.i).dword = (yyvsp[(2) - (2)].i).dword; +- } +- break; +- +- case 255: +-#line 1880 "rcparse.y" +- { +- (yyval.i).val = - (yyvsp[(2) - (2)].i).val; +- (yyval.i).dword = (yyvsp[(2) - (2)].i).dword; +- } +- break; +- +- case 256: +-#line 1885 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val * (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 257: +-#line 1890 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val / (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 258: +-#line 1895 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val % (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 259: +-#line 1900 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val + (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 260: +-#line 1905 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val - (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 261: +-#line 1910 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val & (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 262: +-#line 1915 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val ^ (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 263: +-#line 1920 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val | (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 264: +-#line 1931 "rcparse.y" +- { +- (yyval.il) = (yyvsp[(2) - (2)].il); +- } +- break; +- +- case 265: +-#line 1940 "rcparse.y" +- { +- (yyval.il) = (yyvsp[(1) - (1)].i).val; +- } +- break; +- +- case 266: +-#line 1951 "rcparse.y" +- { +- (yyval.i) = (yyvsp[(1) - (1)].i); +- } +- break; +- +- case 267: +-#line 1955 "rcparse.y" +- { +- (yyval.i) = (yyvsp[(2) - (3)].i); +- } +- break; +- +- case 268: +-#line 1959 "rcparse.y" +- { +- (yyval.i).val = ~ (yyvsp[(2) - (2)].i).val; +- (yyval.i).dword = (yyvsp[(2) - (2)].i).dword; +- } +- break; +- +- case 269: +-#line 1964 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val * (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 270: +-#line 1969 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val / (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 271: +-#line 1974 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val % (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 272: +-#line 1979 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val + (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 273: +-#line 1984 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val - (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 274: +-#line 1989 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val & (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 275: +-#line 1994 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val ^ (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- case 276: +-#line 1999 "rcparse.y" +- { +- (yyval.i).val = (yyvsp[(1) - (3)].i).val | (yyvsp[(3) - (3)].i).val; +- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword; +- } +- break; +- +- +-/* Line 1267 of yacc.c. */ +-#line 4440 "rcparse.c" +- default: break; +- } +- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); +- +- YYPOPSTACK (yylen); +- yylen = 0; +- YY_STACK_PRINT (yyss, yyssp); +- +- *++yyvsp = yyval; +- +- +- /* 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 - YYNTOKENS] + *yyssp; +- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) +- yystate = yytable[yystate]; +- else +- yystate = yydefgoto[yyn - YYNTOKENS]; +- +- goto yynewstate; +- +- +-/*------------------------------------. +-| yyerrlab -- here on detecting error | +-`------------------------------------*/ +-yyerrlab: +- /* If not already recovering from an error, report this error. */ +- if (!yyerrstatus) +- { +- ++yynerrs; +-#if ! YYERROR_VERBOSE +- yyerror (YY_("syntax error")); +-#else +- { +- YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); +- if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) +- { +- YYSIZE_T yyalloc = 2 * yysize; +- if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) +- yyalloc = YYSTACK_ALLOC_MAXIMUM; +- if (yymsg != yymsgbuf) +- YYSTACK_FREE (yymsg); +- yymsg = (char *) YYSTACK_ALLOC (yyalloc); +- if (yymsg) +- yymsg_alloc = yyalloc; +- else +- { +- yymsg = yymsgbuf; +- yymsg_alloc = sizeof yymsgbuf; +- } +- } +- +- if (0 < yysize && yysize <= yymsg_alloc) +- { +- (void) yysyntax_error (yymsg, yystate, yychar); +- yyerror (yymsg); +- } +- else +- { +- yyerror (YY_("syntax error")); +- if (yysize != 0) +- goto yyexhaustedlab; +- } +- } +-#endif +- } +- +- +- +- if (yyerrstatus == 3) +- { +- /* If just tried and failed to reuse look-ahead token after an +- error, discard it. */ +- +- if (yychar <= YYEOF) +- { +- /* Return failure if at end of input. */ +- if (yychar == YYEOF) +- YYABORT; +- } +- else +- { +- yydestruct ("Error: discarding", +- yytoken, &yylval); +- yychar = YYEMPTY; +- } +- } +- +- /* Else will try to reuse look-ahead token after shifting the error +- token. */ +- goto yyerrlab1; +- +- +-/*---------------------------------------------------. +-| yyerrorlab -- error raised explicitly by YYERROR. | +-`---------------------------------------------------*/ +-yyerrorlab: +- +- /* Pacify compilers like GCC when the user code never invokes +- YYERROR and the label yyerrorlab therefore never appears in user +- code. */ +- if (/*CONSTCOND*/ 0) +- goto yyerrorlab; +- +- /* Do not reclaim the symbols of the rule which action triggered +- this YYERROR. */ +- YYPOPSTACK (yylen); +- yylen = 0; +- YY_STACK_PRINT (yyss, yyssp); +- yystate = *yyssp; +- goto yyerrlab1; +- +- +-/*-------------------------------------------------------------. +-| yyerrlab1 -- common code for both syntax error and YYERROR. | +-`-------------------------------------------------------------*/ +-yyerrlab1: +- yyerrstatus = 3; /* Each real token shifted decrements this. */ +- +- for (;;) +- { +- yyn = yypact[yystate]; +- if (yyn != YYPACT_NINF) +- { +- yyn += YYTERROR; +- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) +- { +- yyn = yytable[yyn]; +- if (0 < yyn) +- break; +- } +- } +- +- /* Pop the current state because it cannot handle the error token. */ +- if (yyssp == yyss) +- YYABORT; +- +- +- yydestruct ("Error: popping", +- yystos[yystate], yyvsp); +- YYPOPSTACK (1); +- yystate = *yyssp; +- YY_STACK_PRINT (yyss, yyssp); +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- *++yyvsp = yylval; +- +- +- /* Shift the error token. */ +- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); +- +- yystate = yyn; +- goto yynewstate; +- +- +-/*-------------------------------------. +-| yyacceptlab -- YYACCEPT comes here. | +-`-------------------------------------*/ +-yyacceptlab: +- yyresult = 0; +- goto yyreturn; +- +-/*-----------------------------------. +-| yyabortlab -- YYABORT comes here. | +-`-----------------------------------*/ +-yyabortlab: +- yyresult = 1; +- goto yyreturn; +- +-#ifndef yyoverflow +-/*-------------------------------------------------. +-| yyexhaustedlab -- memory exhaustion comes here. | +-`-------------------------------------------------*/ +-yyexhaustedlab: +- yyerror (YY_("memory exhausted")); +- yyresult = 2; +- /* Fall through. */ +-#endif +- +-yyreturn: +- if (yychar != YYEOF && yychar != YYEMPTY) +- yydestruct ("Cleanup: discarding lookahead", +- yytoken, &yylval); +- /* Do not reclaim the symbols of the rule which action triggered +- this YYABORT or YYACCEPT. */ +- YYPOPSTACK (yylen); +- YY_STACK_PRINT (yyss, yyssp); +- while (yyssp != yyss) +- { +- yydestruct ("Cleanup: popping", +- yystos[*yyssp], yyvsp); +- YYPOPSTACK (1); +- } +-#ifndef yyoverflow +- if (yyss != yyssa) +- YYSTACK_FREE (yyss); +-#endif +-#if YYERROR_VERBOSE +- if (yymsg != yymsgbuf) +- YYSTACK_FREE (yymsg); +-#endif +- /* Make sure YYID is used. */ +- return YYID (yyresult); +-} +- +- +-#line 2005 "rcparse.y" +- +- +-/* Set the language from the command line. */ +- +-void +-rcparse_set_language (int lang) +-{ +- language = lang; +-} +- +diff -Nur binutils-2.24.orig/binutils/rcparse.h binutils-2.24/binutils/rcparse.h +--- binutils-2.24.orig/binutils/rcparse.h 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/rcparse.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,298 +0,0 @@ +-/* A Bison parser, made by GNU Bison 2.3. */ +- +-/* Skeleton interface for Bison's Yacc-like parsers in C +- +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +- 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., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. */ +- +-/* As a special exception, you may create a larger work that contains +- part or all of the Bison parser skeleton and distribute that work +- under terms of your choice, so long as that work isn't itself a +- parser generator using the skeleton or a modified version thereof +- as a parser skeleton. Alternatively, if you modify or redistribute +- the parser skeleton itself, you may (at your option) remove this +- special exception, which will cause the skeleton and the resulting +- Bison output files to be licensed under the GNU General Public +- License without this special exception. +- +- This special exception was added by the Free Software Foundation in +- version 2.2 of Bison. */ +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- BEG = 258, +- END = 259, +- ACCELERATORS = 260, +- VIRTKEY = 261, +- ASCII = 262, +- NOINVERT = 263, +- SHIFT = 264, +- CONTROL = 265, +- ALT = 266, +- BITMAP = 267, +- CURSOR = 268, +- DIALOG = 269, +- DIALOGEX = 270, +- EXSTYLE = 271, +- CAPTION = 272, +- CLASS = 273, +- STYLE = 274, +- AUTO3STATE = 275, +- AUTOCHECKBOX = 276, +- AUTORADIOBUTTON = 277, +- CHECKBOX = 278, +- COMBOBOX = 279, +- CTEXT = 280, +- DEFPUSHBUTTON = 281, +- EDITTEXT = 282, +- GROUPBOX = 283, +- LISTBOX = 284, +- LTEXT = 285, +- PUSHBOX = 286, +- PUSHBUTTON = 287, +- RADIOBUTTON = 288, +- RTEXT = 289, +- SCROLLBAR = 290, +- STATE3 = 291, +- USERBUTTON = 292, +- BEDIT = 293, +- HEDIT = 294, +- IEDIT = 295, +- FONT = 296, +- ICON = 297, +- ANICURSOR = 298, +- ANIICON = 299, +- DLGINCLUDE = 300, +- DLGINIT = 301, +- FONTDIR = 302, +- HTML = 303, +- MANIFEST = 304, +- PLUGPLAY = 305, +- VXD = 306, +- TOOLBAR = 307, +- BUTTON = 308, +- LANGUAGE = 309, +- CHARACTERISTICS = 310, +- VERSIONK = 311, +- MENU = 312, +- MENUEX = 313, +- MENUITEM = 314, +- SEPARATOR = 315, +- POPUP = 316, +- CHECKED = 317, +- GRAYED = 318, +- HELP = 319, +- INACTIVE = 320, +- MENUBARBREAK = 321, +- MENUBREAK = 322, +- MESSAGETABLE = 323, +- RCDATA = 324, +- STRINGTABLE = 325, +- VERSIONINFO = 326, +- FILEVERSION = 327, +- PRODUCTVERSION = 328, +- FILEFLAGSMASK = 329, +- FILEFLAGS = 330, +- FILEOS = 331, +- FILETYPE = 332, +- FILESUBTYPE = 333, +- BLOCKSTRINGFILEINFO = 334, +- BLOCKVARFILEINFO = 335, +- VALUE = 336, +- BLOCK = 337, +- MOVEABLE = 338, +- FIXED = 339, +- PURE = 340, +- IMPURE = 341, +- PRELOAD = 342, +- LOADONCALL = 343, +- DISCARDABLE = 344, +- NOT = 345, +- QUOTEDUNISTRING = 346, +- QUOTEDSTRING = 347, +- STRING = 348, +- NUMBER = 349, +- SIZEDUNISTRING = 350, +- SIZEDSTRING = 351, +- IGNORED_TOKEN = 352, +- NEG = 353 +- }; +-#endif +-/* Tokens. */ +-#define BEG 258 +-#define END 259 +-#define ACCELERATORS 260 +-#define VIRTKEY 261 +-#define ASCII 262 +-#define NOINVERT 263 +-#define SHIFT 264 +-#define CONTROL 265 +-#define ALT 266 +-#define BITMAP 267 +-#define CURSOR 268 +-#define DIALOG 269 +-#define DIALOGEX 270 +-#define EXSTYLE 271 +-#define CAPTION 272 +-#define CLASS 273 +-#define STYLE 274 +-#define AUTO3STATE 275 +-#define AUTOCHECKBOX 276 +-#define AUTORADIOBUTTON 277 +-#define CHECKBOX 278 +-#define COMBOBOX 279 +-#define CTEXT 280 +-#define DEFPUSHBUTTON 281 +-#define EDITTEXT 282 +-#define GROUPBOX 283 +-#define LISTBOX 284 +-#define LTEXT 285 +-#define PUSHBOX 286 +-#define PUSHBUTTON 287 +-#define RADIOBUTTON 288 +-#define RTEXT 289 +-#define SCROLLBAR 290 +-#define STATE3 291 +-#define USERBUTTON 292 +-#define BEDIT 293 +-#define HEDIT 294 +-#define IEDIT 295 +-#define FONT 296 +-#define ICON 297 +-#define ANICURSOR 298 +-#define ANIICON 299 +-#define DLGINCLUDE 300 +-#define DLGINIT 301 +-#define FONTDIR 302 +-#define HTML 303 +-#define MANIFEST 304 +-#define PLUGPLAY 305 +-#define VXD 306 +-#define TOOLBAR 307 +-#define BUTTON 308 +-#define LANGUAGE 309 +-#define CHARACTERISTICS 310 +-#define VERSIONK 311 +-#define MENU 312 +-#define MENUEX 313 +-#define MENUITEM 314 +-#define SEPARATOR 315 +-#define POPUP 316 +-#define CHECKED 317 +-#define GRAYED 318 +-#define HELP 319 +-#define INACTIVE 320 +-#define MENUBARBREAK 321 +-#define MENUBREAK 322 +-#define MESSAGETABLE 323 +-#define RCDATA 324 +-#define STRINGTABLE 325 +-#define VERSIONINFO 326 +-#define FILEVERSION 327 +-#define PRODUCTVERSION 328 +-#define FILEFLAGSMASK 329 +-#define FILEFLAGS 330 +-#define FILEOS 331 +-#define FILETYPE 332 +-#define FILESUBTYPE 333 +-#define BLOCKSTRINGFILEINFO 334 +-#define BLOCKVARFILEINFO 335 +-#define VALUE 336 +-#define BLOCK 337 +-#define MOVEABLE 338 +-#define FIXED 339 +-#define PURE 340 +-#define IMPURE 341 +-#define PRELOAD 342 +-#define LOADONCALL 343 +-#define DISCARDABLE 344 +-#define NOT 345 +-#define QUOTEDUNISTRING 346 +-#define QUOTEDSTRING 347 +-#define STRING 348 +-#define NUMBER 349 +-#define SIZEDUNISTRING 350 +-#define SIZEDSTRING 351 +-#define IGNORED_TOKEN 352 +-#define NEG 353 +- +- +- +- +-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +-typedef union YYSTYPE +-#line 69 "rcparse.y" +-{ +- rc_accelerator acc; +- rc_accelerator *pacc; +- rc_dialog_control *dialog_control; +- rc_menuitem *menuitem; +- struct +- { +- rc_rcdata_item *first; +- rc_rcdata_item *last; +- } rcdata; +- rc_rcdata_item *rcdata_item; +- rc_fixed_versioninfo *fixver; +- rc_ver_info *verinfo; +- rc_ver_stringtable *verstringtable; +- rc_ver_stringinfo *verstring; +- rc_ver_varinfo *vervar; +- rc_toolbar_item *toobar_item; +- rc_res_id id; +- rc_res_res_info res_info; +- struct +- { +- rc_uint_type on; +- rc_uint_type off; +- } memflags; +- struct +- { +- rc_uint_type val; +- /* Nonzero if this number was explicitly specified as long. */ +- int dword; +- } i; +- rc_uint_type il; +- rc_uint_type is; +- const char *s; +- struct +- { +- rc_uint_type length; +- const char *s; +- } ss; +- unichar *uni; +- struct +- { +- rc_uint_type length; +- const unichar *s; +- } suni; +-} +-/* Line 1529 of yacc.c. */ +-#line 291 "rcparse.h" +- YYSTYPE; +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +-extern YYSTYPE yylval; +- +diff -Nur binutils-2.24.orig/binutils/readelf.c binutils-2.24/binutils/readelf.c +--- binutils-2.24.orig/binutils/readelf.c 2013-11-18 09:40:15.000000000 +0100 ++++ binutils-2.24/binutils/readelf.c 2016-04-10 20:30:46.000000000 +0200 +@@ -131,6 +131,7 @@ + #include "elf/moxie.h" + #include "elf/mt.h" + #include "elf/msp430.h" ++#include "elf/nds32.h" + #include "elf/nios2.h" + #include "elf/or32.h" + #include "elf/pj.h" +@@ -626,6 +627,7 @@ + case EM_MSP430: + case EM_MSP430_OLD: + case EM_MT: ++ case EM_NDS32: + case EM_NIOS32: + case EM_PPC64: + case EM_PPC: +@@ -1144,6 +1146,10 @@ + rtype = elf_msp430_reloc_type (type); + break; + ++ case EM_NDS32: ++ rtype = elf_nds32_reloc_type (type); ++ break; ++ + case EM_PPC: + rtype = elf_ppc_reloc_type (type); + break; +@@ -2307,6 +2313,215 @@ + strcat (buf,_(", ")); + } + ++static void ++decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size) ++{ ++ unsigned abi; ++ unsigned arch; ++ unsigned config; ++ unsigned version; ++ int has_fpu = 0; ++ int r = 0; ++ ++ static const char *ABI_STRINGS[] = { ++ [E_NDS_ABI_V0 >> EF_NDS_ABI_SHIFT] = "ABI v0", /* use r5 as return register; only used in N1213HC */ ++ [E_NDS_ABI_V1 >> EF_NDS_ABI_SHIFT] = "ABI v1", /* use r0 as return register */ ++ [E_NDS_ABI_V2 >> EF_NDS_ABI_SHIFT] = "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */ ++ [E_NDS_ABI_V2FP >> EF_NDS_ABI_SHIFT] = "ABI v2fp", /* for FPU */ ++ [E_NDS_ABI_AABI >> EF_NDS_ABI_SHIFT] = "AABI", ++ [E_NDS_ABI_V2FP_PLUS >> EF_NDS_ABI_SHIFT] = "ABI2 FP+" ++ }; ++ static const char *VER_STRINGS[] = { ++ [E_NDS32_ELF_VER_1_2 >> EF_NDS32_ELF_VERSION_SHIFT] = "Andes ELF V1.3 or older", ++ [E_NDS32_ELF_VER_1_3 >> EF_NDS32_ELF_VERSION_SHIFT] = "Andes ELF V1.3.1", ++ [E_NDS32_ELF_VER_1_4 >> EF_NDS32_ELF_VERSION_SHIFT] = "Andes ELF V1.4", ++ }; ++ static const char *ARCH_STRINGS[] = { ++ [E_NDS_ARCH_STAR_V1_0 >> EF_NDS_ARCH_SHIFT] = "Andes Star v1.0", ++ [E_NDS_ARCH_STAR_V2_0 >> EF_NDS_ARCH_SHIFT] = "Andes Star v2.0", ++ [E_NDS_ARCH_STAR_V3_0 >> EF_NDS_ARCH_SHIFT] = "Andes Star v3.0", ++ [E_NDS_ARCH_STAR_V3_M >> EF_NDS_ARCH_SHIFT] = "Andes Star v3.0m" ++ }; ++ ++ abi = EF_NDS_ABI & e_flags; ++ arch = EF_NDS_ARCH & e_flags; ++ config = EF_NDS_INST & e_flags; ++ version = EF_NDS32_ELF_VERSION & e_flags; ++ ++ memset (buf, 0, size); ++ ++ switch (abi) ++ { ++ case E_NDS_ABI_V0: ++ case E_NDS_ABI_V1: ++ case E_NDS_ABI_V2: ++ case E_NDS_ABI_V2FP: ++ case E_NDS_ABI_AABI: ++ case E_NDS_ABI_V2FP_PLUS: ++ /* In case there are holes in the array. */ ++ r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]); ++ break; ++ ++ default: ++ r += snprintf (buf + r, size - r, ", "); ++ break; ++ } ++ ++ switch (version) ++ { ++ case E_NDS32_ELF_VER_1_2: ++ case E_NDS32_ELF_VER_1_3: ++ case E_NDS32_ELF_VER_1_4: ++ r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]); ++ break; ++ ++ default: ++ r += snprintf (buf + r, size - r, ", "); ++ break; ++ } ++ ++ if (E_NDS_ABI_V0 == abi) ++ { ++ /* OLD ABI; only used in N1213HC, has performance extension 1 */ ++ r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1"); ++ if (arch == E_NDS_ARCH_STAR_V1_0) ++ r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */ ++ return; ++ } ++ ++ switch (arch) ++ { ++ case E_NDS_ARCH_STAR_V1_0: ++ case E_NDS_ARCH_STAR_V2_0: ++ case E_NDS_ARCH_STAR_V3_0: ++ case E_NDS_ARCH_STAR_V3_M: ++ r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]); ++ break; ++ ++ default: ++ r += snprintf (buf + r, size - r, ", "); ++ /* ARCH version determines how the e_flags are interpreted. ++ If it is unknown, we cannot proceed. */ ++ return; ++ } ++ ++ /* newer ABI; Now handle architecture specific flags. */ ++ if (arch == E_NDS_ARCH_STAR_V1_0) ++ { ++ if (config & E_NDS32_HAS_MFUSR_PC_INST) ++ r += snprintf (buf + r, size -r, ", MFUSR_PC"); ++ ++ if (!(config & E_NDS32_HAS_NO_MAC_INST)) ++ r += snprintf (buf + r, size -r, ", MAC"); ++ ++ if (config & E_NDS32_HAS_DIV_INST) ++ r += snprintf (buf + r, size -r, ", DIV"); ++ ++ if (config & E_NDS32_HAS_16BIT_INST) ++ r += snprintf (buf + r, size -r, ", 16b"); ++ } ++ else ++ { ++ if (config & E_NDS32_HAS_MFUSR_PC_INST) ++ { ++ if (version <= E_NDS32_ELF_VER_1_3) ++ r += snprintf (buf + r, size -r, ", [B8]"); ++ else ++ r += snprintf (buf + r, size -r, ", EX9"); ++ } ++ ++ if (config & E_NDS32_HAS_MAC_DX_INST) ++ r += snprintf (buf + r, size -r, ", MAC_DX"); ++ ++ if (config & E_NDS32_HAS_DIV_DX_INST) ++ r += snprintf (buf + r, size -r, ", DIV_DX"); ++ ++ if (config & E_NDS32_HAS_16BIT_INST) ++ { ++ if (version <= E_NDS32_ELF_VER_1_3) ++ r += snprintf (buf + r, size -r, ", 16b"); ++ else ++ r += snprintf (buf + r, size -r, ", IFC"); ++ } ++ } ++ ++ if (config & E_NDS32_HAS_EXT_INST) ++ r += snprintf (buf + r, size -r, ", PERF1"); ++ ++ if (config & E_NDS32_HAS_EXT2_INST) ++ r += snprintf (buf + r, size -r, ", PERF2"); ++ ++ if (config & E_NDS32_HAS_FPU_INST) ++ { ++ has_fpu = 1; ++ r += snprintf (buf + r, size -r, ", FPU_SP"); ++ } ++ ++ if (config & E_NDS32_HAS_FPU_DP_INST) ++ { ++ has_fpu = 1; ++ r += snprintf (buf + r, size -r, ", FPU_DP"); ++ } ++ ++ if (config & E_NDS32_HAS_FPU_MAC_INST) ++ { ++ has_fpu = 1; ++ r += snprintf (buf + r, size -r, ", FPU_MAC"); ++ } ++ ++ if (config & E_NDS32_HAS_DSP_INST) ++ { ++ r += snprintf (buf + r, size -r, ", DSP"); ++ } ++ ++ if (config & E_NDS32_HAS_ZOL) ++ { ++ r += snprintf (buf + r, size -r, ", ZOL"); ++ } ++ ++ if (has_fpu) ++ { ++ switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT) ++ { ++ case E_NDS32_FPU_REG_8SP_4DP: ++ r += snprintf (buf + r, size -r, ", FPU_REG:8/4"); ++ break; ++ case E_NDS32_FPU_REG_16SP_8DP: ++ r += snprintf (buf + r, size -r, ", FPU_REG:16/8"); ++ break; ++ case E_NDS32_FPU_REG_32SP_16DP: ++ r += snprintf (buf + r, size -r, ", FPU_REG:32/16"); ++ break; ++ case E_NDS32_FPU_REG_32SP_32DP: ++ r += snprintf (buf + r, size -r, ", FPU_REG:32/32"); ++ break; ++ } ++ } ++ ++ if (config & E_NDS32_HAS_AUDIO_INST) ++ r += snprintf (buf + r, size -r, ", AUDIO"); ++ ++ if (config & E_NDS32_HAS_STRING_INST) ++ r += snprintf (buf + r, size -r, ", STR"); ++ ++ if (config & E_NDS32_HAS_REDUCED_REGS) ++ r += snprintf (buf + r, size -r, ", 16REG"); ++ ++ if (config & E_NDS32_HAS_VIDEO_INST) ++ { ++ if (version <= E_NDS32_ELF_VER_1_3) ++ r += snprintf (buf + r, size -r, ", VIDEO"); ++ else ++ r += snprintf (buf + r, size -r, ", SATURATION"); ++ } ++ ++ if (config & E_NDS32_HAS_ENCRIPT_INST) ++ r += snprintf (buf + r, size -r, ", ENCRP"); ++ ++ if (config & E_NDS32_HAS_L2C_INST) ++ r += snprintf (buf + r, size -r, ", L2C"); ++} ++ + static char * + get_machine_flags (unsigned e_flags, unsigned e_machine) + { +@@ -2649,6 +2864,10 @@ + } + break; + ++ case EM_NDS32: ++ decode_NDS32_machine_flags (e_flags, buf, sizeof buf); ++ break; ++ + case EM_SH: + switch ((e_flags & EF_SH_MACH_MASK)) + { +@@ -4171,7 +4390,7 @@ + else + { + char fmt [32]; +- int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX); ++ int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1); + + if (ret >= (int) sizeof (fmt) || ret < 0) + error (_("Internal error: failed to create format string to display program interpreter\n")); +@@ -10257,6 +10476,8 @@ + return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */ + case EM_MT: + return reloc_type == 2; /* R_MT_32. */ ++ case EM_NDS32: ++ return reloc_type == 20; /* R_NDS32_RELA. */ + case EM_ALTERA_NIOS2: + return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */ + case EM_NIOS32: +@@ -10510,6 +10731,8 @@ + return reloc_type == 2; /* R_MSP430_ABS16. */ + case EM_MSP430_OLD: + return reloc_type == 5; /* R_MSP430_16_BYTE. */ ++ case EM_NDS32: ++ return reloc_type == 19; /* R_NDS32_RELA. */ + case EM_ALTERA_NIOS2: + return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */ + case EM_NIOS32: +@@ -10573,6 +10796,12 @@ + return reloc_type == 0; + case EM_AARCH64: + return reloc_type == 0 || reloc_type == 256; ++ case EM_NDS32: ++ return (reloc_type == 0 /* R_XTENSA_NONE. */ ++ || reloc_type == 204 /* R_NDS32_DIFF8. */ ++ || reloc_type == 205 /* R_NDS32_DIFF16. */ ++ || reloc_type == 206 /* R_NDS32_DIFF32. */ ++ || reloc_type == 207 /* R_NDS32_ULEB128. */); + case EM_XTENSA_OLD: + case EM_XTENSA: + return (reloc_type == 0 /* R_XTENSA_NONE. */ +@@ -12954,6 +13183,39 @@ + } + + static int ++process_nds32_specific (FILE * file) ++{ ++ Elf_Internal_Shdr *sect = NULL; ++ ++ sect = find_section (".nds32_e_flags"); ++ if (sect != NULL) ++ { ++ unsigned int *flag; ++ printf ("\nNDS32 elf flags section:\n"); ++ flag = get_data (NULL, file, sect->sh_offset, 1, ++ sect->sh_size, _("NDS32 elf flags section")); ++ ++ switch ((*flag) & 0x3) ++ { ++ case 0: ++ printf ("(VEC_SIZE):\tNo entry.\n"); ++ break; ++ case 1: ++ printf ("(VEC_SIZE):\t4 bytes\n"); ++ break; ++ case 2: ++ printf ("(VEC_SIZE):\t16 bytes\n"); ++ break; ++ case 3: ++ printf ("(VEC_SIZE):\treserved\n"); ++ break; ++ } ++ } ++ ++ return TRUE; ++} ++ ++static int + process_gnu_liblist (FILE * file) + { + Elf_Internal_Shdr * section; +@@ -13779,6 +14041,9 @@ + case EM_MIPS_RS3_LE: + return process_mips_specific (file); + break; ++ case EM_NDS32: ++ return process_nds32_specific (file); ++ break; + case EM_PPC: + return process_power_specific (file); + break; +diff -Nur binutils-2.24.orig/binutils/size.c binutils-2.24/binutils/size.c +--- binutils-2.24.orig/binutils/size.c 2013-11-04 16:33:37.000000000 +0100 ++++ binutils-2.24/binutils/size.c 2016-04-10 20:30:46.000000000 +0200 +@@ -436,6 +436,7 @@ + static bfd_size_type bsssize; + static bfd_size_type datasize; + static bfd_size_type textsize; ++static bfd_size_type rodata_size; + + static void + berkeley_sum (bfd *abfd ATTRIBUTE_UNUSED, sec_ptr sec, +@@ -449,6 +450,10 @@ + return; + + size = bfd_get_section_size (sec); ++ ++ if ((flags & SEC_DATA) != 0 && (flags & SEC_READONLY) != 0 && (flags & SEC_CODE) == 0) ++ rodata_size = rodata_size + size; ++ + if ((flags & SEC_CODE) != 0 || (flags & SEC_READONLY) != 0) + textsize += size; + else if ((flags & SEC_HAS_CONTENTS) != 0) +@@ -466,13 +471,15 @@ + bsssize = 0; + datasize = 0; + textsize = 0; ++ rodata_size = 0; + + bfd_map_over_sections (abfd, berkeley_sum, NULL); + + bsssize += common_size; + if (files_seen++ == 0) +- puts ((radix == octal) ? " text\t data\t bss\t oct\t hex\tfilename" : +- " text\t data\t bss\t dec\t hex\tfilename"); ++ puts ((radix == octal) ? ++ " text (code + rodata)\t data\t bss\t oct\t hex\tfilename" : ++ " text (code + rodata)\t data\t bss\t dec\t hex\tfilename"); + + total = textsize + datasize + bsssize; + +@@ -484,6 +491,11 @@ + } + + rprint_number (7, textsize); ++ printf (" ("); ++ rprint_number (4, (textsize - rodata_size)); ++ printf (" + "); ++ rprint_number (6, rodata_size); ++ printf (")"); + putchar ('\t'); + rprint_number (7, datasize); + putchar ('\t'); +diff -Nur binutils-2.24.orig/binutils/sysinfo.c binutils-2.24/binutils/sysinfo.c +--- binutils-2.24.orig/binutils/sysinfo.c 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/sysinfo.c 1970-01-01 01:00:00.000000000 +0100 +@@ -1,1962 +0,0 @@ +-/* A Bison parser, made by GNU Bison 2.3. */ +- +-/* Skeleton implementation for Bison's Yacc-like parsers in C +- +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +- 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., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. */ +- +-/* As a special exception, you may create a larger work that contains +- part or all of the Bison parser skeleton and distribute that work +- under terms of your choice, so long as that work isn't itself a +- parser generator using the skeleton or a modified version thereof +- as a parser skeleton. Alternatively, if you modify or redistribute +- the parser skeleton itself, you may (at your option) remove this +- special exception, which will cause the skeleton and the resulting +- Bison output files to be licensed under the GNU General Public +- License without this special exception. +- +- This special exception was added by the Free Software Foundation in +- version 2.2 of Bison. */ +- +-/* C LALR(1) parser skeleton written by Richard Stallman, by +- simplifying the original so-called "semantic" parser. */ +- +-/* All symbols defined below should begin with yy or YY, to avoid +- infringing on user name space. This should be done even for local +- variables, as they might otherwise be expanded by user macros. +- There are some unavoidable exceptions within include files to +- define necessary library symbols; they are noted "INFRINGES ON +- USER NAME SPACE" below. */ +- +-/* Identify Bison output. */ +-#define YYBISON 1 +- +-/* Bison version. */ +-#define YYBISON_VERSION "2.3" +- +-/* Skeleton name. */ +-#define YYSKELETON_NAME "yacc.c" +- +-/* Pure parsers. */ +-#define YYPURE 0 +- +-/* Using locations. */ +-#define YYLSP_NEEDED 0 +- +- +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- COND = 258, +- REPEAT = 259, +- TYPE = 260, +- NAME = 261, +- NUMBER = 262, +- UNIT = 263 +- }; +-#endif +-/* Tokens. */ +-#define COND 258 +-#define REPEAT 259 +-#define TYPE 260 +-#define NAME 261 +-#define NUMBER 262 +-#define UNIT 263 +- +- +- +- +-/* Copy the first part of user declarations. */ +-#line 21 "sysinfo.y" +- +-#include +-#include +- +-static char writecode; +-static char *it; +-static int code; +-static char * repeat; +-static char *oldrepeat; +-static char *name; +-static int rdepth; +-static char *names[] = {" ","[n]","[n][m]"}; +-static char *pnames[]= {"","*","**"}; +- +-static int yyerror (char *s); +-extern int yylex (void); +- +- +-/* Enabling traces. */ +-#ifndef YYDEBUG +-# define YYDEBUG 0 +-#endif +- +-/* Enabling verbose error messages. */ +-#ifdef YYERROR_VERBOSE +-# undef YYERROR_VERBOSE +-# define YYERROR_VERBOSE 1 +-#else +-# define YYERROR_VERBOSE 0 +-#endif +- +-/* Enabling the token table. */ +-#ifndef YYTOKEN_TABLE +-# define YYTOKEN_TABLE 0 +-#endif +- +-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +-typedef union YYSTYPE +-#line 40 "sysinfo.y" +-{ +- int i; +- char *s; +-} +-/* Line 193 of yacc.c. */ +-#line 135 "sysinfo.c" +- YYSTYPE; +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +- +- +-/* Copy the second part of user declarations. */ +- +- +-/* Line 216 of yacc.c. */ +-#line 148 "sysinfo.c" +- +-#ifdef short +-# undef short +-#endif +- +-#ifdef YYTYPE_UINT8 +-typedef YYTYPE_UINT8 yytype_uint8; +-#else +-typedef unsigned char yytype_uint8; +-#endif +- +-#ifdef YYTYPE_INT8 +-typedef YYTYPE_INT8 yytype_int8; +-#elif (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-typedef signed char yytype_int8; +-#else +-typedef short int yytype_int8; +-#endif +- +-#ifdef YYTYPE_UINT16 +-typedef YYTYPE_UINT16 yytype_uint16; +-#else +-typedef unsigned short int yytype_uint16; +-#endif +- +-#ifdef YYTYPE_INT16 +-typedef YYTYPE_INT16 yytype_int16; +-#else +-typedef short int yytype_int16; +-#endif +- +-#ifndef YYSIZE_T +-# ifdef __SIZE_TYPE__ +-# define YYSIZE_T __SIZE_TYPE__ +-# elif defined size_t +-# define YYSIZE_T size_t +-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYSIZE_T size_t +-# else +-# define YYSIZE_T unsigned int +-# endif +-#endif +- +-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) +- +-#ifndef YY_ +-# if defined YYENABLE_NLS && YYENABLE_NLS +-# if ENABLE_NLS +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YY_(msgid) dgettext ("bison-runtime", msgid) +-# endif +-# endif +-# ifndef YY_ +-# define YY_(msgid) msgid +-# endif +-#endif +- +-/* Suppress unused-variable warnings by "using" E. */ +-#if ! defined lint || defined __GNUC__ +-# define YYUSE(e) ((void) (e)) +-#else +-# define YYUSE(e) /* empty */ +-#endif +- +-/* Identity function, used to suppress warnings about constant conditions. */ +-#ifndef lint +-# define YYID(n) (n) +-#else +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static int +-YYID (int i) +-#else +-static int +-YYID (i) +- int i; +-#endif +-{ +- return i; +-} +-#endif +- +-#if ! defined yyoverflow || YYERROR_VERBOSE +- +-/* The parser invokes alloca or malloc; define the necessary symbols. */ +- +-# ifdef YYSTACK_USE_ALLOCA +-# if YYSTACK_USE_ALLOCA +-# ifdef __GNUC__ +-# define YYSTACK_ALLOC __builtin_alloca +-# elif defined __BUILTIN_VA_ARG_INCR +-# include /* INFRINGES ON USER NAME SPACE */ +-# elif defined _AIX +-# define YYSTACK_ALLOC __alloca +-# elif defined _MSC_VER +-# include /* INFRINGES ON USER NAME SPACE */ +-# define alloca _alloca +-# else +-# define YYSTACK_ALLOC alloca +-# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-# include /* INFRINGES ON USER NAME SPACE */ +-# ifndef _STDLIB_H +-# define _STDLIB_H 1 +-# endif +-# endif +-# endif +-# endif +-# endif +- +-# ifdef YYSTACK_ALLOC +- /* Pacify GCC's `empty if-body' warning. */ +-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +-# ifndef YYSTACK_ALLOC_MAXIMUM +- /* The OS might guarantee only one guard page at the bottom of the stack, +- and a page size can be as small as 4096 bytes. So we cannot safely +- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number +- to allow for a few compiler-allocated temporary stack slots. */ +-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +-# endif +-# else +-# define YYSTACK_ALLOC YYMALLOC +-# define YYSTACK_FREE YYFREE +-# ifndef YYSTACK_ALLOC_MAXIMUM +-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +-# endif +-# if (defined __cplusplus && ! defined _STDLIB_H \ +- && ! ((defined YYMALLOC || defined malloc) \ +- && (defined YYFREE || defined free))) +-# include /* INFRINGES ON USER NAME SPACE */ +-# ifndef _STDLIB_H +-# define _STDLIB_H 1 +-# endif +-# endif +-# ifndef YYMALLOC +-# define YYMALLOC malloc +-# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +-# endif +-# endif +-# ifndef YYFREE +-# define YYFREE free +-# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-void free (void *); /* INFRINGES ON USER NAME SPACE */ +-# endif +-# endif +-# endif +-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ +- +- +-#if (! defined yyoverflow \ +- && (! defined __cplusplus \ +- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) +- +-/* A type that is properly aligned for any stack member. */ +-union yyalloc +-{ +- yytype_int16 yyss; +- YYSTYPE yyvs; +- }; +- +-/* The size of the maximum gap between one aligned stack and the next. */ +-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +- +-/* The size of an array large to enough to hold all stacks, each with +- N elements. */ +-# define YYSTACK_BYTES(N) \ +- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ +- + YYSTACK_GAP_MAXIMUM) +- +-/* Copy COUNT objects from FROM to TO. The source and destination do +- not overlap. */ +-# ifndef YYCOPY +-# if defined __GNUC__ && 1 < __GNUC__ +-# define YYCOPY(To, From, Count) \ +- __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +-# else +-# define YYCOPY(To, From, Count) \ +- do \ +- { \ +- YYSIZE_T yyi; \ +- for (yyi = 0; yyi < (Count); yyi++) \ +- (To)[yyi] = (From)[yyi]; \ +- } \ +- while (YYID (0)) +-# endif +-# endif +- +-/* Relocate STACK from its old location to the new one. The +- local variables YYSIZE and YYSTACKSIZE give the old and new number of +- elements in the stack, and YYPTR gives the new location of the +- stack. Advance YYPTR to a properly aligned location for the next +- stack. */ +-# define YYSTACK_RELOCATE(Stack) \ +- do \ +- { \ +- YYSIZE_T yynewbytes; \ +- YYCOPY (&yyptr->Stack, Stack, yysize); \ +- Stack = &yyptr->Stack; \ +- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ +- yyptr += yynewbytes / sizeof (*yyptr); \ +- } \ +- while (YYID (0)) +- +-#endif +- +-/* YYFINAL -- State number of the termination state. */ +-#define YYFINAL 3 +-/* YYLAST -- Last index in YYTABLE. */ +-#define YYLAST 38 +- +-/* YYNTOKENS -- Number of terminals. */ +-#define YYNTOKENS 11 +-/* YYNNTS -- Number of nonterminals. */ +-#define YYNNTS 19 +-/* YYNRULES -- Number of rules. */ +-#define YYNRULES 27 +-/* YYNRULES -- Number of states. */ +-#define YYNSTATES 55 +- +-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +-#define YYUNDEFTOK 2 +-#define YYMAXUTOK 263 +- +-#define YYTRANSLATE(YYX) \ +- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) +- +-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +-static const yytype_uint8 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, 2, 2, 2, +- 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 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, +- 7, 8, 9, 10 +-}; +- +-#if YYDEBUG +-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in +- YYRHS. */ +-static const yytype_uint8 yyprhs[] = +-{ +- 0, 0, 3, 4, 7, 10, 11, 12, 19, 22, +- 25, 28, 29, 30, 37, 38, 45, 46, 57, 59, +- 60, 64, 67, 71, 72, 73, 77, 78 +-}; +- +-/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +-static const yytype_int8 yyrhs[] = +-{ +- 12, 0, -1, -1, 13, 14, -1, 15, 14, -1, +- -1, -1, 5, 8, 9, 16, 17, 6, -1, 22, +- 17, -1, 20, 17, -1, 18, 17, -1, -1, -1, +- 5, 4, 8, 19, 17, 6, -1, -1, 5, 3, +- 8, 21, 17, 6, -1, -1, 5, 25, 5, 24, +- 26, 6, 27, 23, 28, 6, -1, 7, -1, -1, +- 5, 8, 6, -1, 9, 10, -1, 5, 8, 6, +- -1, -1, -1, 5, 29, 6, -1, -1, 29, 5, +- 8, 8, 6, -1 +-}; +- +-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +-static const yytype_uint16 yyrline[] = +-{ +- 0, 54, 54, 54, 92, 93, 98, 97, 169, 170, +- 171, 172, 176, 175, 223, 222, 250, 249, 357, 358, +- 362, 367, 373, 374, 377, 378, 380, 382 +-}; +-#endif +- +-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +- First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +-static const char *const yytname[] = +-{ +- "$end", "error", "$undefined", "COND", "REPEAT", "'('", "')'", "TYPE", +- "NAME", "NUMBER", "UNIT", "$accept", "top", "@1", "it_list", "it", "@2", +- "it_field_list", "repeat_it_field", "@3", "cond_it_field", "@4", +- "it_field", "@5", "attr_type", "attr_desc", "attr_size", "attr_id", +- "enums", "enum_list", 0 +-}; +-#endif +- +-# ifdef YYPRINT +-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to +- token YYLEX-NUM. */ +-static const yytype_uint16 yytoknum[] = +-{ +- 0, 256, 257, 258, 259, 40, 41, 260, 261, 262, +- 263 +-}; +-# endif +- +-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +-static const yytype_uint8 yyr1[] = +-{ +- 0, 11, 13, 12, 14, 14, 16, 15, 17, 17, +- 17, 17, 19, 18, 21, 20, 23, 22, 24, 24, +- 25, 26, 27, 27, 28, 28, 29, 29 +-}; +- +-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +-static const yytype_uint8 yyr2[] = +-{ +- 0, 2, 0, 2, 2, 0, 0, 6, 2, 2, +- 2, 0, 0, 6, 0, 6, 0, 10, 1, 0, +- 3, 2, 3, 0, 0, 3, 0, 5 +-}; +- +-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state +- STATE-NUM when YYTABLE doesn't specify something else to do. Zero +- means the default is an error. */ +-static const yytype_uint8 yydefact[] = +-{ +- 2, 0, 5, 1, 0, 3, 5, 0, 4, 6, +- 11, 0, 0, 11, 11, 11, 0, 0, 0, 0, +- 7, 10, 9, 8, 14, 12, 0, 19, 11, 11, +- 20, 18, 0, 0, 0, 0, 0, 15, 13, 21, +- 23, 0, 16, 0, 24, 22, 26, 0, 0, 17, +- 0, 25, 0, 0, 27 +-}; +- +-/* YYDEFGOTO[NTERM-NUM]. */ +-static const yytype_int8 yydefgoto[] = +-{ +- -1, 1, 2, 5, 6, 10, 12, 13, 29, 14, +- 28, 15, 44, 32, 19, 36, 42, 47, 48 +-}; +- +-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing +- STATE-NUM. */ +-#define YYPACT_NINF -14 +-static const yytype_int8 yypact[] = +-{ +- -14, 8, 4, -14, 2, -14, 4, 3, -14, -14, +- 6, 0, 7, 6, 6, 6, 9, 10, 11, 15, +- -14, -14, -14, -14, -14, -14, 16, 14, 6, 6, +- -14, -14, 5, 17, 18, 19, 20, -14, -14, -14, +- 22, 23, -14, 24, 27, -14, -14, 28, 1, -14, +- 25, -14, 29, 30, -14 +-}; +- +-/* YYPGOTO[NTERM-NUM]. */ +-static const yytype_int8 yypgoto[] = +-{ +- -14, -14, -14, 32, -14, -14, -13, -14, -14, -14, +- -14, -14, -14, -14, -14, -14, -14, -14, -14 +-}; +- +-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If +- positive, shift that token. If negative, reduce the rule which +- number is the opposite. If zero, do what YYDEFACT says. +- If YYTABLE_NINF, syntax error. */ +-#define YYTABLE_NINF -1 +-static const yytype_uint8 yytable[] = +-{ +- 21, 22, 23, 16, 17, 18, 50, 51, 3, 4, +- 7, 11, 9, 20, 35, 33, 34, 24, 25, 26, +- 27, 31, 30, 37, 38, 0, 40, 41, 0, 39, +- 45, 43, 46, 52, 49, 0, 54, 53, 8 +-}; +- +-static const yytype_int8 yycheck[] = +-{ +- 13, 14, 15, 3, 4, 5, 5, 6, 0, 5, +- 8, 5, 9, 6, 9, 28, 29, 8, 8, 8, +- 5, 7, 6, 6, 6, -1, 6, 5, -1, 10, +- 6, 8, 5, 8, 6, -1, 6, 8, 6 +-}; +- +-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing +- symbol of state STATE-NUM. */ +-static const yytype_uint8 yystos[] = +-{ +- 0, 12, 13, 0, 5, 14, 15, 8, 14, 9, +- 16, 5, 17, 18, 20, 22, 3, 4, 5, 25, +- 6, 17, 17, 17, 8, 8, 8, 5, 21, 19, +- 6, 7, 24, 17, 17, 9, 26, 6, 6, 10, +- 6, 5, 27, 8, 23, 6, 5, 28, 29, 6, +- 5, 6, 8, 8, 6 +-}; +- +-#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 yyerrorlab +- +- +-/* 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); \ +- yytoken = YYTRANSLATE (yychar); \ +- YYPOPSTACK (1); \ +- goto yybackup; \ +- } \ +- else \ +- { \ +- yyerror (YY_("syntax error: cannot back up")); \ +- YYERROR; \ +- } \ +-while (YYID (0)) +- +- +-#define YYTERROR 1 +-#define YYERRCODE 256 +- +- +-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. +- If N is 0, then set CURRENT to the empty location which ends +- the previous symbol: RHS[0] (always defined). */ +- +-#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +-#ifndef YYLLOC_DEFAULT +-# define YYLLOC_DEFAULT(Current, Rhs, N) \ +- do \ +- if (YYID (N)) \ +- { \ +- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ +- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ +- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ +- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ +- } \ +- else \ +- { \ +- (Current).first_line = (Current).last_line = \ +- YYRHSLOC (Rhs, 0).last_line; \ +- (Current).first_column = (Current).last_column = \ +- YYRHSLOC (Rhs, 0).last_column; \ +- } \ +- while (YYID (0)) +-#endif +- +- +-/* YY_LOCATION_PRINT -- Print the location on the stream. +- This macro was not mandated originally: define only if we know +- we won't break user code: when these are the locations we know. */ +- +-#ifndef YY_LOCATION_PRINT +-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL +-# define YY_LOCATION_PRINT(File, Loc) \ +- fprintf (File, "%d.%d-%d.%d", \ +- (Loc).first_line, (Loc).first_column, \ +- (Loc).last_line, (Loc).last_column) +-# else +-# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +-# endif +-#endif +- +- +-/* YYLEX -- calling `yylex' with the right arguments. */ +- +-#ifdef YYLEX_PARAM +-# define YYLEX yylex (YYLEX_PARAM) +-#else +-# define YYLEX yylex () +-#endif +- +-/* Enable debugging if requested. */ +-#if YYDEBUG +- +-# ifndef YYFPRINTF +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYFPRINTF fprintf +-# endif +- +-# define YYDPRINTF(Args) \ +-do { \ +- if (yydebug) \ +- YYFPRINTF Args; \ +-} while (YYID (0)) +- +-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +-do { \ +- if (yydebug) \ +- { \ +- YYFPRINTF (stderr, "%s ", Title); \ +- yy_symbol_print (stderr, \ +- Type, Value); \ +- YYFPRINTF (stderr, "\n"); \ +- } \ +-} while (YYID (0)) +- +- +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-/*ARGSUSED*/ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +-#else +-static void +-yy_symbol_value_print (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE const * const yyvaluep; +-#endif +-{ +- if (!yyvaluep) +- return; +-# ifdef YYPRINT +- if (yytype < YYNTOKENS) +- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +-# else +- YYUSE (yyoutput); +-# endif +- switch (yytype) +- { +- default: +- break; +- } +-} +- +- +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +-#else +-static void +-yy_symbol_print (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE const * const yyvaluep; +-#endif +-{ +- if (yytype < YYNTOKENS) +- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +- else +- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); +- +- yy_symbol_value_print (yyoutput, yytype, yyvaluep); +- YYFPRINTF (yyoutput, ")"); +-} +- +-/*------------------------------------------------------------------. +-| yy_stack_print -- Print the state stack from its BOTTOM up to its | +-| TOP (included). | +-`------------------------------------------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +-#else +-static void +-yy_stack_print (bottom, top) +- yytype_int16 *bottom; +- yytype_int16 *top; +-#endif +-{ +- YYFPRINTF (stderr, "Stack now"); +- for (; bottom <= top; ++bottom) +- YYFPRINTF (stderr, " %d", *bottom); +- YYFPRINTF (stderr, "\n"); +-} +- +-# define YY_STACK_PRINT(Bottom, Top) \ +-do { \ +- if (yydebug) \ +- yy_stack_print ((Bottom), (Top)); \ +-} while (YYID (0)) +- +- +-/*------------------------------------------------. +-| Report that the YYRULE is going to be reduced. | +-`------------------------------------------------*/ +- +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +-#else +-static void +-yy_reduce_print (yyvsp, yyrule) +- YYSTYPE *yyvsp; +- int yyrule; +-#endif +-{ +- int yynrhs = yyr2[yyrule]; +- int yyi; +- unsigned long int yylno = yyrline[yyrule]; +- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", +- yyrule - 1, yylno); +- /* The symbols being reduced. */ +- for (yyi = 0; yyi < yynrhs; yyi++) +- { +- fprintf (stderr, " $%d = ", yyi + 1); +- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], +- &(yyvsp[(yyi + 1) - (yynrhs)]) +- ); +- fprintf (stderr, "\n"); +- } +-} +- +-# define YY_REDUCE_PRINT(Rule) \ +-do { \ +- if (yydebug) \ +- yy_reduce_print (yyvsp, Rule); \ +-} while (YYID (0)) +- +-/* Nonzero means print parse trace. It is left uninitialized so that +- multiple parsers can coexist. */ +-int yydebug; +-#else /* !YYDEBUG */ +-# define YYDPRINTF(Args) +-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +-# define YY_STACK_PRINT(Bottom, Top) +-# define YY_REDUCE_PRINT(Rule) +-#endif /* !YYDEBUG */ +- +- +-/* YYINITDEPTH -- initial size of the parser's stacks. */ +-#ifndef YYINITDEPTH +-# define YYINITDEPTH 200 +-#endif +- +-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only +- if the built-in stack extension method is used). +- +- Do not make this value too large; the results are undefined if +- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) +- evaluated with infinite-precision integer arithmetic. */ +- +-#ifndef YYMAXDEPTH +-# define YYMAXDEPTH 10000 +-#endif +- +- +- +-#if YYERROR_VERBOSE +- +-# ifndef yystrlen +-# if defined __GLIBC__ && defined _STRING_H +-# define yystrlen strlen +-# else +-/* Return the length of YYSTR. */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static YYSIZE_T +-yystrlen (const char *yystr) +-#else +-static YYSIZE_T +-yystrlen (yystr) +- const char *yystr; +-#endif +-{ +- YYSIZE_T yylen; +- for (yylen = 0; yystr[yylen]; yylen++) +- continue; +- return yylen; +-} +-# endif +-# endif +- +-# ifndef yystpcpy +-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +-# define yystpcpy stpcpy +-# else +-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in +- YYDEST. */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static char * +-yystpcpy (char *yydest, const char *yysrc) +-#else +-static char * +-yystpcpy (yydest, yysrc) +- char *yydest; +- const char *yysrc; +-#endif +-{ +- char *yyd = yydest; +- const char *yys = yysrc; +- +- while ((*yyd++ = *yys++) != '\0') +- continue; +- +- return yyd - 1; +-} +-# endif +-# endif +- +-# ifndef yytnamerr +-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary +- quotes and backslashes, so that it's suitable for yyerror. The +- heuristic is that double-quoting is unnecessary unless the string +- contains an apostrophe, a comma, or backslash (other than +- backslash-backslash). YYSTR is taken from yytname. If YYRES is +- null, do not copy; instead, return the length of what the result +- would have been. */ +-static YYSIZE_T +-yytnamerr (char *yyres, const char *yystr) +-{ +- if (*yystr == '"') +- { +- YYSIZE_T yyn = 0; +- char const *yyp = yystr; +- +- for (;;) +- switch (*++yyp) +- { +- case '\'': +- case ',': +- goto do_not_strip_quotes; +- +- case '\\': +- if (*++yyp != '\\') +- goto do_not_strip_quotes; +- /* Fall through. */ +- default: +- if (yyres) +- yyres[yyn] = *yyp; +- yyn++; +- break; +- +- case '"': +- if (yyres) +- yyres[yyn] = '\0'; +- return yyn; +- } +- do_not_strip_quotes: ; +- } +- +- if (! yyres) +- return yystrlen (yystr); +- +- return yystpcpy (yyres, yystr) - yyres; +-} +-# endif +- +-/* Copy into YYRESULT an error message about the unexpected token +- YYCHAR while in state YYSTATE. Return the number of bytes copied, +- including the terminating null byte. If YYRESULT is null, do not +- copy anything; just return the number of bytes that would be +- copied. As a special case, return 0 if an ordinary "syntax error" +- message will do. Return YYSIZE_MAXIMUM if overflow occurs during +- size calculation. */ +-static YYSIZE_T +-yysyntax_error (char *yyresult, int yystate, int yychar) +-{ +- int yyn = yypact[yystate]; +- +- if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) +- return 0; +- else +- { +- int yytype = YYTRANSLATE (yychar); +- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); +- YYSIZE_T yysize = yysize0; +- YYSIZE_T yysize1; +- int yysize_overflow = 0; +- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; +- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; +- int yyx; +- +-# if 0 +- /* This is so xgettext sees the translatable formats that are +- constructed on the fly. */ +- YY_("syntax error, unexpected %s"); +- YY_("syntax error, unexpected %s, expecting %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s or %s"); +- YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +-# endif +- char *yyfmt; +- char const *yyf; +- static char const yyunexpected[] = "syntax error, unexpected %s"; +- static char const yyexpecting[] = ", expecting %s"; +- static char const yyor[] = " or %s"; +- char yyformat[sizeof yyunexpected +- + sizeof yyexpecting - 1 +- + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) +- * (sizeof yyor - 1))]; +- char const *yyprefix = yyexpecting; +- +- /* Start YYX at -YYN if negative to avoid negative indexes in +- YYCHECK. */ +- int yyxbegin = yyn < 0 ? -yyn : 0; +- +- /* Stay within bounds of both yycheck and yytname. */ +- int yychecklim = YYLAST - yyn + 1; +- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; +- int yycount = 1; +- +- yyarg[0] = yytname[yytype]; +- yyfmt = yystpcpy (yyformat, yyunexpected); +- +- for (yyx = yyxbegin; yyx < yyxend; ++yyx) +- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) +- { +- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) +- { +- yycount = 1; +- yysize = yysize0; +- yyformat[sizeof yyunexpected - 1] = '\0'; +- break; +- } +- yyarg[yycount++] = yytname[yyx]; +- yysize1 = yysize + yytnamerr (0, yytname[yyx]); +- yysize_overflow |= (yysize1 < yysize); +- yysize = yysize1; +- yyfmt = yystpcpy (yyfmt, yyprefix); +- yyprefix = yyor; +- } +- +- yyf = YY_(yyformat); +- yysize1 = yysize + yystrlen (yyf); +- yysize_overflow |= (yysize1 < yysize); +- yysize = yysize1; +- +- if (yysize_overflow) +- return YYSIZE_MAXIMUM; +- +- if (yyresult) +- { +- /* Avoid sprintf, as that infringes on the user's name space. +- Don't have undefined behavior even if the translation +- produced a string with the wrong number of "%s"s. */ +- char *yyp = yyresult; +- int yyi = 0; +- while ((*yyp = *yyf) != '\0') +- { +- if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) +- { +- yyp += yytnamerr (yyp, yyarg[yyi++]); +- yyf += 2; +- } +- else +- { +- yyp++; +- yyf++; +- } +- } +- } +- return yysize; +- } +-} +-#endif /* YYERROR_VERBOSE */ +- +- +-/*-----------------------------------------------. +-| Release the memory associated to this symbol. | +-`-----------------------------------------------*/ +- +-/*ARGSUSED*/ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-static void +-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +-#else +-static void +-yydestruct (yymsg, yytype, yyvaluep) +- const char *yymsg; +- int yytype; +- YYSTYPE *yyvaluep; +-#endif +-{ +- YYUSE (yyvaluep); +- +- if (!yymsg) +- yymsg = "Deleting"; +- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); +- +- switch (yytype) +- { +- +- default: +- break; +- } +-} +- +- +-/* Prevent warnings from -Wmissing-prototypes. */ +- +-#ifdef YYPARSE_PARAM +-#if defined __STDC__ || defined __cplusplus +-int yyparse (void *YYPARSE_PARAM); +-#else +-int yyparse (); +-#endif +-#else /* ! YYPARSE_PARAM */ +-#if defined __STDC__ || defined __cplusplus +-int yyparse (void); +-#else +-int yyparse (); +-#endif +-#endif /* ! YYPARSE_PARAM */ +- +- +- +-/* The look-ahead symbol. */ +-int yychar; +- +-/* The semantic value of the look-ahead symbol. */ +-YYSTYPE yylval; +- +-/* Number of syntax errors so far. */ +-int yynerrs; +- +- +- +-/*----------. +-| yyparse. | +-`----------*/ +- +-#ifdef YYPARSE_PARAM +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-int +-yyparse (void *YYPARSE_PARAM) +-#else +-int +-yyparse (YYPARSE_PARAM) +- void *YYPARSE_PARAM; +-#endif +-#else /* ! YYPARSE_PARAM */ +-#if (defined __STDC__ || defined __C99__FUNC__ \ +- || defined __cplusplus || defined _MSC_VER) +-int +-yyparse (void) +-#else +-int +-yyparse () +- +-#endif +-#endif +-{ +- +- int yystate; +- int yyn; +- int yyresult; +- /* Number of tokens to shift before error messages enabled. */ +- int yyerrstatus; +- /* Look-ahead token as an internal (translated) token number. */ +- int yytoken = 0; +-#if YYERROR_VERBOSE +- /* Buffer for error messages, and its allocated size. */ +- char yymsgbuf[128]; +- char *yymsg = yymsgbuf; +- YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +-#endif +- +- /* Three stacks and their tools: +- `yyss': related to states, +- `yyvs': related to semantic values, +- `yyls': related to locations. +- +- Refer to the stacks thru separate pointers, to allow yyoverflow +- to reallocate them elsewhere. */ +- +- /* The state stack. */ +- yytype_int16 yyssa[YYINITDEPTH]; +- yytype_int16 *yyss = yyssa; +- yytype_int16 *yyssp; +- +- /* The semantic value stack. */ +- YYSTYPE yyvsa[YYINITDEPTH]; +- YYSTYPE *yyvs = yyvsa; +- YYSTYPE *yyvsp; +- +- +- +-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) +- +- YYSIZE_T yystacksize = YYINITDEPTH; +- +- /* The variables used to return semantic value and location from the +- action routines. */ +- YYSTYPE yyval; +- +- +- /* The number of symbols on the RHS of the reduced rule. +- Keep to zero when no symbol should be popped. */ +- int yylen = 0; +- +- YYDPRINTF ((stderr, "Starting parse\n")); +- +- 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; +- yyvsp = yyvs; +- +- goto yysetstate; +- +-/*------------------------------------------------------------. +-| yynewstate -- Push a new state, which is found in yystate. | +-`------------------------------------------------------------*/ +- yynewstate: +- /* In all cases, when you get here, the value and location stacks +- have just been pushed. So pushing a state here evens the stacks. */ +- yyssp++; +- +- yysetstate: +- *yyssp = yystate; +- +- if (yyss + yystacksize - 1 <= yyssp) +- { +- /* Get the current used size of the three stacks, in elements. */ +- YYSIZE_T yysize = yyssp - yyss + 1; +- +-#ifdef yyoverflow +- { +- /* Give user a chance to reallocate the stack. Use copies of +- these so that the &'s don't force the real ones into +- memory. */ +- YYSTYPE *yyvs1 = yyvs; +- yytype_int16 *yyss1 = yyss; +- +- +- /* Each stack pointer address is followed by the size of the +- data in use in that stack, in bytes. This used to be a +- conditional around just the two extra args, but that might +- be undefined if yyoverflow is a macro. */ +- yyoverflow (YY_("memory exhausted"), +- &yyss1, yysize * sizeof (*yyssp), +- &yyvs1, yysize * sizeof (*yyvsp), +- +- &yystacksize); +- +- yyss = yyss1; +- yyvs = yyvs1; +- } +-#else /* no yyoverflow */ +-# ifndef YYSTACK_RELOCATE +- goto yyexhaustedlab; +-# else +- /* Extend the stack our own way. */ +- if (YYMAXDEPTH <= yystacksize) +- goto yyexhaustedlab; +- yystacksize *= 2; +- if (YYMAXDEPTH < yystacksize) +- yystacksize = YYMAXDEPTH; +- +- { +- yytype_int16 *yyss1 = yyss; +- union yyalloc *yyptr = +- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); +- if (! yyptr) +- goto yyexhaustedlab; +- YYSTACK_RELOCATE (yyss); +- YYSTACK_RELOCATE (yyvs); +- +-# undef YYSTACK_RELOCATE +- if (yyss1 != yyssa) +- YYSTACK_FREE (yyss1); +- } +-# endif +-#endif /* no yyoverflow */ +- +- yyssp = yyss + yysize - 1; +- yyvsp = yyvs + yysize - 1; +- +- +- YYDPRINTF ((stderr, "Stack size increased to %lu\n", +- (unsigned long int) yystacksize)); +- +- if (yyss + yystacksize - 1 <= yyssp) +- YYABORT; +- } +- +- YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +- +- goto yybackup; +- +-/*-----------. +-| yybackup. | +-`-----------*/ +-yybackup: +- +- /* Do appropriate processing given the current state. Read a +- look-ahead token if we need one and don't already have one. */ +- +- /* First try to decide what to do without reference to look-ahead token. */ +- yyn = yypact[yystate]; +- if (yyn == YYPACT_NINF) +- goto yydefault; +- +- /* Not known => get a look-ahead token if don't already have one. */ +- +- /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ +- if (yychar == YYEMPTY) +- { +- YYDPRINTF ((stderr, "Reading a token: ")); +- yychar = YYLEX; +- } +- +- if (yychar <= YYEOF) +- { +- yychar = yytoken = YYEOF; +- YYDPRINTF ((stderr, "Now at end of input.\n")); +- } +- else +- { +- yytoken = YYTRANSLATE (yychar); +- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); +- } +- +- /* If the proper action on seeing token YYTOKEN is to reduce or to +- detect an error, take that action. */ +- yyn += yytoken; +- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) +- goto yydefault; +- yyn = yytable[yyn]; +- if (yyn <= 0) +- { +- if (yyn == 0 || yyn == YYTABLE_NINF) +- goto yyerrlab; +- yyn = -yyn; +- goto yyreduce; +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- /* Count tokens shifted since error; after three, turn off error +- status. */ +- if (yyerrstatus) +- yyerrstatus--; +- +- /* Shift the look-ahead token. */ +- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); +- +- /* Discard the shifted token unless it is eof. */ +- if (yychar != YYEOF) +- yychar = YYEMPTY; +- +- yystate = yyn; +- *++yyvsp = yylval; +- +- goto yynewstate; +- +- +-/*-----------------------------------------------------------. +-| yydefault -- do the default action for the current state. | +-`-----------------------------------------------------------*/ +-yydefault: +- yyn = yydefact[yystate]; +- if (yyn == 0) +- goto yyerrlab; +- goto yyreduce; +- +- +-/*-----------------------------. +-| yyreduce -- Do a reduction. | +-`-----------------------------*/ +-yyreduce: +- /* yyn is the number of a rule to reduce with. */ +- yylen = yyr2[yyn]; +- +- /* If YYLEN is nonzero, implement the default value of the action: +- `$$ = $1'. +- +- Otherwise, the following line sets YYVAL to garbage. +- This behavior is undocumented and Bison +- users should not rely upon it. Assigning to YYVAL +- unconditionally makes the parser a bit smaller, and it avoids a +- GCC warning that YYVAL may be used uninitialized. */ +- yyval = yyvsp[1-yylen]; +- +- +- YY_REDUCE_PRINT (yyn); +- switch (yyn) +- { +- case 2: +-#line 54 "sysinfo.y" +- { +- switch (writecode) +- { +- case 'i': +- printf("#ifdef SYSROFF_SWAP_IN\n"); +- break; +- case 'p': +- printf("#ifdef SYSROFF_p\n"); +- break; +- case 'd': +- break; +- case 'g': +- printf("#ifdef SYSROFF_SWAP_OUT\n"); +- break; +- case 'c': +- printf("#ifdef SYSROFF_PRINT\n"); +- printf("#include \n"); +- printf("#include \n"); +- printf("#include \n"); +- break; +- } +- } +- break; +- +- case 3: +-#line 76 "sysinfo.y" +- { +- switch (writecode) { +- case 'i': +- case 'p': +- case 'g': +- case 'c': +- printf("#endif\n"); +- break; +- case 'd': +- break; +- } +-} +- break; +- +- case 6: +-#line 98 "sysinfo.y" +- { +- it = (yyvsp[(2) - (3)].s); code = (yyvsp[(3) - (3)].i); +- switch (writecode) +- { +- case 'd': +- printf("\n\n\n#define IT_%s_CODE 0x%x\n", it,code); +- printf("struct IT_%s;\n", it); +- printf("extern void sysroff_swap_%s_in (struct IT_%s *);\n", +- (yyvsp[(2) - (3)].s), it); +- printf("extern void sysroff_swap_%s_out (FILE *, struct IT_%s *);\n", +- (yyvsp[(2) - (3)].s), it); +- printf("extern void sysroff_print_%s_out (struct IT_%s *);\n", +- (yyvsp[(2) - (3)].s), it); +- printf("struct IT_%s { \n", it); +- break; +- case 'i': +- printf("void sysroff_swap_%s_in (struct IT_%s * ptr)\n",(yyvsp[(2) - (3)].s),it); +- printf("{\n"); +- printf("\tunsigned char raw[255];\n"); +- printf("\tint idx = 0;\n"); +- printf("\tint size;\n"); +- printf("\tmemset(raw,0,255);\n"); +- printf("\tmemset(ptr,0,sizeof(*ptr));\n"); +- printf("\tsize = fillup(raw);\n"); +- break; +- case 'g': +- printf("void sysroff_swap_%s_out (FILE * ffile, struct IT_%s * ptr)\n",(yyvsp[(2) - (3)].s),it); +- printf("{\n"); +- printf("\tunsigned char raw[255];\n"); +- printf("\tint idx = 16;\n"); +- printf("\tmemset (raw, 0, 255);\n"); +- printf("\tcode = IT_%s_CODE;\n", it); +- break; +- case 'o': +- printf("void sysroff_swap_%s_out (bfd * abfd, struct IT_%s * ptr)\n",(yyvsp[(2) - (3)].s), it); +- printf("{\n"); +- printf("\tint idx = 0;\n"); +- break; +- case 'c': +- printf("void sysroff_print_%s_out (struct IT_%s *ptr)\n",(yyvsp[(2) - (3)].s),it); +- printf("{\n"); +- printf("itheader(\"%s\", IT_%s_CODE);\n",(yyvsp[(2) - (3)].s),(yyvsp[(2) - (3)].s)); +- break; +- +- case 't': +- break; +- } +- +- } +- break; +- +- case 7: +-#line 149 "sysinfo.y" +- { +- switch (writecode) { +- case 'd': +- printf("};\n"); +- break; +- case 'g': +- printf("\tchecksum(ffile,raw, idx, IT_%s_CODE);\n", it); +- +- case 'i': +- +- case 'o': +- case 'c': +- printf("}\n"); +- } +-} +- break; +- +- case 12: +-#line 176 "sysinfo.y" +- { +- rdepth++; +- switch (writecode) +- { +- case 'c': +- if (rdepth==1) +- printf("\tprintf(\"repeat %%d\\n\", %s);\n",(yyvsp[(3) - (3)].s)); +- if (rdepth==2) +- printf("\tprintf(\"repeat %%d\\n\", %s[n]);\n",(yyvsp[(3) - (3)].s)); +- case 'i': +- case 'g': +- case 'o': +- +- if (rdepth==1) +- { +- printf("\t{ int n; for (n = 0; n < %s; n++) {\n", (yyvsp[(3) - (3)].s)); +- } +- if (rdepth == 2) { +- printf("\t{ int m; for (m = 0; m < %s[n]; m++) {\n", (yyvsp[(3) - (3)].s)); +- } +- +- break; +- } +- +- oldrepeat = repeat; +- repeat = (yyvsp[(3) - (3)].s); +- } +- break; +- +- case 13: +-#line 206 "sysinfo.y" +- { +- repeat = oldrepeat; +- oldrepeat =0; +- rdepth--; +- switch (writecode) +- { +- case 'i': +- case 'g': +- case 'o': +- case 'c': +- printf("\t}}\n"); +- } +- } +- break; +- +- case 14: +-#line 223 "sysinfo.y" +- { +- switch (writecode) +- { +- case 'i': +- case 'g': +- case 'o': +- case 'c': +- printf("\tif (%s) {\n", (yyvsp[(3) - (3)].s)); +- break; +- } +- } +- break; +- +- case 15: +-#line 236 "sysinfo.y" +- { +- switch (writecode) +- { +- case 'i': +- case 'g': +- case 'o': +- case 'c': +- printf("\t}\n"); +- } +- } +- break; +- +- case 16: +-#line 250 "sysinfo.y" +- {name = (yyvsp[(7) - (7)].s); } +- break; +- +- case 17: +-#line 252 "sysinfo.y" +- { +- char *desc = (yyvsp[(2) - (10)].s); +- char *type = (yyvsp[(4) - (10)].s); +- int size = (yyvsp[(5) - (10)].i); +- char *id = (yyvsp[(7) - (10)].s); +-char *p = names[rdepth]; +-char *ptr = pnames[rdepth]; +- switch (writecode) +- { +- case 'g': +- if (size % 8) +- { +- +- printf("\twriteBITS(ptr->%s%s,raw,&idx,%d);\n", +- id, +- names[rdepth], size); +- +- } +- else { +- printf("\twrite%s(ptr->%s%s,raw,&idx,%d,ffile);\n", +- type, +- id, +- names[rdepth],size/8); +- } +- break; +- case 'i': +- { +- +- if (rdepth >= 1) +- +- { +- printf("if (!ptr->%s) ptr->%s = (%s*)xcalloc(%s, sizeof(ptr->%s[0]));\n", +- id, +- id, +- type, +- repeat, +- id); +- } +- +- if (rdepth == 2) +- { +- printf("if (!ptr->%s[n]) ptr->%s[n] = (%s**)xcalloc(%s[n], sizeof(ptr->%s[n][0]));\n", +- id, +- id, +- type, +- repeat, +- id); +- } +- +- } +- +- if (size % 8) +- { +- printf("\tptr->%s%s = getBITS(raw,&idx, %d,size);\n", +- id, +- names[rdepth], +- size); +- } +- else { +- printf("\tptr->%s%s = get%s(raw,&idx, %d,size);\n", +- id, +- names[rdepth], +- type, +- size/8); +- } +- break; +- case 'o': +- printf("\tput%s(raw,%d,%d,&idx,ptr->%s%s);\n", type,size/8,size%8,id,names[rdepth]); +- break; +- case 'd': +- if (repeat) +- printf("\t/* repeat %s */\n", repeat); +- +- if (type[0] == 'I') { +- printf("\tint %s%s; \t/* %s */\n",ptr,id, desc); +- } +- else if (type[0] =='C') { +- printf("\tchar %s*%s;\t /* %s */\n",ptr,id, desc); +- } +- else { +- printf("\tbarray %s%s;\t /* %s */\n",ptr,id, desc); +- } +- break; +- case 'c': +- printf("tabout();\n"); +- printf("\tprintf(\"/*%-30s*/ ptr->%s = \");\n", desc, id); +- +- if (type[0] == 'I') +- printf("\tprintf(\"%%d\\n\",ptr->%s%s);\n", id,p); +- else if (type[0] == 'C') +- printf("\tprintf(\"%%s\\n\",ptr->%s%s);\n", id,p); +- +- else if (type[0] == 'B') +- { +- printf("\tpbarray(&ptr->%s%s);\n", id,p); +- } +- else abort(); +- break; +- } +- } +- break; +- +- case 18: +-#line 357 "sysinfo.y" +- { (yyval.s) = (yyvsp[(1) - (1)].s); } +- break; +- +- case 19: +-#line 358 "sysinfo.y" +- { (yyval.s) = "INT";} +- break; +- +- case 20: +-#line 363 "sysinfo.y" +- { (yyval.s) = (yyvsp[(2) - (3)].s); } +- break; +- +- case 21: +-#line 368 "sysinfo.y" +- { (yyval.i) = (yyvsp[(1) - (2)].i) * (yyvsp[(2) - (2)].i); } +- break; +- +- case 22: +-#line 373 "sysinfo.y" +- { (yyval.s) = (yyvsp[(2) - (3)].s); } +- break; +- +- case 23: +-#line 374 "sysinfo.y" +- { (yyval.s) = "dummy";} +- break; +- +- case 27: +-#line 382 "sysinfo.y" +- { +- switch (writecode) +- { +- case 'd': +- printf("#define %s %s\n", (yyvsp[(3) - (5)].s),(yyvsp[(4) - (5)].s)); +- break; +- case 'c': +- printf("if (ptr->%s%s == %s) { tabout(); printf(\"%s\\n\");}\n", name, names[rdepth],(yyvsp[(4) - (5)].s),(yyvsp[(3) - (5)].s)); +- } +- } +- break; +- +- +-/* Line 1267 of yacc.c. */ +-#line 1715 "sysinfo.c" +- default: break; +- } +- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); +- +- YYPOPSTACK (yylen); +- yylen = 0; +- YY_STACK_PRINT (yyss, yyssp); +- +- *++yyvsp = yyval; +- +- +- /* 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 - YYNTOKENS] + *yyssp; +- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) +- yystate = yytable[yystate]; +- else +- yystate = yydefgoto[yyn - YYNTOKENS]; +- +- goto yynewstate; +- +- +-/*------------------------------------. +-| yyerrlab -- here on detecting error | +-`------------------------------------*/ +-yyerrlab: +- /* If not already recovering from an error, report this error. */ +- if (!yyerrstatus) +- { +- ++yynerrs; +-#if ! YYERROR_VERBOSE +- yyerror (YY_("syntax error")); +-#else +- { +- YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); +- if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) +- { +- YYSIZE_T yyalloc = 2 * yysize; +- if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) +- yyalloc = YYSTACK_ALLOC_MAXIMUM; +- if (yymsg != yymsgbuf) +- YYSTACK_FREE (yymsg); +- yymsg = (char *) YYSTACK_ALLOC (yyalloc); +- if (yymsg) +- yymsg_alloc = yyalloc; +- else +- { +- yymsg = yymsgbuf; +- yymsg_alloc = sizeof yymsgbuf; +- } +- } +- +- if (0 < yysize && yysize <= yymsg_alloc) +- { +- (void) yysyntax_error (yymsg, yystate, yychar); +- yyerror (yymsg); +- } +- else +- { +- yyerror (YY_("syntax error")); +- if (yysize != 0) +- goto yyexhaustedlab; +- } +- } +-#endif +- } +- +- +- +- if (yyerrstatus == 3) +- { +- /* If just tried and failed to reuse look-ahead token after an +- error, discard it. */ +- +- if (yychar <= YYEOF) +- { +- /* Return failure if at end of input. */ +- if (yychar == YYEOF) +- YYABORT; +- } +- else +- { +- yydestruct ("Error: discarding", +- yytoken, &yylval); +- yychar = YYEMPTY; +- } +- } +- +- /* Else will try to reuse look-ahead token after shifting the error +- token. */ +- goto yyerrlab1; +- +- +-/*---------------------------------------------------. +-| yyerrorlab -- error raised explicitly by YYERROR. | +-`---------------------------------------------------*/ +-yyerrorlab: +- +- /* Pacify compilers like GCC when the user code never invokes +- YYERROR and the label yyerrorlab therefore never appears in user +- code. */ +- if (/*CONSTCOND*/ 0) +- goto yyerrorlab; +- +- /* Do not reclaim the symbols of the rule which action triggered +- this YYERROR. */ +- YYPOPSTACK (yylen); +- yylen = 0; +- YY_STACK_PRINT (yyss, yyssp); +- yystate = *yyssp; +- goto yyerrlab1; +- +- +-/*-------------------------------------------------------------. +-| yyerrlab1 -- common code for both syntax error and YYERROR. | +-`-------------------------------------------------------------*/ +-yyerrlab1: +- yyerrstatus = 3; /* Each real token shifted decrements this. */ +- +- for (;;) +- { +- yyn = yypact[yystate]; +- if (yyn != YYPACT_NINF) +- { +- yyn += YYTERROR; +- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) +- { +- yyn = yytable[yyn]; +- if (0 < yyn) +- break; +- } +- } +- +- /* Pop the current state because it cannot handle the error token. */ +- if (yyssp == yyss) +- YYABORT; +- +- +- yydestruct ("Error: popping", +- yystos[yystate], yyvsp); +- YYPOPSTACK (1); +- yystate = *yyssp; +- YY_STACK_PRINT (yyss, yyssp); +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- *++yyvsp = yylval; +- +- +- /* Shift the error token. */ +- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); +- +- yystate = yyn; +- goto yynewstate; +- +- +-/*-------------------------------------. +-| yyacceptlab -- YYACCEPT comes here. | +-`-------------------------------------*/ +-yyacceptlab: +- yyresult = 0; +- goto yyreturn; +- +-/*-----------------------------------. +-| yyabortlab -- YYABORT comes here. | +-`-----------------------------------*/ +-yyabortlab: +- yyresult = 1; +- goto yyreturn; +- +-#ifndef yyoverflow +-/*-------------------------------------------------. +-| yyexhaustedlab -- memory exhaustion comes here. | +-`-------------------------------------------------*/ +-yyexhaustedlab: +- yyerror (YY_("memory exhausted")); +- yyresult = 2; +- /* Fall through. */ +-#endif +- +-yyreturn: +- if (yychar != YYEOF && yychar != YYEMPTY) +- yydestruct ("Cleanup: discarding lookahead", +- yytoken, &yylval); +- /* Do not reclaim the symbols of the rule which action triggered +- this YYABORT or YYACCEPT. */ +- YYPOPSTACK (yylen); +- YY_STACK_PRINT (yyss, yyssp); +- while (yyssp != yyss) +- { +- yydestruct ("Cleanup: popping", +- yystos[*yyssp], yyvsp); +- YYPOPSTACK (1); +- } +-#ifndef yyoverflow +- if (yyss != yyssa) +- YYSTACK_FREE (yyss); +-#endif +-#if YYERROR_VERBOSE +- if (yymsg != yymsgbuf) +- YYSTACK_FREE (yymsg); +-#endif +- /* Make sure YYID is used. */ +- return YYID (yyresult); +-} +- +- +-#line 397 "sysinfo.y" +- +-/* four modes +- +- -d write structure definitions for sysroff in host format +- -i write functions to swap into sysroff format in +- -o write functions to swap into sysroff format out +- -c write code to print info in human form */ +- +-int yydebug; +- +-int +-main (int ac, char **av) +-{ +- yydebug=0; +- if (ac > 1) +- writecode = av[1][1]; +-if (writecode == 'd') +- { +- printf("typedef struct { unsigned char *data; int len; } barray; \n"); +- printf("typedef int INT;\n"); +- printf("typedef char * CHARS;\n"); +- +- } +- yyparse(); +-return 0; +-} +- +-static int +-yyerror (char *s) +-{ +- fprintf(stderr, "%s\n" , s); +- return 0; +-} +- +diff -Nur binutils-2.24.orig/binutils/sysinfo.h binutils-2.24/binutils/sysinfo.h +--- binutils-2.24.orig/binutils/sysinfo.h 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/sysinfo.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,77 +0,0 @@ +-/* A Bison parser, made by GNU Bison 2.3. */ +- +-/* Skeleton interface for Bison's Yacc-like parsers in C +- +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +- 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., 51 Franklin Street, Fifth Floor, +- Boston, MA 02110-1301, USA. */ +- +-/* As a special exception, you may create a larger work that contains +- part or all of the Bison parser skeleton and distribute that work +- under terms of your choice, so long as that work isn't itself a +- parser generator using the skeleton or a modified version thereof +- as a parser skeleton. Alternatively, if you modify or redistribute +- the parser skeleton itself, you may (at your option) remove this +- special exception, which will cause the skeleton and the resulting +- Bison output files to be licensed under the GNU General Public +- License without this special exception. +- +- This special exception was added by the Free Software Foundation in +- version 2.2 of Bison. */ +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- COND = 258, +- REPEAT = 259, +- TYPE = 260, +- NAME = 261, +- NUMBER = 262, +- UNIT = 263 +- }; +-#endif +-/* Tokens. */ +-#define COND 258 +-#define REPEAT 259 +-#define TYPE 260 +-#define NAME 261 +-#define NUMBER 262 +-#define UNIT 263 +- +- +- +- +-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +-typedef union YYSTYPE +-#line 40 "sysinfo.y" +-{ +- int i; +- char *s; +-} +-/* Line 1529 of yacc.c. */ +-#line 70 "sysinfo.h" +- YYSTYPE; +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +-extern YYSTYPE yylval; +- +diff -Nur binutils-2.24.orig/binutils/syslex.c binutils-2.24/binutils/syslex.c +--- binutils-2.24.orig/binutils/syslex.c 2013-11-18 09:49:30.000000000 +0100 ++++ binutils-2.24/binutils/syslex.c 1970-01-01 01:00:00.000000000 +0100 +@@ -1,1906 +0,0 @@ +- +-#line 3 "syslex.c" +- +-#define YY_INT_ALIGNED short int +- +-/* A lexical scanner generated by flex */ +- +-#define FLEX_SCANNER +-#define YY_FLEX_MAJOR_VERSION 2 +-#define YY_FLEX_MINOR_VERSION 5 +-#define YY_FLEX_SUBMINOR_VERSION 35 +-#if YY_FLEX_SUBMINOR_VERSION > 0 +-#define FLEX_BETA +-#endif +- +-/* First, we deal with platform-specific or compiler-specific issues. */ +- +-/* begin standard C headers. */ +-#include +-#include +-#include +-#include +- +-/* end standard C headers. */ +- +-/* flex integer type definitions */ +- +-#ifndef FLEXINT_H +-#define FLEXINT_H +- +-/* C99 systems have . Non-C99 systems may or may not. */ +- +-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +- +-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, +- * if you want the limit (max/min) macros for int types. +- */ +-#ifndef __STDC_LIMIT_MACROS +-#define __STDC_LIMIT_MACROS 1 +-#endif +- +-#include +-typedef int8_t flex_int8_t; +-typedef uint8_t flex_uint8_t; +-typedef int16_t flex_int16_t; +-typedef uint16_t flex_uint16_t; +-typedef int32_t flex_int32_t; +-typedef uint32_t flex_uint32_t; +-typedef uint64_t flex_uint64_t; +-#else +-typedef signed char flex_int8_t; +-typedef short int flex_int16_t; +-typedef int flex_int32_t; +-typedef unsigned char flex_uint8_t; +-typedef unsigned short int flex_uint16_t; +-typedef unsigned int flex_uint32_t; +-#endif /* ! C99 */ +- +-/* Limits of integral types. */ +-#ifndef INT8_MIN +-#define INT8_MIN (-128) +-#endif +-#ifndef INT16_MIN +-#define INT16_MIN (-32767-1) +-#endif +-#ifndef INT32_MIN +-#define INT32_MIN (-2147483647-1) +-#endif +-#ifndef INT8_MAX +-#define INT8_MAX (127) +-#endif +-#ifndef INT16_MAX +-#define INT16_MAX (32767) +-#endif +-#ifndef INT32_MAX +-#define INT32_MAX (2147483647) +-#endif +-#ifndef UINT8_MAX +-#define UINT8_MAX (255U) +-#endif +-#ifndef UINT16_MAX +-#define UINT16_MAX (65535U) +-#endif +-#ifndef UINT32_MAX +-#define UINT32_MAX (4294967295U) +-#endif +- +-#endif /* ! FLEXINT_H */ +- +-#ifdef __cplusplus +- +-/* The "const" storage-class-modifier is valid. */ +-#define YY_USE_CONST +- +-#else /* ! __cplusplus */ +- +-/* C99 requires __STDC__ to be defined as 1. */ +-#if defined (__STDC__) +- +-#define YY_USE_CONST +- +-#endif /* defined (__STDC__) */ +-#endif /* ! __cplusplus */ +- +-#ifdef YY_USE_CONST +-#define yyconst const +-#else +-#define yyconst +-#endif +- +-/* Returned upon end-of-file. */ +-#define YY_NULL 0 +- +-/* Promotes a possibly negative, possibly signed char to an unsigned +- * integer for use as an array index. If the signed char is negative, +- * we want to instead treat it as an 8-bit unsigned char, hence the +- * double cast. +- */ +-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) +- +-/* Enter a start condition. This macro really ought to take a parameter, +- * but we do it the disgusting crufty way forced on us by the ()-less +- * definition of BEGIN. +- */ +-#define BEGIN (yy_start) = 1 + 2 * +- +-/* Translate the current start state into a value that can be later handed +- * to BEGIN to return to the state. The YYSTATE alias is for lex +- * compatibility. +- */ +-#define YY_START (((yy_start) - 1) / 2) +-#define YYSTATE YY_START +- +-/* Action number for EOF rule of a given start state. */ +-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +- +-/* Special action meaning "start processing a new file". */ +-#define YY_NEW_FILE yyrestart(yyin ) +- +-#define YY_END_OF_BUFFER_CHAR 0 +- +-/* Size of default input buffer. */ +-#ifndef YY_BUF_SIZE +-#define YY_BUF_SIZE 16384 +-#endif +- +-/* The state buf must be large enough to hold one state per character in the main buffer. +- */ +-#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) +- +-#ifndef YY_TYPEDEF_YY_BUFFER_STATE +-#define YY_TYPEDEF_YY_BUFFER_STATE +-typedef struct yy_buffer_state *YY_BUFFER_STATE; +-#endif +- +-#ifndef YY_TYPEDEF_YY_SIZE_T +-#define YY_TYPEDEF_YY_SIZE_T +-typedef size_t yy_size_t; +-#endif +- +-extern yy_size_t yyleng; +- +-extern FILE *yyin, *yyout; +- +-#define EOB_ACT_CONTINUE_SCAN 0 +-#define EOB_ACT_END_OF_FILE 1 +-#define EOB_ACT_LAST_MATCH 2 +- +- #define YY_LESS_LINENO(n) +- +-/* Return all but the first "n" matched characters back to the input stream. */ +-#define yyless(n) \ +- do \ +- { \ +- /* Undo effects of setting up yytext. */ \ +- int yyless_macro_arg = (n); \ +- YY_LESS_LINENO(yyless_macro_arg);\ +- *yy_cp = (yy_hold_char); \ +- YY_RESTORE_YY_MORE_OFFSET \ +- (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ +- YY_DO_BEFORE_ACTION; /* set up yytext again */ \ +- } \ +- while ( 0 ) +- +-#define unput(c) yyunput( c, (yytext_ptr) ) +- +-#ifndef YY_STRUCT_YY_BUFFER_STATE +-#define YY_STRUCT_YY_BUFFER_STATE +-struct yy_buffer_state +- { +- FILE *yy_input_file; +- +- char *yy_ch_buf; /* input buffer */ +- char *yy_buf_pos; /* current position in input buffer */ +- +- /* Size of input buffer in bytes, not including room for EOB +- * characters. +- */ +- yy_size_t yy_buf_size; +- +- /* Number of characters read into yy_ch_buf, not including EOB +- * characters. +- */ +- yy_size_t yy_n_chars; +- +- /* Whether we "own" the buffer - i.e., we know we created it, +- * and can realloc() it to grow it, and should free() it to +- * delete it. +- */ +- int yy_is_our_buffer; +- +- /* Whether this is an "interactive" input source; if so, and +- * if we're using stdio for input, then we want to use getc() +- * instead of fread(), to make sure we stop fetching input after +- * each newline. +- */ +- int yy_is_interactive; +- +- /* Whether we're considered to be at the beginning of a line. +- * If so, '^' rules will be active on the next match, otherwise +- * not. +- */ +- int yy_at_bol; +- +- int yy_bs_lineno; /**< The line count. */ +- int yy_bs_column; /**< The column count. */ +- +- /* Whether to try to fill the input buffer when we reach the +- * end of it. +- */ +- int yy_fill_buffer; +- +- int yy_buffer_status; +- +-#define YY_BUFFER_NEW 0 +-#define YY_BUFFER_NORMAL 1 +- /* When an EOF's been seen but there's still some text to process +- * then we mark the buffer as YY_EOF_PENDING, to indicate that we +- * shouldn't try reading from the input source any more. We might +- * still have a bunch of tokens to match, though, because of +- * possible backing-up. +- * +- * When we actually see the EOF, we change the status to "new" +- * (via yyrestart()), so that the user can continue scanning by +- * just pointing yyin at a new input file. +- */ +-#define YY_BUFFER_EOF_PENDING 2 +- +- }; +-#endif /* !YY_STRUCT_YY_BUFFER_STATE */ +- +-/* Stack of input buffers. */ +-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ +- +-/* We provide macros for accessing buffer states in case in the +- * future we want to put the buffer states in a more general +- * "scanner state". +- * +- * Returns the top of the stack, or NULL. +- */ +-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ +- ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ +- : NULL) +- +-/* Same as previous macro, but useful when we know that the buffer stack is not +- * NULL or when we need an lvalue. For internal use only. +- */ +-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] +- +-/* yy_hold_char holds the character lost when yytext is formed. */ +-static char yy_hold_char; +-static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ +-yy_size_t yyleng; +- +-/* Points to current character in buffer. */ +-static char *yy_c_buf_p = (char *) 0; +-static int yy_init = 0; /* whether we need to initialize */ +-static int yy_start = 0; /* start state number */ +- +-/* Flag which is used to allow yywrap()'s to do buffer switches +- * instead of setting up a fresh yyin. A bit of a hack ... +- */ +-static int yy_did_buffer_switch_on_eof; +- +-void yyrestart (FILE *input_file ); +-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +-void yy_delete_buffer (YY_BUFFER_STATE b ); +-void yy_flush_buffer (YY_BUFFER_STATE b ); +-void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +-void yypop_buffer_state (void ); +- +-static void yyensure_buffer_stack (void ); +-static void yy_load_buffer_state (void ); +-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); +- +-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) +- +-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); +- +-void *yyalloc (yy_size_t ); +-void *yyrealloc (void *,yy_size_t ); +-void yyfree (void * ); +- +-#define yy_new_buffer yy_create_buffer +- +-#define yy_set_interactive(is_interactive) \ +- { \ +- if ( ! YY_CURRENT_BUFFER ){ \ +- yyensure_buffer_stack (); \ +- YY_CURRENT_BUFFER_LVALUE = \ +- yy_create_buffer(yyin,YY_BUF_SIZE ); \ +- } \ +- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ +- } +- +-#define yy_set_bol(at_bol) \ +- { \ +- if ( ! YY_CURRENT_BUFFER ){\ +- yyensure_buffer_stack (); \ +- YY_CURRENT_BUFFER_LVALUE = \ +- yy_create_buffer(yyin,YY_BUF_SIZE ); \ +- } \ +- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ +- } +- +-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) +- +-typedef unsigned char YY_CHAR; +- +-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +- +-typedef int yy_state_type; +- +-extern int yylineno; +- +-int yylineno = 1; +- +-extern char *yytext; +-#define yytext_ptr yytext +- +-static yy_state_type yy_get_previous_state (void ); +-static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +-static int yy_get_next_buffer (void ); +-static void yy_fatal_error (yyconst char msg[] ); +- +-/* Done after the current pattern has been matched and before the +- * corresponding action - sets up yytext. +- */ +-#define YY_DO_BEFORE_ACTION \ +- (yytext_ptr) = yy_bp; \ +- yyleng = (yy_size_t) (yy_cp - yy_bp); \ +- (yy_hold_char) = *yy_cp; \ +- *yy_cp = '\0'; \ +- (yy_c_buf_p) = yy_cp; +- +-#define YY_NUM_RULES 25 +-#define YY_END_OF_BUFFER 26 +-/* This struct is not used in this scanner, +- but its presence is necessary. */ +-struct yy_trans_info +- { +- flex_int32_t yy_verify; +- flex_int32_t yy_nxt; +- }; +-static yyconst flex_int16_t yy_accept[81] = +- { 0, +- 0, 0, 26, 25, 7, 8, 5, 25, 1, 2, +- 11, 11, 6, 3, 4, 25, 25, 25, 25, 25, +- 25, 25, 0, 9, 11, 0, 6, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, +- 13, 0, 0, 0, 0, 16, 0, 0, 0, 0, +- 0, 12, 15, 0, 23, 0, 0, 0, 0, 0, +- 0, 14, 18, 0, 0, 0, 0, 0, 17, 0, +- 24, 0, 0, 0, 20, 22, 0, 21, 19, 0 +- } ; +- +-static yyconst flex_int32_t yy_ec[256] = +- { 0, +- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 4, 1, 5, 1, 1, 1, 1, 1, 6, +- 7, 1, 1, 1, 1, 1, 1, 8, 9, 9, +- 9, 9, 9, 9, 9, 9, 9, 1, 10, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 11, 1, 12, 1, 1, 1, 13, 14, 15, 16, +- +- 17, 18, 19, 20, 21, 1, 1, 22, 1, 23, +- 24, 25, 1, 26, 27, 28, 29, 30, 1, 31, +- 32, 33, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1 +- } ; +- +-static yyconst flex_int32_t yy_meta[34] = +- { 0, +- 1, 1, 2, 1, 1, 1, 1, 3, 3, 1, +- 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1 +- } ; +- +-static yyconst flex_int16_t yy_base[84] = +- { 0, +- 0, 0, 100, 101, 101, 101, 101, 94, 101, 101, +- 26, 28, 0, 101, 101, 82, 26, 18, 74, 79, +- 78, 81, 88, 101, 32, 0, 0, 76, 65, 62, +- 61, 75, 20, 59, 61, 66, 58, 0, 57, 56, +- 54, 63, 53, 62, 54, 101, 59, 48, 53, 46, +- 59, 101, 44, 43, 101, 41, 55, 46, 53, 44, +- 31, 101, 101, 39, 27, 21, 39, 19, 101, 35, +- 101, 33, 26, 29, 101, 101, 28, 101, 101, 101, +- 58, 61, 41 +- } ; +- +-static yyconst flex_int16_t yy_def[84] = +- { 0, +- 80, 1, 80, 80, 80, 80, 80, 81, 80, 80, +- 80, 80, 82, 80, 80, 80, 80, 80, 80, 80, +- 80, 80, 81, 80, 80, 83, 82, 80, 80, 80, +- 80, 80, 80, 80, 80, 80, 80, 83, 80, 80, +- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, +- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, +- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, +- 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, +- 80, 80, 80 +- } ; +- +-static yyconst flex_int16_t yy_nxt[135] = +- { 0, +- 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, +- 14, 15, 16, 17, 18, 4, 4, 4, 4, 4, +- 19, 4, 4, 4, 4, 20, 21, 4, 4, 22, +- 4, 4, 4, 25, 25, 25, 25, 32, 29, 25, +- 25, 33, 44, 38, 79, 78, 30, 77, 45, 76, +- 75, 74, 73, 72, 71, 70, 26, 31, 23, 23, +- 23, 27, 69, 27, 68, 67, 66, 65, 64, 63, +- 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, +- 52, 51, 50, 49, 48, 47, 46, 43, 42, 41, +- 40, 39, 24, 37, 36, 35, 34, 28, 24, 80, +- +- 3, 80, 80, 80, 80, 80, 80, 80, 80, 80, +- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, +- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, +- 80, 80, 80, 80 +- } ; +- +-static yyconst flex_int16_t yy_chk[135] = +- { 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, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 11, 11, 12, 12, 18, 17, 25, +- 25, 18, 33, 83, 77, 74, 17, 73, 33, 72, +- 70, 68, 67, 66, 65, 64, 11, 17, 81, 81, +- 81, 82, 61, 82, 60, 59, 58, 57, 56, 54, +- 53, 51, 50, 49, 48, 47, 45, 44, 43, 42, +- 41, 40, 39, 37, 36, 35, 34, 32, 31, 30, +- 29, 28, 23, 22, 21, 20, 19, 16, 8, 3, +- +- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, +- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, +- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, +- 80, 80, 80, 80 +- } ; +- +-static yy_state_type yy_last_accepting_state; +-static char *yy_last_accepting_cpos; +- +-extern int yy_flex_debug; +-int yy_flex_debug = 0; +- +-/* The intent behind this definition is that it'll catch +- * any uses of REJECT which flex missed. +- */ +-#define REJECT reject_used_but_not_detected +-#define yymore() yymore_used_but_not_detected +-#define YY_MORE_ADJ 0 +-#define YY_RESTORE_YY_MORE_OFFSET +-char *yytext; +-#line 1 "syslex.l" +-#define YY_NO_INPUT 1 +-#line 4 "syslex.l" +-/* Copyright 2001, 2003, 2005, 2007, 2011, 2012 Free Software Foundation, Inc. +- +- 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 3, or (at your option) +- any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with GLD; see the file COPYING. If not, write to the Free +- Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA +- 02110-1301, USA. */ +- +-/* Note: config.h is #included via syslex_wrap.c. */ +- +-#ifdef HAVE_STRING_H +-#include +-#else +-#ifdef HAVE_STRINGS_H +-#include +-#endif +-#endif +- +-#include "sysinfo.h" +- +-#ifndef YY_NO_UNPUT +-#define YY_NO_UNPUT +-#endif +- +-#ifndef yywrap +-static int yywrap (void) { return 1; } +-#endif +- +-extern int yylex (void); +-#line 544 "syslex.c" +- +-#define INITIAL 0 +- +-#ifndef YY_NO_UNISTD_H +-/* Special case for "unistd.h", since it is non-ANSI. We include it way +- * down here because we want the user's section 1 to have been scanned first. +- * The user has a chance to override it with an option. +- */ +-#include +-#endif +- +-#ifndef YY_EXTRA_TYPE +-#define YY_EXTRA_TYPE void * +-#endif +- +-static int yy_init_globals (void ); +- +-/* Accessor methods to globals. +- These are made visible to non-reentrant scanners for convenience. */ +- +-int yylex_destroy (void ); +- +-int yyget_debug (void ); +- +-void yyset_debug (int debug_flag ); +- +-YY_EXTRA_TYPE yyget_extra (void ); +- +-void yyset_extra (YY_EXTRA_TYPE user_defined ); +- +-FILE *yyget_in (void ); +- +-void yyset_in (FILE * in_str ); +- +-FILE *yyget_out (void ); +- +-void yyset_out (FILE * out_str ); +- +-yy_size_t yyget_leng (void ); +- +-char *yyget_text (void ); +- +-int yyget_lineno (void ); +- +-void yyset_lineno (int line_number ); +- +-/* Macros after this point can all be overridden by user definitions in +- * section 1. +- */ +- +-#ifndef YY_SKIP_YYWRAP +-#ifdef __cplusplus +-extern "C" int yywrap (void ); +-#else +-extern int yywrap (void ); +-#endif +-#endif +- +-#ifndef yytext_ptr +-static void yy_flex_strncpy (char *,yyconst char *,int ); +-#endif +- +-#ifdef YY_NEED_STRLEN +-static int yy_flex_strlen (yyconst char * ); +-#endif +- +-#ifndef YY_NO_INPUT +- +-#ifdef __cplusplus +-static int yyinput (void ); +-#else +-static int input (void ); +-#endif +- +-#endif +- +-/* Amount of stuff to slurp up with each read. */ +-#ifndef YY_READ_BUF_SIZE +-#define YY_READ_BUF_SIZE 8192 +-#endif +- +-/* Copy whatever the last rule matched to the standard output. */ +-#ifndef ECHO +-/* This used to be an fputs(), but since the string might contain NUL's, +- * we now use fwrite(). +- */ +-#define ECHO fwrite( yytext, yyleng, 1, yyout ) +-#endif +- +-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, +- * is returned in "result". +- */ +-#ifndef YY_INPUT +-#define YY_INPUT(buf,result,max_size) \ +- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ +- { \ +- int c = '*'; \ +- yy_size_t n; \ +- for ( n = 0; n < max_size && \ +- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ +- buf[n] = (char) c; \ +- if ( c == '\n' ) \ +- buf[n++] = (char) c; \ +- if ( c == EOF && ferror( yyin ) ) \ +- YY_FATAL_ERROR( "input in flex scanner failed" ); \ +- result = n; \ +- } \ +- else \ +- { \ +- errno=0; \ +- while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ +- { \ +- if( errno != EINTR) \ +- { \ +- YY_FATAL_ERROR( "input in flex scanner failed" ); \ +- break; \ +- } \ +- errno=0; \ +- clearerr(yyin); \ +- } \ +- }\ +-\ +- +-#endif +- +-/* No semi-colon after return; correct usage is to write "yyterminate();" - +- * we don't want an extra ';' after the "return" because that will cause +- * some compilers to complain about unreachable statements. +- */ +-#ifndef yyterminate +-#define yyterminate() return YY_NULL +-#endif +- +-/* Number of entries by which start-condition stack grows. */ +-#ifndef YY_START_STACK_INCR +-#define YY_START_STACK_INCR 25 +-#endif +- +-/* Report a fatal error. */ +-#ifndef YY_FATAL_ERROR +-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +-#endif +- +-/* end tables serialization structures and prototypes */ +- +-/* Default declaration of generated scanner - a define so the user can +- * easily add parameters. +- */ +-#ifndef YY_DECL +-#define YY_DECL_IS_OURS 1 +- +-extern int yylex (void); +- +-#define YY_DECL int yylex (void) +-#endif /* !YY_DECL */ +- +-/* Code executed at the beginning of each rule, after yytext and yyleng +- * have been set up. +- */ +-#ifndef YY_USER_ACTION +-#define YY_USER_ACTION +-#endif +- +-/* Code executed at the end of each rule. */ +-#ifndef YY_BREAK +-#define YY_BREAK break; +-#endif +- +-#define YY_RULE_SETUP \ +- YY_USER_ACTION +- +-/** The main scanner function which does all the work. +- */ +-YY_DECL +-{ +- register yy_state_type yy_current_state; +- register char *yy_cp, *yy_bp; +- register int yy_act; +- +-#line 45 "syslex.l" +- +-#line 726 "syslex.c" +- +- if ( !(yy_init) ) +- { +- (yy_init) = 1; +- +-#ifdef YY_USER_INIT +- YY_USER_INIT; +-#endif +- +- if ( ! (yy_start) ) +- (yy_start) = 1; /* first start state */ +- +- if ( ! yyin ) +- yyin = stdin; +- +- if ( ! yyout ) +- yyout = stdout; +- +- if ( ! YY_CURRENT_BUFFER ) { +- yyensure_buffer_stack (); +- YY_CURRENT_BUFFER_LVALUE = +- yy_create_buffer(yyin,YY_BUF_SIZE ); +- } +- +- yy_load_buffer_state( ); +- } +- +- while ( 1 ) /* loops until end-of-file is reached */ +- { +- yy_cp = (yy_c_buf_p); +- +- /* Support of yytext. */ +- *yy_cp = (yy_hold_char); +- +- /* yy_bp points to the position in yy_ch_buf of the start of +- * the current run. +- */ +- yy_bp = yy_cp; +- +- yy_current_state = (yy_start); +-yy_match: +- do +- { +- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; +- if ( yy_accept[yy_current_state] ) +- { +- (yy_last_accepting_state) = yy_current_state; +- (yy_last_accepting_cpos) = yy_cp; +- } +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 81 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- ++yy_cp; +- } +- while ( yy_base[yy_current_state] != 101 ); +- +-yy_find_action: +- yy_act = yy_accept[yy_current_state]; +- if ( yy_act == 0 ) +- { /* have to back up */ +- yy_cp = (yy_last_accepting_cpos); +- yy_current_state = (yy_last_accepting_state); +- yy_act = yy_accept[yy_current_state]; +- } +- +- YY_DO_BEFORE_ACTION; +- +-do_action: /* This label is used only to access EOF actions. */ +- +- switch ( yy_act ) +- { /* beginning of action switch */ +- case 0: /* must back up */ +- /* undo the effects of YY_DO_BEFORE_ACTION */ +- *yy_cp = (yy_hold_char); +- yy_cp = (yy_last_accepting_cpos); +- yy_current_state = (yy_last_accepting_state); +- goto yy_find_action; +- +-case 1: +-YY_RULE_SETUP +-#line 46 "syslex.l" +-{ return '(';} +- YY_BREAK +-case 2: +-YY_RULE_SETUP +-#line 47 "syslex.l" +-{ return ')';} +- YY_BREAK +-case 3: +-YY_RULE_SETUP +-#line 48 "syslex.l" +-{ return '[';} +- YY_BREAK +-case 4: +-YY_RULE_SETUP +-#line 49 "syslex.l" +-{ return ']';} +- YY_BREAK +-case 5: +-YY_RULE_SETUP +-#line 50 "syslex.l" +-{ ; } +- YY_BREAK +-case 6: +-YY_RULE_SETUP +-#line 51 "syslex.l" +-{ ; } +- YY_BREAK +-case 7: +-YY_RULE_SETUP +-#line 52 "syslex.l" +-{ ; } +- YY_BREAK +-case 8: +-/* rule 8 can match eol */ +-YY_RULE_SETUP +-#line 53 "syslex.l" +-{ ; } +- YY_BREAK +-case 9: +-/* rule 9 can match eol */ +-YY_RULE_SETUP +-#line 54 "syslex.l" +-{ +- yylval.s = malloc (yyleng - 1); +- memcpy (yylval.s, yytext + 1, yyleng - 2); +- yylval.s[yyleng - 2] = '\0'; +- return NAME; +- } +- YY_BREAK +-case 10: +-YY_RULE_SETUP +-#line 61 "syslex.l" +-{ +- yylval.i = strtol(yytext,0,16); +- return NUMBER; +- } +- YY_BREAK +-case 11: +-YY_RULE_SETUP +-#line 66 "syslex.l" +-{ +- yylval.i = atoi(yytext); +- return NUMBER; +- } +- YY_BREAK +-case 12: +-YY_RULE_SETUP +-#line 72 "syslex.l" +-{ yylval.i =1 ;return UNIT;} +- YY_BREAK +-case 13: +-YY_RULE_SETUP +-#line 73 "syslex.l" +-{ yylval.i = 1; return UNIT;} +- YY_BREAK +-case 14: +-YY_RULE_SETUP +-#line 74 "syslex.l" +-{ yylval.i= 8; return UNIT;} +- YY_BREAK +-case 15: +-YY_RULE_SETUP +-#line 75 "syslex.l" +-{ yylval.i = 8; return UNIT;} +- YY_BREAK +-case 16: +-YY_RULE_SETUP +-#line 77 "syslex.l" +-{ yylval.s = "INT"; return TYPE;} +- YY_BREAK +-case 17: +-YY_RULE_SETUP +-#line 78 "syslex.l" +-{ yylval.s = "BARRAY"; return TYPE;} +- YY_BREAK +-case 18: +-YY_RULE_SETUP +-#line 79 "syslex.l" +-{ yylval.s = "CHARS"; return TYPE;} +- YY_BREAK +-case 19: +-YY_RULE_SETUP +-#line 80 "syslex.l" +-{ yylval.i = 0; return NUMBER;} +- YY_BREAK +-case 20: +-YY_RULE_SETUP +-#line 81 "syslex.l" +-{ yylval.i = -4; return NUMBER;} +- YY_BREAK +-case 21: +-YY_RULE_SETUP +-#line 82 "syslex.l" +-{ yylval.i = -2; return NUMBER; } +- YY_BREAK +-case 22: +-YY_RULE_SETUP +-#line 83 "syslex.l" +-{ yylval.i = -1; return NUMBER; } +- YY_BREAK +-case 23: +-YY_RULE_SETUP +-#line 84 "syslex.l" +-{ return COND;} +- YY_BREAK +-case 24: +-YY_RULE_SETUP +-#line 85 "syslex.l" +-{ return REPEAT;} +- YY_BREAK +-case 25: +-YY_RULE_SETUP +-#line 86 "syslex.l" +-ECHO; +- YY_BREAK +-#line 947 "syslex.c" +-case YY_STATE_EOF(INITIAL): +- yyterminate(); +- +- case YY_END_OF_BUFFER: +- { +- /* Amount of text matched not including the EOB char. */ +- int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; +- +- /* Undo the effects of YY_DO_BEFORE_ACTION. */ +- *yy_cp = (yy_hold_char); +- YY_RESTORE_YY_MORE_OFFSET +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) +- { +- /* We're scanning a new file or input source. It's +- * possible that this happened because the user +- * just pointed yyin at a new source and called +- * yylex(). If so, then we have to assure +- * consistency between YY_CURRENT_BUFFER and our +- * globals. Here is the right place to do so, because +- * this is the first action (other than possibly a +- * back-up) that will match for the new input source. +- */ +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; +- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; +- } +- +- /* Note that here we test for yy_c_buf_p "<=" to the position +- * of the first EOB in the buffer, since yy_c_buf_p will +- * already have been incremented past the NUL character +- * (since all states make transitions on EOB to the +- * end-of-buffer state). Contrast this with the test +- * in input(). +- */ +- if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) +- { /* This was really a NUL. */ +- yy_state_type yy_next_state; +- +- (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; +- +- yy_current_state = yy_get_previous_state( ); +- +- /* Okay, we're now positioned to make the NUL +- * transition. We couldn't have +- * yy_get_previous_state() go ahead and do it +- * for us because it doesn't know how to deal +- * with the possibility of jamming (and we don't +- * want to build jamming into it because then it +- * will run more slowly). +- */ +- +- yy_next_state = yy_try_NUL_trans( yy_current_state ); +- +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- +- if ( yy_next_state ) +- { +- /* Consume the NUL. */ +- yy_cp = ++(yy_c_buf_p); +- yy_current_state = yy_next_state; +- goto yy_match; +- } +- +- else +- { +- yy_cp = (yy_c_buf_p); +- goto yy_find_action; +- } +- } +- +- else switch ( yy_get_next_buffer( ) ) +- { +- case EOB_ACT_END_OF_FILE: +- { +- (yy_did_buffer_switch_on_eof) = 0; +- +- if ( yywrap( ) ) +- { +- /* Note: because we've taken care in +- * yy_get_next_buffer() to have set up +- * yytext, we can now set up +- * yy_c_buf_p so that if some total +- * hoser (like flex itself) wants to +- * call the scanner after we return the +- * YY_NULL, it'll still work - another +- * YY_NULL will get returned. +- */ +- (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; +- +- yy_act = YY_STATE_EOF(YY_START); +- goto do_action; +- } +- +- else +- { +- if ( ! (yy_did_buffer_switch_on_eof) ) +- YY_NEW_FILE; +- } +- break; +- } +- +- case EOB_ACT_CONTINUE_SCAN: +- (yy_c_buf_p) = +- (yytext_ptr) + yy_amount_of_matched_text; +- +- yy_current_state = yy_get_previous_state( ); +- +- yy_cp = (yy_c_buf_p); +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- goto yy_match; +- +- case EOB_ACT_LAST_MATCH: +- (yy_c_buf_p) = +- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; +- +- yy_current_state = yy_get_previous_state( ); +- +- yy_cp = (yy_c_buf_p); +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- goto yy_find_action; +- } +- break; +- } +- +- default: +- YY_FATAL_ERROR( +- "fatal flex scanner internal error--no action found" ); +- } /* end of action switch */ +- } /* end of scanning one token */ +-} /* end of yylex */ +- +-/* yy_get_next_buffer - try to read in a new buffer +- * +- * Returns a code representing an action: +- * EOB_ACT_LAST_MATCH - +- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position +- * EOB_ACT_END_OF_FILE - end of file +- */ +-static int yy_get_next_buffer (void) +-{ +- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; +- register char *source = (yytext_ptr); +- register int number_to_move, i; +- int ret_val; +- +- if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) +- YY_FATAL_ERROR( +- "fatal flex scanner internal error--end of buffer missed" ); +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) +- { /* Don't try to fill the buffer, so this is an EOF. */ +- if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) +- { +- /* We matched a single character, the EOB, so +- * treat this as a final EOF. +- */ +- return EOB_ACT_END_OF_FILE; +- } +- +- else +- { +- /* We matched some text prior to the EOB, first +- * process it. +- */ +- return EOB_ACT_LAST_MATCH; +- } +- } +- +- /* Try to read more data. */ +- +- /* First move last chars to start of buffer. */ +- number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; +- +- for ( i = 0; i < number_to_move; ++i ) +- *(dest++) = *(source++); +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) +- /* don't do the read, it's not guaranteed to return an EOF, +- * just force an EOF +- */ +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; +- +- else +- { +- yy_size_t num_to_read = +- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; +- +- while ( num_to_read <= 0 ) +- { /* Not enough room in the buffer - grow it. */ +- +- /* just a shorter name for the current buffer */ +- YY_BUFFER_STATE b = YY_CURRENT_BUFFER; +- +- int yy_c_buf_p_offset = +- (int) ((yy_c_buf_p) - b->yy_ch_buf); +- +- if ( b->yy_is_our_buffer ) +- { +- yy_size_t new_size = b->yy_buf_size * 2; +- +- if ( new_size <= 0 ) +- b->yy_buf_size += b->yy_buf_size / 8; +- else +- b->yy_buf_size *= 2; +- +- b->yy_ch_buf = (char *) +- /* Include room in for 2 EOB chars. */ +- yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); +- } +- else +- /* Can't grow it, we don't own it. */ +- b->yy_ch_buf = 0; +- +- if ( ! b->yy_ch_buf ) +- YY_FATAL_ERROR( +- "fatal error - scanner input buffer overflow" ); +- +- (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; +- +- num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - +- number_to_move - 1; +- +- } +- +- if ( num_to_read > YY_READ_BUF_SIZE ) +- num_to_read = YY_READ_BUF_SIZE; +- +- /* Read in more data. */ +- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), +- (yy_n_chars), num_to_read ); +- +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- if ( (yy_n_chars) == 0 ) +- { +- if ( number_to_move == YY_MORE_ADJ ) +- { +- ret_val = EOB_ACT_END_OF_FILE; +- yyrestart(yyin ); +- } +- +- else +- { +- ret_val = EOB_ACT_LAST_MATCH; +- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = +- YY_BUFFER_EOF_PENDING; +- } +- } +- +- else +- ret_val = EOB_ACT_CONTINUE_SCAN; +- +- if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { +- /* Extend the array by 50%, plus the number we really need. */ +- yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); +- if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); +- } +- +- (yy_n_chars) += number_to_move; +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; +- +- (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; +- +- return ret_val; +-} +- +-/* yy_get_previous_state - get the state just before the EOB char was reached */ +- +- static yy_state_type yy_get_previous_state (void) +-{ +- register yy_state_type yy_current_state; +- register char *yy_cp; +- +- yy_current_state = (yy_start); +- +- for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) +- { +- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); +- if ( yy_accept[yy_current_state] ) +- { +- (yy_last_accepting_state) = yy_current_state; +- (yy_last_accepting_cpos) = yy_cp; +- } +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 81 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- } +- +- return yy_current_state; +-} +- +-/* yy_try_NUL_trans - try to make a transition on the NUL character +- * +- * synopsis +- * next_state = yy_try_NUL_trans( current_state ); +- */ +- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +-{ +- register int yy_is_jam; +- register char *yy_cp = (yy_c_buf_p); +- +- register YY_CHAR yy_c = 1; +- if ( yy_accept[yy_current_state] ) +- { +- (yy_last_accepting_state) = yy_current_state; +- (yy_last_accepting_cpos) = yy_cp; +- } +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 81 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- yy_is_jam = (yy_current_state == 80); +- +- return yy_is_jam ? 0 : yy_current_state; +-} +- +-#ifndef YY_NO_INPUT +-#ifdef __cplusplus +- static int yyinput (void) +-#else +- static int input (void) +-#endif +- +-{ +- int c; +- +- *(yy_c_buf_p) = (yy_hold_char); +- +- if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) +- { +- /* yy_c_buf_p now points to the character we want to return. +- * If this occurs *before* the EOB characters, then it's a +- * valid NUL; if not, then we've hit the end of the buffer. +- */ +- if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) +- /* This was really a NUL. */ +- *(yy_c_buf_p) = '\0'; +- +- else +- { /* need more input */ +- yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); +- ++(yy_c_buf_p); +- +- switch ( yy_get_next_buffer( ) ) +- { +- case EOB_ACT_LAST_MATCH: +- /* This happens because yy_g_n_b() +- * sees that we've accumulated a +- * token and flags that we need to +- * try matching the token before +- * proceeding. But for input(), +- * there's no matching to consider. +- * So convert the EOB_ACT_LAST_MATCH +- * to EOB_ACT_END_OF_FILE. +- */ +- +- /* Reset buffer status. */ +- yyrestart(yyin ); +- +- /*FALLTHROUGH*/ +- +- case EOB_ACT_END_OF_FILE: +- { +- if ( yywrap( ) ) +- return 0; +- +- if ( ! (yy_did_buffer_switch_on_eof) ) +- YY_NEW_FILE; +-#ifdef __cplusplus +- return yyinput(); +-#else +- return input(); +-#endif +- } +- +- case EOB_ACT_CONTINUE_SCAN: +- (yy_c_buf_p) = (yytext_ptr) + offset; +- break; +- } +- } +- } +- +- c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ +- *(yy_c_buf_p) = '\0'; /* preserve yytext */ +- (yy_hold_char) = *++(yy_c_buf_p); +- +- return c; +-} +-#endif /* ifndef YY_NO_INPUT */ +- +-/** Immediately switch to a different input stream. +- * @param input_file A readable stream. +- * +- * @note This function does not reset the start condition to @c INITIAL . +- */ +- void yyrestart (FILE * input_file ) +-{ +- +- if ( ! YY_CURRENT_BUFFER ){ +- yyensure_buffer_stack (); +- YY_CURRENT_BUFFER_LVALUE = +- yy_create_buffer(yyin,YY_BUF_SIZE ); +- } +- +- yy_init_buffer(YY_CURRENT_BUFFER,input_file ); +- yy_load_buffer_state( ); +-} +- +-/** Switch to a different input buffer. +- * @param new_buffer The new input buffer. +- * +- */ +- void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +-{ +- +- /* TODO. We should be able to replace this entire function body +- * with +- * yypop_buffer_state(); +- * yypush_buffer_state(new_buffer); +- */ +- yyensure_buffer_stack (); +- if ( YY_CURRENT_BUFFER == new_buffer ) +- return; +- +- if ( YY_CURRENT_BUFFER ) +- { +- /* Flush out information for old buffer. */ +- *(yy_c_buf_p) = (yy_hold_char); +- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- YY_CURRENT_BUFFER_LVALUE = new_buffer; +- yy_load_buffer_state( ); +- +- /* We don't actually know whether we did this switch during +- * EOF (yywrap()) processing, but the only time this flag +- * is looked at is after yywrap() is called, so it's safe +- * to go ahead and always set it. +- */ +- (yy_did_buffer_switch_on_eof) = 1; +-} +- +-static void yy_load_buffer_state (void) +-{ +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +- (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; +- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; +- (yy_hold_char) = *(yy_c_buf_p); +-} +- +-/** Allocate and initialize an input buffer state. +- * @param file A readable stream. +- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. +- * +- * @return the allocated buffer state. +- */ +- YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +-{ +- YY_BUFFER_STATE b; +- +- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); +- if ( ! b ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); +- +- b->yy_buf_size = size; +- +- /* yy_ch_buf has to be 2 characters longer than the size given because +- * we need to put in 2 end-of-buffer characters. +- */ +- b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); +- if ( ! b->yy_ch_buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); +- +- b->yy_is_our_buffer = 1; +- +- yy_init_buffer(b,file ); +- +- return b; +-} +- +-/** Destroy the buffer. +- * @param b a buffer created with yy_create_buffer() +- * +- */ +- void yy_delete_buffer (YY_BUFFER_STATE b ) +-{ +- +- if ( ! b ) +- return; +- +- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ +- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; +- +- if ( b->yy_is_our_buffer ) +- yyfree((void *) b->yy_ch_buf ); +- +- yyfree((void *) b ); +-} +- +-#ifndef __cplusplus +-extern int isatty (int ); +-#endif /* __cplusplus */ +- +-/* Initializes or reinitializes a buffer. +- * This function is sometimes called more than once on the same buffer, +- * such as during a yyrestart() or at EOF. +- */ +- static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) +- +-{ +- int oerrno = errno; +- +- yy_flush_buffer(b ); +- +- b->yy_input_file = file; +- b->yy_fill_buffer = 1; +- +- /* If b is the current buffer, then yy_init_buffer was _probably_ +- * called from yyrestart() or through yy_get_next_buffer. +- * In that case, we don't want to reset the lineno or column. +- */ +- if (b != YY_CURRENT_BUFFER){ +- b->yy_bs_lineno = 1; +- b->yy_bs_column = 0; +- } +- +- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +- +- errno = oerrno; +-} +- +-/** Discard all buffered characters. On the next scan, YY_INPUT will be called. +- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. +- * +- */ +- void yy_flush_buffer (YY_BUFFER_STATE b ) +-{ +- if ( ! b ) +- return; +- +- b->yy_n_chars = 0; +- +- /* We always need two end-of-buffer characters. The first causes +- * a transition to the end-of-buffer state. The second causes +- * a jam in that state. +- */ +- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; +- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; +- +- b->yy_buf_pos = &b->yy_ch_buf[0]; +- +- b->yy_at_bol = 1; +- b->yy_buffer_status = YY_BUFFER_NEW; +- +- if ( b == YY_CURRENT_BUFFER ) +- yy_load_buffer_state( ); +-} +- +-/** Pushes the new state onto the stack. The new state becomes +- * the current state. This function will allocate the stack +- * if necessary. +- * @param new_buffer The new state. +- * +- */ +-void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +-{ +- if (new_buffer == NULL) +- return; +- +- yyensure_buffer_stack(); +- +- /* This block is copied from yy_switch_to_buffer. */ +- if ( YY_CURRENT_BUFFER ) +- { +- /* Flush out information for old buffer. */ +- *(yy_c_buf_p) = (yy_hold_char); +- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- /* Only push if top exists. Otherwise, replace top. */ +- if (YY_CURRENT_BUFFER) +- (yy_buffer_stack_top)++; +- YY_CURRENT_BUFFER_LVALUE = new_buffer; +- +- /* copied from yy_switch_to_buffer. */ +- yy_load_buffer_state( ); +- (yy_did_buffer_switch_on_eof) = 1; +-} +- +-/** Removes and deletes the top of the stack, if present. +- * The next element becomes the new top. +- * +- */ +-void yypop_buffer_state (void) +-{ +- if (!YY_CURRENT_BUFFER) +- return; +- +- yy_delete_buffer(YY_CURRENT_BUFFER ); +- YY_CURRENT_BUFFER_LVALUE = NULL; +- if ((yy_buffer_stack_top) > 0) +- --(yy_buffer_stack_top); +- +- if (YY_CURRENT_BUFFER) { +- yy_load_buffer_state( ); +- (yy_did_buffer_switch_on_eof) = 1; +- } +-} +- +-/* Allocates the stack if it does not exist. +- * Guarantees space for at least one push. +- */ +-static void yyensure_buffer_stack (void) +-{ +- yy_size_t num_to_alloc; +- +- if (!(yy_buffer_stack)) { +- +- /* First allocation is just for 2 elements, since we don't know if this +- * scanner will even need a stack. We use 2 instead of 1 to avoid an +- * immediate realloc on the next call. +- */ +- num_to_alloc = 1; +- (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc +- (num_to_alloc * sizeof(struct yy_buffer_state*) +- ); +- if ( ! (yy_buffer_stack) ) +- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); +- +- memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); +- +- (yy_buffer_stack_max) = num_to_alloc; +- (yy_buffer_stack_top) = 0; +- return; +- } +- +- if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ +- +- /* Increase the buffer to prepare for a possible push. */ +- int grow_size = 8 /* arbitrary grow size */; +- +- num_to_alloc = (yy_buffer_stack_max) + grow_size; +- (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc +- ((yy_buffer_stack), +- num_to_alloc * sizeof(struct yy_buffer_state*) +- ); +- if ( ! (yy_buffer_stack) ) +- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); +- +- /* zero only the new slots.*/ +- memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); +- (yy_buffer_stack_max) = num_to_alloc; +- } +-} +- +-/** Setup the input buffer state to scan directly from a user-specified character buffer. +- * @param base the character buffer +- * @param size the size in bytes of the character buffer +- * +- * @return the newly allocated buffer state object. +- */ +-YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +-{ +- YY_BUFFER_STATE b; +- +- if ( size < 2 || +- base[size-2] != YY_END_OF_BUFFER_CHAR || +- base[size-1] != YY_END_OF_BUFFER_CHAR ) +- /* They forgot to leave room for the EOB's. */ +- return 0; +- +- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); +- if ( ! b ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); +- +- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ +- b->yy_buf_pos = b->yy_ch_buf = base; +- b->yy_is_our_buffer = 0; +- b->yy_input_file = 0; +- b->yy_n_chars = b->yy_buf_size; +- b->yy_is_interactive = 0; +- b->yy_at_bol = 1; +- b->yy_fill_buffer = 0; +- b->yy_buffer_status = YY_BUFFER_NEW; +- +- yy_switch_to_buffer(b ); +- +- return b; +-} +- +-/** Setup the input buffer state to scan a string. The next call to yylex() will +- * scan from a @e copy of @a str. +- * @param yystr a NUL-terminated string to scan +- * +- * @return the newly allocated buffer state object. +- * @note If you want to scan bytes that may contain NUL values, then use +- * yy_scan_bytes() instead. +- */ +-YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) +-{ +- +- return yy_scan_bytes(yystr,strlen(yystr) ); +-} +- +-/** Setup the input buffer state to scan the given bytes. The next call to yylex() will +- * scan from a @e copy of @a bytes. +- * @param bytes the byte buffer to scan +- * @param len the number of bytes in the buffer pointed to by @a bytes. +- * +- * @return the newly allocated buffer state object. +- */ +-YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) +-{ +- YY_BUFFER_STATE b; +- char *buf; +- yy_size_t n, i; +- +- /* Get memory for full buffer, including space for trailing EOB's. */ +- n = _yybytes_len + 2; +- buf = (char *) yyalloc(n ); +- if ( ! buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); +- +- for ( i = 0; i < _yybytes_len; ++i ) +- buf[i] = yybytes[i]; +- +- buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; +- +- b = yy_scan_buffer(buf,n ); +- if ( ! b ) +- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); +- +- /* It's okay to grow etc. this buffer, and we should throw it +- * away when we're done. +- */ +- b->yy_is_our_buffer = 1; +- +- return b; +-} +- +-#ifndef YY_EXIT_FAILURE +-#define YY_EXIT_FAILURE 2 +-#endif +- +-static void yy_fatal_error (yyconst char* msg ) +-{ +- (void) fprintf( stderr, "%s\n", msg ); +- exit( YY_EXIT_FAILURE ); +-} +- +-/* Redefine yyless() so it works in section 3 code. */ +- +-#undef yyless +-#define yyless(n) \ +- do \ +- { \ +- /* Undo effects of setting up yytext. */ \ +- int yyless_macro_arg = (n); \ +- YY_LESS_LINENO(yyless_macro_arg);\ +- yytext[yyleng] = (yy_hold_char); \ +- (yy_c_buf_p) = yytext + yyless_macro_arg; \ +- (yy_hold_char) = *(yy_c_buf_p); \ +- *(yy_c_buf_p) = '\0'; \ +- yyleng = yyless_macro_arg; \ +- } \ +- while ( 0 ) +- +-/* Accessor methods (get/set functions) to struct members. */ +- +-/** Get the current line number. +- * +- */ +-int yyget_lineno (void) +-{ +- +- return yylineno; +-} +- +-/** Get the input stream. +- * +- */ +-FILE *yyget_in (void) +-{ +- return yyin; +-} +- +-/** Get the output stream. +- * +- */ +-FILE *yyget_out (void) +-{ +- return yyout; +-} +- +-/** Get the length of the current token. +- * +- */ +-yy_size_t yyget_leng (void) +-{ +- return yyleng; +-} +- +-/** Get the current token. +- * +- */ +- +-char *yyget_text (void) +-{ +- return yytext; +-} +- +-/** Set the current line number. +- * @param line_number +- * +- */ +-void yyset_lineno (int line_number ) +-{ +- +- yylineno = line_number; +-} +- +-/** Set the input stream. This does not discard the current +- * input buffer. +- * @param in_str A readable stream. +- * +- * @see yy_switch_to_buffer +- */ +-void yyset_in (FILE * in_str ) +-{ +- yyin = in_str ; +-} +- +-void yyset_out (FILE * out_str ) +-{ +- yyout = out_str ; +-} +- +-int yyget_debug (void) +-{ +- return yy_flex_debug; +-} +- +-void yyset_debug (int bdebug ) +-{ +- yy_flex_debug = bdebug ; +-} +- +-static int yy_init_globals (void) +-{ +- /* Initialization is the same as for the non-reentrant scanner. +- * This function is called from yylex_destroy(), so don't allocate here. +- */ +- +- (yy_buffer_stack) = 0; +- (yy_buffer_stack_top) = 0; +- (yy_buffer_stack_max) = 0; +- (yy_c_buf_p) = (char *) 0; +- (yy_init) = 0; +- (yy_start) = 0; +- +-/* Defined in main.c */ +-#ifdef YY_STDINIT +- yyin = stdin; +- yyout = stdout; +-#else +- yyin = (FILE *) 0; +- yyout = (FILE *) 0; +-#endif +- +- /* For future reference: Set errno on error, since we are called by +- * yylex_init() +- */ +- return 0; +-} +- +-/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +-int yylex_destroy (void) +-{ +- +- /* Pop the buffer stack, destroying each element. */ +- while(YY_CURRENT_BUFFER){ +- yy_delete_buffer(YY_CURRENT_BUFFER ); +- YY_CURRENT_BUFFER_LVALUE = NULL; +- yypop_buffer_state(); +- } +- +- /* Destroy the stack itself. */ +- yyfree((yy_buffer_stack) ); +- (yy_buffer_stack) = NULL; +- +- /* Reset the globals. This is important in a non-reentrant scanner so the next time +- * yylex() is called, initialization will occur. */ +- yy_init_globals( ); +- +- return 0; +-} +- +-/* +- * Internal utility routines. +- */ +- +-#ifndef yytext_ptr +-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +-{ +- register int i; +- for ( i = 0; i < n; ++i ) +- s1[i] = s2[i]; +-} +-#endif +- +-#ifdef YY_NEED_STRLEN +-static int yy_flex_strlen (yyconst char * s ) +-{ +- register int n; +- for ( n = 0; s[n]; ++n ) +- ; +- +- return n; +-} +-#endif +- +-void *yyalloc (yy_size_t size ) +-{ +- return (void *) malloc( size ); +-} +- +-void *yyrealloc (void * ptr, yy_size_t size ) +-{ +- /* The cast to (char *) in the following accommodates both +- * implementations that use char* generic pointers, and those +- * that use void* generic pointers. It works with the latter +- * because both ANSI C and C++ allow castless assignment from +- * any pointer type to void*, and deal with argument conversions +- * as though doing an assignment. +- */ +- return (void *) realloc( (char *) ptr, size ); +-} +- +-void yyfree (void * ptr ) +-{ +- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +-} +- +-#define YYTABLES_NAME "yytables" +- +-#line 86 "syslex.l" +diff -Nur binutils-2.24.orig/cgen/AUTHORS binutils-2.24/cgen/AUTHORS +--- binutils-2.24.orig/cgen/AUTHORS 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-2.24/cgen/AUTHORS 2016-04-10 20:30:46.000000000 +0200 +@@ -0,0 +1,2 @@ ++CGEN was originally written by Doug Evans ++while at Cygnus. +diff -Nur binutils-2.24.orig/cgen/COPYING.CGEN binutils-2.24/cgen/COPYING.CGEN +--- binutils-2.24.orig/cgen/COPYING.CGEN 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-2.24/cgen/COPYING.CGEN 2016-04-10 20:30:46.000000000 +0200 +@@ -0,0 +1,44 @@ ++CGEN - a Cpu tools GENerator ++Copyright 2000 Red Hat, 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 software; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++02110-1301 USA ++ ++As a special exception, Red Hat gives unlimited permission to copy, ++distribute and modify the code that is the output of CGEN. You need ++not follow the terms of the GNU General Public License when using or ++distributing such code, even though portions of the text of CGEN ++appear in them. The GNU General Public License (GPL) does govern all ++other use of the material that constitutes the CGEN program. ++ ++Certain portions of the CGEN source text are designed to be copied (in ++certain cases, depending on the input) into the output of CGEN. We ++call these the "data" portions. CPU description files are, for the ++purposes of this copyright, deemed "data". The rest of the CGEN ++source text consists of comments plus executable code that decides ++which of the data portions to output in any given case. We call these ++comments and executable code the "non-data" portions. CGEN never ++copies any of the non-data portions into its output. ++ ++This special exception to the GPL applies to versions of CGEN released ++by Red Hat. When you make and distribute a modified version of CGEN, ++you may extend this special exception to the GPL to apply to your ++modified version as well, *unless* your modified version has the ++potential to copy into its output some of the text that was the ++non-data portion of the version that you started with. (In other ++words, unless your change moves or copies text from the non-data ++portions to the data portions.) If your modification has such ++potential, you must delete any notice of this special exception to the ++GPL from your modified version. +diff -Nur binutils-2.24.orig/cgen/ChangeLog binutils-2.24/cgen/ChangeLog +--- binutils-2.24.orig/cgen/ChangeLog 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-2.24/cgen/ChangeLog 2016-04-10 20:30:46.000000000 +0200 +@@ -0,0 +1,6422 @@ ++2006-02-17 Shrirang Khisti ++ Anil Paranjape ++ Shilin Shakti ++ ++ * cpu/xc16x.cpu: New file containing complete CGEN specific XC16X ++ CPU description. ++ * cpu/xc16x.opc: New file containing supporting XC16C routines. ++ ++2006-02-10 Nick Clifton ++ ++ * cpu/iq2000.opc (parse_hi16): Truncate shifted value to 16 bits. ++ ++2005-12-28 Nathan Sidwell ++ ++ * sid-cpu.scm (-gen-hw-stream-and-destream-fns): Stringize mode ++ for concatenation. ++ (-hw-gen-write-stack-decl): Likewise. ++ ++2005-12-05 Hans-Peter Nilsson ++ ++ * utils-sim.scm (-gen-decode-insn-entry): Correct last change for ++ non-(adata-integral-insn? CURRENT-ARCH) case. ++ ++2005-10-28 Dave Brolley ++ ++ Contribute the following changes: ++ 2005-09-19 Dave Brolley ++ ++ * attr.scm (gen-value-for-defn-raw): New methods. ++ (gen-value-for-defn): Don't test for 'SID-SIMULATOR. Call ++ gen-value-for-defn-raw. ++ * sid.scm (gen-obj-attr-sid-defn): Call gen-value-for-defn-raw. ++ ++ 2002-12-13 Dave Brolley ++ ++ * utils-cgen.scm (gen-attr-type): Moved from sid.scm. ++ (-gen-attr-accessors): New function. ++ (gen-obj-attr-defn): Update terminating initializer. ++ (gen-obj-attr-end-defn): New function. ++ * sid.scm (gen-attr-type): Moved to utils-cgen.scm. ++ * sid-cpu.scm (cgen-desc.h): Generate code to include ++ "opcode/cgen-bitset.h" ++ * intrinsics.scm (kept-insn-isas): Correct the extraction of the isa ++ name. ++ * desc.scm ('gen-defn): Update terminating initializer. ++ * desc-cpu.scm (gen-ifld-decls): Call -gen-attr-accessors. Update ++ terminatinig initializer. ++ (gen-hw-decls): Ditto. ++ (gen-operand-decls): Ditto. ++ (gen-insn-decls): Ditto. ++ (-gen-hash-defines): Generate code to include "opcde/cgen-bitset.h" ++ (gen-insn-table): Update terminating initializer. ++ (-gen-cpu-open): Update generation of @arch@_cgen_rebuild_tables, ++ @arch@_cgen_cpu_open, @arch@_cgen_cpu_close. ++ * attr.scm (charmask-bytes): New function. ++ (bitset-attr->charmask): New function. ++ (): Handle isa-attributes specially. Also handle ++ differences for SID-SIMULATOR. ++ (): Handle differences for SID-SIMULATOR. ++ (): Ditto. ++ ++2005-10-26 Kazuhiro Inaoka ++ ++ * cpu/m32r.opc (parse_hi16): Do not assume a 32-bit host word size. ++ ++2005-10-24 DJ Delorie ++ ++ * operand.scm (-anyof-merge-syntax): Print a more useful error ++ message. ++ ++2005-10-19 Nick Clifton ++ ++ * cpu/m32r.opc (parse_slo16): Fix bad application of previous ++ patch. ++ ++2005-10-18 Andreas Schwab ++ ++ * cpu/m32r.opc (parse_slo16): Better version of previous patch. ++ ++2005-10-14 Kazuhiro Inaoka ++ ++ * cpu/m32r.opc (parse_slo16): Do not assume a 32-bit host word ++ size. ++ ++2005-08-02 Dave Brolley ++ ++ * rtl-c.scm (s-unop): Don't dereference ++ CGEN_CPU_FPU (current_cpu)->ops->xxxxx in the generated code. ++ (s-binop, s-convop, s-cmpop): Likewise. ++ ++2005-07-29 Dave Brolley ++ ++ * sid-cpu.scm (-gen-scache-semantic-fn): Generate a declation of 'written' ++ if with-profile or with-parallel-write. ++ (cgen-semantics.cxx): Make the @prefix@ namespace available if with-parallel. ++ * operand.scm (op:new-mode): Convert (obj:name op) to a string for ++ string-append. ++ ++2005-07-15 Alan Modra ++ ++ * cpu/fr30.opc (print_register_list): Correct format strings. ++ * cpu/ip2k.opc: Likewise. ++ ++2005-07-05 Nick Clifton ++ ++ * cpu/iq2000.opc (parse_lo16, parse_mlo16): Make value parameter ++ unsigned in order to avoid compile time warnings about sign ++ conflicts. ++ ++2005-07-01 Nick Clifton ++ ++ * desc-cpu.scm: Update to ISO C90 function declaration style. ++ * opc-asmdis.scm: Likewise. ++ * opc-ibld.scm: Likewise. ++ * opc-itab.scm: Likewise. ++ * cpu/fr30.opc: Likewise. ++ * cpu/i960.opc: Likewise. ++ * cpu/ip2k.opc: Likewise. ++ * cpu/iq2000.opc: Likewise. ++ * cpu/m32r.opc: Likewise. ++ * cpu/openrisc.opc: Likewise. ++ * cpu/sh.opc: Likewise. ++ * cpu/sparc.opc: Likewise. ++ * cpu/xstormy16.opc: Likewise. ++ ++2005-06-15 Dave Brolley ++ ++ * sid-cpu.scm (-gen-hw-stream-and-destream-fns): New function. ++ (cgen-cpu.h): Call it. ++ ++ Contributed on behalf of Graydon Hoare ++ 2001-06-05 graydon hoare ++ ++ * utils.scm (foldl): Define. ++ (foldr): Define. ++ (filter): Define. ++ (union): Define. ++ (intersection): Simplify. ++ * sid.scm : Set APPLICATION to SID-SIMULATOR. ++ (-op-gen-delayed-set-maybe-trace): Define. ++ ( 'gen-set-{quiet,trace}): Delegate to ++ op-gen-delayed-set-quiet etc. Note: this is still a little tangled ++ up and needs cleaning. ++ (-with-parallel?): Hardwire with-parallel to #t. ++ ( 'cxmake-get): Replace with lookahead-aware code ++ * sid-decode.scm: Remove per-insn writeback fns. ++ (-gen-idesc-decls): Redefine sem_fn type. ++ * sid-cpu.scm (gen-write-stack-structure): Replace parexec stuff ++ with write stack stuff. ++ (cgen-write.cxx): Replace per-insn writebacks with single write ++ stack writeback. Add write stack reset function. ++ (-gen-scache-semantic-fn insn): Replace parexec stuff with write ++ stack stuff. ++ * rtl-c.scm (xop): Clone operand into delayed operand if #:delayed ++ estate attribute set. ++ (delay): Set #:delayed attribute to calculated delay, update ++ maximum delay of cpu, check (delay ...) usage. ++ * operand.scm (): Add delayed slot to . ++ * mach.scm (): Add max-delay slot to . ++ * dev.scm (load-sid): Set APPLICATION to SID-SIMULATOR. ++ * doc/rtl.texi (Expressions): Add section on (delay ...). ++ ++2005-06-13 Jim Blandy ++ ++ * pmacros.scm (-pmacro-upcase, -pmacro-downcase): Handle symbols ++ as well as strings. ++ ++2005-06-07 Zack Weinberg ++ ++ * doc/porting.texi: Change all mention of md_apply_fix3 and ++ gas_cgen_md_apply_fix3 to md_apply_fix and gas_cgen_md_apply_fix ++ respectively. ++ ++2005-05-18 Dave Brolley ++ ++ * utils-sim.scm (-gen-decode-default-entry): New function. ++ (-gen-decode-insn-entry): Now takes 'invalid-insn' argument. Generate ++ code to check that all opcodes bits match. ++ (-gen-decoder-switch): Use -gen-decode-default-entry. ++ ++2005-05-16 Jim Blandy ++ ++ * sid.scm (gen-ifetch): Require BITSIZE to be exactly the size ++ fetched by one of our GETIMEM* methods. ++ * utils-gen.scm (-extract-chunk-specs): Always fetch full ++ base-insn-sized chunks. ++ ++2005-05-10 Nick Clifton ++ ++ * Update the address and phone number of the FSF organization in ++ the GPL notices in the following files: ++ COPYING.CGEN, utils.scm, cpu/iq2000m.cpu, cpu/openrisc.cpu, ++ cpu/powerpc.cpu, slib/random.scm ++ ++2005-05-06 Jim Blandy ++ ++ * pprint.scm, cos-pprint.scm: Add documentation. ++ ++ * pprint.scm (pprint): Don't wipe out elide-table after each call. ++ ++ * pprint.scm, cos-pprint.scm: New files. ++ ++2005-04-04 Nick Clifton ++ ++ * opcodes.scm (-gen-parse-address): Initialise value to zero to ++ avoid a compile time warning. ++ ++2005-03-18 Nick Clifton ++ ++ * cpu/ip2k.opc (parse_lit8): Change wording of error message to ++ "percent-operand" from "%operand" as the latter confuses xgettext ++ into thinking that it is a C printf formating directive, which ++ prevents proper translation. ++ ++2005-02-23 Nick Clifton ++ ++ * opcodes.scm (gen-parse-number): Add a cast to the desired ++ pointer signed'ness in order to prevent compile time warnings. ++ * cpu/ip2k.opc: Fixed compile time warnings about differing ++ signed'ness of pointers passed to functions. ++ * cpu/iq2000.opc: Likewise. ++ * cpu/m32r.opc: Likewise. ++ * cpu/openrisc.opc: Likewise. ++ * cpu/xstormy16.opc: Likewise. ++ ++2005-02-22 Alan Modra ++ ++ * desc-cpu.scm (gen-ifld-decls): Move cgen_ifld_table from here.. ++ (cgen-desc.h): ..to here, after opcode/cgen.h include. ++ ++2005-02-16 Dave Brolley ++ ++ * utils.scm: Update copyright years. ++ * utils-gen.scm (gen-ifld-extract): Pass base-length to -gen-ifld-extract-base. ++ * sid.scm (gen-ifetch): Handle the case where bitsize == 24. ++ * operand.scm (-derived-operand-parse): Move logit message from level 1 ++ to level 2. ++ ++2005-02-15 Nick Clifton ++ ++ * opc-itab.scm (-gen-ifmt-table-1): Add an ATTRIBUTE_UNUSED to ++ prevent compile time warning messages. ++ * opc-opinst.scm (-gen-operand-instance-table): Likewise. ++ * utils-gen.scm (attr-int-gen-defn): Likewise. ++ (attr-gen-defn): Likewise. ++ * cpu/ip2k.opc (parse_addr16_p): Remove unused function. ++ (print_dollarhex16): Remove unused function. ++ ++2005-02-15 Jim Blandy ++ ++ * guile.scm (cgen-call-with-debugging): Doc fix. ++ ++ Make backtraces work more reliably. ++ * guile.scm: Set up debugging parameters, and enable debugging and ++ source positions while loading. ++ (cgen-call-with-debugging, cgen-debugging-stack-start): New ++ functions. ++ * read.scm: Don't set debugging parameters here. ++ (catch-with-backtrace): Function deleted. ++ (-cgen): Simply note the presence or absence of the -b option. ++ Pass the flag to cgen-call-with-debugging, so debugging is turned ++ off here if the user didn't request it, for faster computation. ++ (cgen): Call cgen-debugging-stack-start here, instead of ++ catch-with-backtrace. ++ ++ * Makefile.am (GUILE): Explicitly load guile.scm here, and leave a ++ trailing -s. ++ (desc, html, opcodes, sim-arch, sim-cpu, gas-test, sim-test): ++ Don't write out the trailing -s here. ++ * Makefile.in: Regenerated. ++ * cgen-doc.scm, cgen-gas.scm, cgen-stest.scm): Don't load ++ fixup.scm here; let the caller decide which Scheme's customization ++ file to preload. ++ * dev.scm: Load guile.scm, not fixup.scm. ++ * fixup.scm: Deleted; contents have all moved to guile.scm. ++ * README: Doc fix. ++ ++ * guile.scm (debug-write): New function. ++ ++2005-02-14 Jim Blandy ++ ++ * pmacros.scm (pmacros-init!): For .eval macros, use eval1 as the ++ transformer procedure, not eval. Transformer procedures take one ++ argument. ++ ++2005-02-11 Nick Clifton ++ ++ * cpu/iq2000.opc (parse_jtargq10): Change type of valuep argument ++ to 'bfd_vma *' in order avoid compile time warning message. ++ ++2005-02-09 Jim Blandy ++ ++ * cgen-sim.scm (load-files): Don't load fixup.scm. (See ++ corresponding change in the sim/common directory.) ++ ++2005-02-07 Jim Blandy ++ ++ * cgen-opc.scm: Don't load fixup.scm here. (See corresponding ++ changes in the opcodes directory.) ++ ++ * guile.scm: New file, containing Guile-specific definitions and ++ adaptations. This is loaded by the app-specific shell scripts. ++ Initially identical to fixup.scm. ++ * cgen-sid.scm: Don't load fixup.scm here. ++ ++ * cos.scm: Profile elm-xset! when requested, not elm-set!; the ++ latter is a macro. ++ ++2005-01-27 Jim Blandy ++ ++ * utils.scm (string/symbol->append): Renamed from 'concat'. ++ * opcodes.scm (gen-switch): Use new name. ++ * insn.scm (-sub-insn-make!): Same. ++ * rtl.scm (rtx-dump): Same. ++ * semantics.scm (semantic-compile): Same. ++ ++2005-01-20 Jim Blandy ++ ++ * opcodes.scm (gen-switch): Use concat instead of string-map. ++ ++ * utils.scm (concat): New function. ++ * insn.scm (-sub-insn-make!): Use concat instead of string-map. ++ * rtl.scm (rtx-dump): Same. ++ * semantics.scm (semantic-compile): Same. ++ ++2004-12-16 Jim Blandy ++ ++ * utils-cgen.scm (parse-name): Don't assume that string-map can be ++ applied to symbols. Process everything as strings, and then ++ convert to a symbol at the end. ++ ++ * read.scm (debug-repl): Temporarily redirect input and output to ++ /dev/tty while we debug, so we don't interfere with whatever CGEN ++ is reading or writing. ++ * utils.scm (setter-getter-fluid-let, with-input-and-output-to): ++ New functions. ++ ++2004-11-15 Michael K. Lechner ++ ++ * cpu/iq2000.cpu: Added quotes around macro arguments so that they ++ will work with newer versions of guile. ++ ++2004-10-27 Nick Clifton ++ ++ * cpu/iq2000m.cpu: Import latest version from cpu/ directory. ++ * cpu/iq2000.cpu: Likewise. ++ ++2004-07-21 DJ Delorie ++ ++ * cpu/xstormy16.cpu (movhmemgr): Use hmem8, not lmem8. ++ ++2003-03-14 Frank Ch. Eigler ++ ++ * cpu/iq2000.opc (parse_jtargq10): Add ATTRIBUTE_UNUSED on unused args. ++ (parse_jtargq10, iq2000_cgen_isa_register, parse_mlo16): Declare. ++ ++2004-03-30 Kazuhiro Inaoka ++ ++ * cpu/m32r.opc (parse_hi16): Fixed shigh(0xffff8000) bug. ++ ++2004-03-22 Dave Brolley ++ ++ * utils.scm (copyright-fsf): Update copyright years. ++ (copyright-red-hat): Ditto. ++ * sid.scm (-op-gen-set-trace): Generate trace code before semantic ++ code. ++ (-op-gen-set-trace-parallel): Ditto. ++ ++2004-02-10 Kazuhiro Inaoka ++ ++ * cpu/m32r.opc (my_print_insn): Fixed incorrect output when ++ disassembling codes for 0x*2 addresses. ++ ++2004-01-29 Dave Brolley ++ ++ * decode.scm (-opcode-slots): For short insns, generate 'opcode' with ++ zeroes in the extra bit positions and generate 'opcode-mask' with ones ++ in the extra bit positions. ++ ++2003-12-15 Kazuhiro Inaoka ++ ++ * cpu/m32r.cpu: Add PIPE_O attribute to "pop" instruction. ++ ++2003-12-04 Alan Modra ++ ++ * cpu/openrisc.opc (openrisc_sign_extend_16bit): Don't rely on ++ "short" being 16 bit. ++ (parse_hi16): Likewise. Fix type-punned pointer warnings too, and ++ internationalize error message. ++ (parse_lo16): Likewise. Remove useless code. ++ ++2003-12-03 Kazuhiro Inaoka ++ ++ * cpu/m32r.cpu : Add new model m32r2. ++ Add new instructions. ++ Replace occurrances of 'Mitsubishi' with 'Renesas'. ++ Changed PIPE attr of push from O to OS. ++ Care for Little-endian of M32R. ++ * cpu/m32r.opc (CGEN_DIS_HASH, my_print_insn): ++ Care for Little-endian of M32R. ++ (parse_slo16): signed extension for value. ++ ++2003-10-26 Dave Brolley ++ ++ * sid-decode.scm (-gen-record-profile-args): Test trace_counter_p ++ and final_insn_count_p. Don't test WITH_PROFILE_MODEL_P. ++ (-gen-extract-fn): Call -gen-record-profile-args. ++ ++2003-10-21 Dave Brolley ++ ++ * sid-model.scm (-gen-model-class-decls): Generate MAX_UNITS as ++ a static const int. ++ * decode.scm (-opcode-slots): Correct typo in logit call. ++ ++2003-10-09 Jim Blandy ++ ++ * desc-cpu.scm (gen-hw-table-decls): Emit an 'extern' declaration ++ for @arch@_cgen_hw_table. GDB needs to be able to find this. ++ ++ * mach.scm (def-isa-attr!): hardware can have ISA attributes, too. ++ ++2003-10-06 Dave Brolley ++ ++ * gen-all-doc: Add fr550. ++ ++2003-09-11 Doug Evans ++ ++ * Makefile.am (ARCHFILE): New var. ++ (desc): Pass $(ARCHFILE) for -a parm, not $(ARCH). ++ (html,opcodes,sim-arch,sim-cpu,gas-test,sim-test): Ditto. ++ * Makefile.in: Regenerate. ++ ++2003-09-08 Dave Brolley ++ ++ On behalf of Doug Evans ++ Pass in paths to input files, instead of assuming they live in ++ $srcdir/cpu. Plus misc. option processing cleanup. ++ * cgen-doc.scm (doc-arguments): Make options strings not symbols. ++ Add pre-process pass to all options. ++ * cgen-gas.scm (gas-arguments): Ditto. ++ * cgen-sid.scm (sim-arguments): Ditto. ++ * cgen-sim.scm (sim-arguments): Ditto. ++ * cgen-stest.scm (stest-arguments): Ditto. ++ * cgen-opc.scm (opc-arguments): Ditto. New argument -OPC. ++ (-opc-file-path): New global. ++ (opc-file-path): New fn. ++ * opcodes.scm (read-cpu.opc): Replace srcdir,cpu args with opc-file. ++ All callers updated. ++ (gen-extra-cpu.h,gen-extra-cpu.c,gen-extra-opc.h,gen-extra-opc.c, ++ gen-extra-asm.c,gen-extra-dis.c,gen-extra-ibld.h,gen-extra-ibld.c): ++ Replace srcdir arg with opc-file. All callers updated. ++ * read.scm (-opt-spec-update): Delete. ++ (opt-get-first-pass,opt-get-second-pass): New fns. ++ (-cgen): Process application-specific arguments in two passes. ++ ++2003-08-29 Dave Brolley ++ ++ * cpu/frv.cpu: Removed. ++ * cpu/frv.opc: Removed. ++ ++2003-08-21 Nick Clifton ++ ++ * cpu/frv.cpu (mbtoh): Replace input parameter to ++ u-media-dual-expand and u-media-dual-btoh with output parameter. ++ (cmbtoh): Add profiling hack. ++ ++2003-08-19 Michael Snyder ++ ++ * cpu/frv.cpu: Fix typo, Frintkeven -> FRintkeven ++ ++2003-08-07 Michael Meissner ++ ++ * opc-opinst.scm (-gen-operand-instance-table): Initialize all of ++ the elements for the END record of CGEN_OPINST, silencing warnings. ++ ++2003-07-15 Doug Evans ++ ++ Add guile 1.6.4 support. ++ - empty list must be quoted ++ - string functions have stricter type checking ++ - eval now takes a second argument ++ - symbol-bound? is deprecated ++ * attr.scm (-attr-parse): Use stringsym-append to build errtxt. ++ (bitset-attr->list): Ensure arg to string-cut is a string. ++ (attr-parse): Ensure args to string-ref and string-drop1 are strings. ++ (,gen-value-for-defn): Fetch string name of self. ++ * cos.scm (-class-list): Must quote empty list. ++ (-class-parent-classes,-class-compute-class-desc): Ditto. ++ (class-make,make,object-reset!): Ditto. ++ (method-make-make!): Call eval1 instead of eval. ++ (method-make-forward!,method-make-virtual-forward!): Ditto. ++ * decode.scm (subdtable-add): Use stringsym-append instead of ++ string-append. ++ (-gen-exprtable-name): Fetch string name of exprtable-entry-insn. ++ (-build-decode-table-entry): Fetch string name of insn. ++ * desc-cpu.scm (-gen-isa-table-defns): Fetch string name of isa. ++ (-gen-mach-table-defns): Ditto for mach. ++ (gen-ifld-defns): Ditto for ifld. ++ (gen-hw-table-defns): Ditto for hw. ++ (gen-operand-table): Ditto for op. ++ (gen-insn-table-entry): Ditto for insn. ++ * desc.scm (gen-attr-table-defn): Ditto for attr. ++ (,gen-defn): Don't pass symbols to string-append. ++ * enum.scm (parse-enum-vals): Use symbolstr-append instead of ++ symbol-append. ++ (enum-vals-upcase): Use symbol-upcase to build result. ++ (-enum-parse): Use stringsym-append to build errtxt. ++ * fixup.scm (*guile-major-version*,*guile-minor-version*): New globals. ++ (eval1): New function. ++ (symbol-bound?): Provide own version if >= guile 1.6. ++ * hardware.scm (define-keyword): Use string-append instead of ++ symbol-append. ++ * html.scm (gen-html-header,gen-table-of-contents,gen-arch-intro, ++ cgen.html,cgen-insn.html): Convert current-arch-name to a string ++ before using. ++ (gen-list-entry): Handle either symbol or string `name' arg. ++ (gen-obj-doc-header): Fetch string name of `o' arg. ++ (define-cpu-intro): Ditto for cpu. ++ (gen-mach-intro): Ditto for mach. ++ (gen-model-intro): Ditto for model. ++ (gen-isa-intro): Ditto for isa. ++ (gen-machine-doc-1): Ditto for isa. ++ (gen-reg-doc-1): Convert mach to string first. ++ (gen-insn-doc-1): Ditto. Convert model/unit names to strings first. ++ (gen-insn-doc-list): Fetch string name of mach. Convert insn name ++ to string first. ++ (gen-insn-categories): Fetch string name of mach. Convert ++ enum-val-name to string first. ++ (gen-insn-docs): Fetch string name of mach. ++ * ifield.scm (ifld-ilk): Result is a string. ++ * iformat.scm (-ifmt-search-key): Convert attr value to string first. ++ Fetch string name of ifld. ++ (-sfmt-search-key): Similarily for ifld and op. ++ * insn.scm (syntax-make): Fetch string name of syntax element. ++ * mach.scm (-cpu-parse): Use stringsym-append to build errtxt. ++ * minsn.scm (minsn-make-alias): Fetch string name of minsn. ++ * mode.scm (mode:c-type): Result is a string. ++ (mode:enum): Fetch string name of mode. ++ (-mode-parse): Use stringsym-append to build errtxt. ++ * model.scm (model:enum): Fetch string name of model. ++ (-model-parse): Use stringsym-append to build errtxt. ++ (parse-insn-timing): Must quote empty list. ++ * opc-itab.scm (-gen-minsn-table-entry): Fetch string name of minsn. ++ (-gen-minsn-opcode-entry): Ditto. ++ * opcodes.scm (,gen-function-name): `what' arg is a symbol, ++ convert to string. ++ (read-cpu.opc): Convert current-arch-name to a string before using. ++ * operand.scm (,gen-pretty-name): Ensure `name' is a string. ++ (): Must quote empty list. ++ (op-sort): Simplify, call alpha-sort-obj-list to do sort. ++ * pgmr-tools.scm (pgmr-pretty-print-insn-value): Fetch string name ++ of ifld. ++ * pmacros.scm (-pmacro-build-lambda): Use eval1 instead of eval. ++ (-pmacro-sym): Must convert symbols to strings before passing to ++ string-append. ++ (-pmacro-str): Ditto. ++ (pmacros-init!): Use eval1 instead of eval. ++ * read.scm (keep-mach-atlist?): Simplify, use bitset-attr->list. ++ (keep-isa-atlist?): Ditto. ++ (cmd-if): Use eval1 instead of eval. ++ * rtl-c.scm (,get-name): Fetch string name of self. ++ (-rtl-c-get): Fetch string name of src. ++ (s-unop): Ditto for mode. ++ (s-binop,s-binop-with-bit,s-shop,s-convop,s-cmpop): Ditto. ++ (-gen-par-temp-defns,subword): Ditto. ++ (join): Use stringsym-append instead of string-append. ++ * rtl-traverse.scm (rtx-option?): Convert option to string first. ++ (rtx-traverse-debug): Fetch string name of rtx-obj. ++ * rtl.scm (def-rtx-node): Use eval1 instead of eval. ++ (def-rtx-syntax-node,def-rtx-operand-node,def-rtx-macro-node): Ditto. ++ (rtx-pretty-name): Result is a string. ++ (-rtx-hw-name): Use symbolstr-append instead of symbol-append. ++ * semantics.scm (semantic-compile): Simplify, use alpha-sort-obj-list. ++ * sid-cpu.scm (cgen-write.cxx): Convert current-arch-name to a string ++ before using. ++ (-gen-sfrag-case): Fetch string name of user. ++ * sid-model.scm (unit:enum): Fetch string name of unit. ++ * sid.scm (,cxmake-get): Fetch string name of mode. ++ (,gen-set-quiet): Ditto. ++ (gen-mode-defs): Ditto. ++ (sim-finish!): Convert current-arch-name to a string before using. ++ * sim-cpu.scm (-gen-scache-semantic-fn): Fetch string name of insn. ++ (-gen-no-scache-semantic-fn): Ditto. ++ (cgen-defs.h): Fetch string name of isa. ++ (cgen-read.c): Convert current-arch-name to a string before using. ++ (cgen-write.c): Ditto. ++ * sim-model.scm (unit:enum): Fetch string name of unit. ++ (gen-model-fn-decls): Use stringsym-append instead of string-append. ++ (-gen-model-timing-table): Fetch string name of model. ++ (-gen-mach-model-table): Ditto. ++ (-gen-mach-defns): Fetch string name of mach. ++ * sim.scm (gen-reg-access-defn): Fetch string name of hw. ++ (,cxmake-get): Fetch string name of mode. ++ (,gen-set-quiet): Ditto. ++ (gen-mode-defs): Ditto. ++ (sim-finish!): Must quote empty list. ++ * utils-cgen.scm (): Must quote empty list. ++ (obj:str-name): New fn. ++ (parse-comment): Result is a string. ++ (parse-symbol): Result is a symbol. ++ (parse-string): Result is a string. ++ (keyword-list?): Convert arg to string before calling string-ref. ++ (keyword-list->arg-list): Ditto. ++ (gen-attr-name): Convert attr-name to string first. ++ (alpha-sort-obj-list): Use symbolstring,->symbol): New fns. ++ (reduce): Call eval1 instead of eval. ++ * cpu/m32r.cpu (addi): Don't use `#.'. ++ ++ * gen-all-sim: Fix some typos. ++ ++2003-07-08 Doug Evans ++ ++ * gen-all-doc: Ensure run from cgen src dir. ++ * gen-all-opcodes: Build in ./tmp-opcodes. Don't delete dir when done. ++ * gen-all-sid: Similarily, in ./tmp-sid. ++ * gen-all-sim: Similarily, in ./tmp-sim. ++ ++2003-06-20 Doug Evans ++ ++ * gen-all-sim: Add fr30,sh64 support. Only generate m32r by default. ++ ++2003-06-19 Doug Evans ++ ++ * mach.scm (-ifld-already-defined?): New proc. ++ (current-ifld-add!): Use it. ++ (-op-already-defined?): New proc. ++ (current-op-add!): Use it. ++ (-insn-already-defined?): New proc. ++ (current-insn-add!): Use it. ++ (-minsn-already-defined?): New proc. ++ (current-minsn-add!): Use it. ++ (obj-isa-list): New proc. ++ (isa-supports?): Use it. ++ ++2003-06-10 Doug Evans ++ ++ * insn.scm (insn-builtin!): RELAX renamed to RELAXABLE. ++ * cpu/m32r.cpu (all insns): Ditto. ++ ++ * mach.scm (current-*-add!): Disallow redefinition. Make result ++ "unspecified". ++ ++ * gen-all-doc: Split arm and frv docs up a bit. ++ ++ * cpu/arm.cpu: Add IDOC attribute. ++ * cpu/frv.cpu: Ditto. ++ * cpu/i960.cpu: Ditto. ++ * cpu/openrisc.cpu: Ditto. ++ * cpu/xstormy16.cpu: Ditto. ++ * cpu/m32r.cpu: Ditto. ++ (all insns): Explicitly specify IDOC attribute. ++ ++ * Makefile.am (MACH,ISAS,INSN_FILE_NAME): New vars. ++ (desc,opcodes,sim-arch,sim-cpu,gas-test,sim-test): Use MACH,ISAS. ++ (html): Use MACH,ISAS,INSN_FILE_NAME. Generate insn.html separately. ++ * Makefile.in: Regenerate. ++ * attr.scm (:parse-value-def): Implement. ++ (-attr-read): Defer computing default value until we know the type. ++ (attr-has-attr?): Delete, move contents to :has-attr?. ++ (:attr-present?): New method. ++ (atlist-attr-present?,obj-attr-present?): New fns. ++ (obj-has-attr-value?,obj-has-attr-value-no-default?): New fns. ++ (attr-builtin!): New insn attr IDOC. ++ * cgen-doc.scm (doc-arguments): New args -I,-N. ++ * enum.scm (parse-enum-vals): New arg errtxt, all callers updated. ++ Support comment as fourth element of enum value. ++ (enum-val-name,enum-val-value,enum-val-attrs,enum-val-comment): New fns. ++ * html.scm (gen-html-header): New arg kind, all callers updated. ++ (gen-table-of-contents): New arg insn-file, all callers updated. ++ (gen-list-entry,gen-doc-header): New fn. ++ (get-operands): Delete. ++ (gen-iformat-table): Rewrite. ++ (gen-insn-doc-1): Print constant-folded and trimmed semantics. ++ (gen-insn-doc-list): New args name, comment, insns. All callers updated. ++ (get-insn-properties,guess-insn-idoc-attr!): New fn. ++ (insn-sets-pc?,insn-refs-mem?,insn-uses-fpu?): New fns. ++ (get-insns-for-category,gen-categories-insn-lists): New fns. ++ (gen-insn-docs): Simplify each insn's semantics first. ++ Print insn tables sorted by IDOC categories. ++ (*insn-html-file-name*): New global. ++ (cgen-insn.html): New fn. ++ (cgen-all): Update. ++ * insn.scm (): Create a setter for the `tmp' member. ++ * semantics.scm (insn-build-known-values): Renamed from ++ -build-known-values. All callers updated. ++ ++ * rtl.scm: Move traveral/evaluation support to ... ++ * rtl-traverse.scm: New file. ++ * read.scm: Maybe-load rtl-traverse.scm. ++ ++ * rtl.scm (-rtx-valid-types): Add SETRTX. ++ ++ * rtx-funcs.scm (nop,parallel): Fix mode. ++ ++ * utils.scm (eqv-lookup-index): New fn. ++ (assq-lookup-index): Renamed from lookup-index. All callers updated. ++ ++ * dev.scm (load-doc): Set APPLICATION. ++ ++2003-06-10 Dave Brolley ++ ++ * sid-cpu.scm: Generate #include of config.h into @prefix@-sem.cxx. ++ * sid-decode.scm: Generate #include of config.h into ++ @prefix@-decode.cxx. ++ * sid-model.scm: Generate #include of config.h into @prefix@-model.cxx. ++ ++2003-06-07 Doug Evans ++ ++ * gen-all-sid: New file. ++ * gen-all-opcodes: New file. ++ ++2003-06-05 Nick Clifton ++ ++ * cpu/frv.cpu (FRintieven): New operand. An even-numbered only ++ version of the FRinti operand. ++ (FRintjeven): Likewise for FRintj. ++ (FRintkeven): Likewise for FRintk. ++ (mdcutssi, media-dual-word-rotate-r-r, mqsaths, ++ media-quad-arith-sat-semantics, media-quad-arith-sat, ++ conditional-media-quad-arith-sat, mdunpackh, ++ media-quad-multiply-semantics, media-quad-multiply, ++ conditional-media-quad-multiply, media-quad-complex-i, ++ media-quad-multiply-acc-semantics, media-quad-multiply-acc, ++ conditional-media-quad-multiply-acc, munpackh, ++ media-quad-multiply-cross-acc-semantics, mdpackh, ++ media-quad-multiply-cross-acc, mbtoh-semantics, ++ media-quad-cross-multiply-cross-acc-semantics, ++ media-quad-cross-multiply-cross-acc, mbtoh, mhtob-semantics, ++ media-quad-cross-multiply-acc-semantics, cmbtoh, ++ media-quad-cross-multiply-acc, media-quad-complex, mhtob, ++ media-expand-halfword-to-double-semantics, mexpdhd, cmexpdhd, ++ cmhtob): Use new operands. ++ * cpu/frv.opc (CGEN_VERBOSE_ASSEMBLER_ERRORS): Define. ++ (parse_even_register): New function. ++ ++2003-06-04 Doug Evans ++ ++ Better handling of 64 bit and mixed 32/64 bit architectures. ++ * hardware.scm (hw-update-word-modes!): New fn. ++ * mach.scm (define-cpu)): Call mode-set-word-modes!, ++ hw-update-word-modes!. ++ (state-word-bitsize): Replace FIXME with requested check. ++ (arch-analyze-insns!): Call mode-ensure-word-sizes-defined. ++ * mode.scm (mode-find): Ignore INT,UINT. ++ (-mode-word-sizes-kind): New global. ++ (mode-set-word-modes!,mode-set-identical-word-bitsizes!, ++ mode-set-biggest-word-bitsizes!,mode-ensure-word-sizes-defined): New fns. ++ (mode-init!): Initialize -mode-word-sizes-kind. Move initialization ++ of mode-list to ... ++ (mode-builtin!): ... here. Initialize WI/UWI/AI/IAI to something ++ unusable, correct values set later. ++ (mode-finish!): Remove cruft. ++ * html.scm (doc-init!): Call mode-set-biggest-word-bitsizes!. ++ * opcodes.scm (opcodes-init!): Ditto. ++ * rtx-funcs.scm (annul): Fix mode of pc. ++ * cpu/ia64.cpu: Remove cruft that sets word modes. ++ * cpu/xstormy16.cpu (define-cpu): Set word-bitsize. ++ ++2003-06-03 Nick Clifton ++ ++ * cpu/frv.cpu (media-dual-word-rotate-r-r): Use a signed 6-bit ++ immediate value not unsigned. ++ ++2003-05-21 J"orn Rennecke ++ ++ * cpu/sh.cpu: Amend comments to refer to SuperH. ++ * cpu/sh64-compact.cpu: Change comment to refer to SuperH. ++ * cpu/sh64-media.cpu: Likewise. ++ (Saturation): Update manual reference. ++ ++2003-05-15 Doug Evans ++ ++ * Makefile.am (srcroot): New var. ++ (html): New rule. ++ * Makefile.in: Regenerate. ++ * cgen-doc.scm: New file. ++ * html.scm: New file. ++ * gen-all-doc: New file. ++ * dev.scm (cload): Handle DOC application. ++ (load-doc): New fn. ++ * machs.scm (machs-for-cpu): New fn. ++ * model.scm (models-for-cpu): New fn. ++ * utils.scm (gen-c-copyright): Renamed from gen-copyright. ++ All uses updated. ++ (iota): Rewrite to be identical to pmacro version. All uses updated. ++ * utils-cgen.scm (alpha-sort-obj-list): New fn. ++ ++ * utils-sim.scm (-gen-decoder-switch): Back out patch of 2003-01-09. ++ (-gen-decode-bits): Instead put in better fix here. ++ ++ * cpu/i960.cpu (index): Rename to indx. All uses updated. ++ ++2003-05-01 DJ Delorie ++ ++ * cpu/xstormy16.cpu (alignfix-mem): Correct logic for unaligned ++ word accesses. ++ (set-alignfix-mem): Likewise. ++ ++2003-04-16 Dave Brolley ++ ++ * doc/rtl.texi (Iiming): Correct example to use 'model-name'. ++ * utils.scm (copyright-fsf): Update generate copyright years. ++ (copyright-cygnus): Ditto. ++ * sid.scm (-op-gen-set-trace): Generate code to fill in bitmask of modified ++ operands. ++ (-gen-arch-model-decls): Don't generate unit enum declaration or MAX_UNITS ++ here. ++ ('gen-profile-code): New parameter 'when'. ++ ('gen-profile-code): Ditto. ++ ('gen-profile-code): Ditto. ++ ('gen-profile-code): Ditto. Only generate 'referenced' and ++ 'insn_reference' for the 'after' function. ++ * model.scm (unit:enum): Moved to sim-model.scm. ++ * sim-model.scm (unit:enum): Moved from model.scm. ++ * sid-decode.scm (-gen-scache-decls): Generate the 'written' field. ++ * cgen-sid.scm (sim-arguments): Document the generation of model.h. ++ * sid-model.scm (unit:enum): New version for sid. ++ (gen-model-class-name): New function. ++ (gen-model-unit-fn-decl): New function. ++ (gen-model-fn-decls): Call gen-model-unit-fn-decl. ++ (gen-model-unit-fn-name): New parameter 'when'. ++ (-gen-model-insn-fn-name): Ditto. ++ (-gen-model-insn-qualified-fn-name): New function. ++ (-gen-model-insn-fn-decl): New function. ++ (-gen-model-insn-fn-decls): New function. ++ (-gen-model-insn-fn): New parameter 'when'. Call ++ -gen-model-insn-qualified-fn-name. ++ (-gen-model-insn-fns): Generate the constructor for the model. Generate ++ functions for modelling insn before and after execution. ++ (-gen-model-class-decls): New function. ++ (" (gen-model-class-name model) "): New function. ++ (gen-model-classes): New function. ++ (-gen-insn-timing): Generate functions for modelling insn before and after ++ execution. ++ (-gen-insn-unit-timing): Generate class-qualified names. ++ (-gen-model-timing-table): Ditto. ++ (cgen-model.cxx): Generate #include for @cpu@.h. Omit generation of code ++ not needed (yet) by sid. ++ (cgen-model.h): New function. ++ ++2003-04-15 Rohit Kumar Srivastava ++ ++ * cpu/sh.cpu: Replace occurrances of 'Hitachi' with 'Renesas'. ++ * cpu/sh64-compact.cpu: Likewise. ++ * cpu/sh64-media.cpu: Likewise. ++ ++2003-03-21 DJ Delorie ++ ++ * cpu/xstormy16.cpu (basic-psw): New argument ws (wordsize), ++ which indicates if the sign flag is set from bit 15 or 7. ++ Adjust all callers. ++ (set-psw): New argument ws, propogate it. ++ (set-psw-nowrite): Likewise. ++ (set-mem-psw): Likewise. ++ (set-psw-carry): Likewise. Use temporaries to prevent ++ prematurely overwriting needed inputs. ++ (set-psw-rrotate17): Fix logic. ++ (shrgrgr): Preserve carry for zero-bit shifts. ++ (shrgrimm): Likewise. ++ (shlgrgr): Likewise. ++ (shlgrimm): Likewise. ++ (asrgrgr): Likewise. ++ (asrgrimm): Likewise. ++ (reset): New. ++ ++2003-03-12 Frank Ch. Eigler ++ ++ * sid.scm: Set APPLICATION to SID-SIMULATOR. ++ ++2002-03-05 DJ Delorie ++ ++ * cpu/xstormy16.cpu (set-psw-add): Use temporaries to prevent ++ prematurely overwriting needed inputs. ++ (set-psw-sub): Likewise. ++ ++Fri Feb 21 19:48:19 2003 J"orn Rennecke ++ ++ * cpu/sh64-media.cpu (make-mextr): Fix setting of count. ++ ++2003-02-18 DJ Delorie ++ ++ * xstormy16.cpu (set-mem-alignfix-psw): Remove. ++ (movlmemimm): Just mask the address. ++ (movhmemimm): Likewise. ++ (movlmemgr): Likewise. ++ (movhmemgr): Likewise. ++ (set-psw): Always set the psw last. ++ (set-psw-carry): Likewise. ++ (set-psw-add): Likewise. ++ (set-psw-sub): Likewise. ++ ++ * xstormy16.cpu (set-psw-rrotate17): New. Choose the correct set ++ of 16 patterns from the set-psw-rotate17 function. ++ (movgrigr, movgripostincgr, movgripredecgr, movgriigr, ++ movgriipostincgr, movgriipredecgr): Set psw correctly. ++ (movfgrigr, movfgripostincgr, movfgripredecgr, movfgriigr, ++ movfgriipostincgr, movfgriipredecgr): Fix semantics. ++ (rrcgrgr, rrcgrimm4): Use new set-psw-rrotate17 function. ++ ++2003-02-11 Dave Brolley ++ ++ * desc-cpu.scm (gen-ifld-defns): Add all ifields to the ++ @arch@_cgen-ifld_table. ++ (gen-maybe-multi-ifld): Use the ifield enumerators to index the ++ @arch@_cgen-ifld_table. ++ ++2003-02-03 Frank Ch. Eigler ++ ++ * sid-cpu.scm (-gen-sfrag-engine-fn): Generate more hygienic C++. ++ ++2003-01-09 Graydon Hoare ++ ++ * utils-sim.scm (-gen-decoder-switch): Fix edge condition for ++ empty ISAs. ++ ++2003-01-07 Graydon Hoare ++ ++ * utils-gen.scm (attr-int-gen-defn): Define. ++ ++2002-12-21 Doug Evans ++ ++ * ifield.scm (-ifield-parse): Rewrite computation. ++ (-get-ifld-word-offset,-get-ifld-word-length): New fns. ++ ++ * dev.scm (cload): Update location of .cpu files. ++ ++2002-12-19 Doug Evans ++ ++ * utils-sim.scm (gen-profile-sym): New fn. ++ (,sbuf-profile-sym): New method. ++ (,sbuf-profile-elm): Use it. ++ * sim.scm (,gen-record-profile): Use sbuf-profile-sym instead ++ of hardcoding symbol name. ++ (,gen-profile-code): Ditto. ++ (,gen-profile-code): Use gen-profile-sym instead of hardcoding ++ symbol name. ++ ++ * mode.scm (mode-sem-mode): New fn. ++ * operand.scm (op:new-mode): Update. mode-name. ++ (op-natural-mode?) New fn. ++ * rtl.scm (hw): Set hw-name,mode-name. ++ ++ Back out sim*.scm changes of 2001-04-02 Ben Elliston ++ Instead do: ++ * sim-decode.scm (-gen-decode-insn-globals): Use @PREFIX@_INSN__MAX ++ as size of IDESC-TABLE-VAR. ++ (@prefix@_init_idesc_table): Ditto. ++ * sim-model.scm (-gen-mach-defns): Ditto. ++ * sim.scm (gen-cpu-insn-enum-decl): Rename last elm from max to -max. ++ ++ * utils-sim.scm (-gen-decode-insn-entry): Fix some spacing in output. ++ ++ * insn.scm (-parse-insn-format-symbol): Improve error message. ++ (-parse-insn-format): Ditto. ++ ++ * gen-all-sim: New script. ++ ++2002-12-16 DJ Delorie ++ ++ * cpu/xstormy16.opc (parse_immediate16): Add prototype. ++ ++2002-12-16 Andrew MacLeod ++ ++ * cpu/xstormy16.cpu (imm16): Call handler immediate16. ++ * cpu/xstormy16.opc (parse_small_immediate): Return on '@'. ++ (parse_immediate16): Handle immediate16 values, which now include ++ @hi(label) and @lo(label) ++ ++2002-12-03 Alan Modra ++ ++ * desc-cpu.scm (gen-maybe-multi-ifld): Remove superfluous parens. ++ Add braces and cast for union field. ++ (gen-multi-ifield-nodes): Add braces and cast for union field. ++ (cgen_operand_table): Similarly fix sentinel. ++ (cgen_cpu_close): Constify "insns". Formatting. ++ (cgen-desc.c): Include xregex.h. ++ * cpu/ip2k.opc (ip2k_cgen_insn_supported): Move to opc.c section. ++ Prototype. ++ : Include safe-ctype.h. ++ (ip2k_asm_hash): Use ISSPACE and TOLOWER. ++ (PARSE_FUNC_DECL): Declare. Use to prototype parse_fr, parse_addr16, ++ parse_addr16_p, parse_addr16_cjp, parse_lit8 and parse_bit3. ++ (parse_fr): Constify "old_strp". Correct type of "tempvalue". ++ Don't test it for >= 0. Use ISSPACE rather than isspace. Formatting. ++ (parse_addr16): Correct type of "value". Formatting. ++ (parse_addr16_p): Likewise. ++ (parse_addr16_cjp): Likewise. ++ (parse_lit8): Likewise. ++ (parse_bit3): Formatting. ++ (PRINT_FUNC_DECL): Define. Use to prototype print_fr, print_dollarhex, ++ print_dollarhex8, print_dollarhex16, print_dollarhex_addr16h, ++ print_dollarhex_addr16l, print_dollarhex_p, print_dollarhex_cj and ++ print_decimal. ++ (print_fr): Add ATTRIBUTE_UNUSED on unused args. Formatting. ++ (print_dollarhex): Add ATTRIBUTE_UNUSED on unused args. ++ (print_dollarhex8): Likewise. ++ (print_dollarhex16): Likewise. ++ (print_dollarhex_addr16h): Likewise. ++ (print_dollarhex_addr16l): Likewise. ++ (print_dollarhex_p): Likewise. ++ (print_dollarhex_cj): Likewise. ++ (print_decimal): Likewise. ++ * cpu/xstormy16.opc (parse_mem8): Use ISALNUM rather than isalnum. ++ ++2002-11-30 Hans-Peter Nilsson ++ ++ * doc/rtl.texi (Model variants): Mention current limitations for ++ unit inputs and outputs. ++ (Hardware elements) : Be slightly more ++ verbose. ++ (Instructions) : input/output overrides have a direction ++ operand. ++ ++2002-11-25 DJ Delorie ++ ++ * xstormy16.cpu (sdiv, divlh, sdivlh): Fix sdivlh/divlh encodings. ++ ++2002-11-21 Jeff Johnston ++ ++ * cpu/iq10.cpu: New file. ++ * cpu/iq2000.cpu: Likewise. ++ * cpu/iq2000.opc: Likewise. ++ * cpu/iq2000m.cpu: Likewise. ++ ++2002-11-19 DJ Delorie ++ ++ * cpu/xstormy16.cpu (sdiv, divlh, sdivlh): New. ++ ++2002-11-05 Frank Ch. Eigler ++ ++ * dev.scm: Call getenv with a string, not a symbol. ++ ++2002-10-08 Doug Evans ++ Hans-Peter Nilsson ++ ++ * types.scm (bitrange-overlap?): Handle lsb0?. ++ ++2002-09-07 Frank Ch. Eigler ++ ++ From Robert Cragie : ++ * cpu/arm7.cpu (ldm*-sw*, stm*-sw*): New instructions. ++ ++2002-07-17 Frank Ch. Eigler ++ Ben Elliston ++ John Healy ++ Jeff Johnston ++ Alan Lehotsky ++ Ubicom Inc. ++ ++ * cpu/ip2k.cpu: New file. ++ * cpu/ip2k.opc: Likewise. ++ ++2002-07-01 Hans-Peter Nilsson ++ ++ * utils-gen.scm (-gen-extract-word): Handle lsb0?. ++ ++2002-06-25 J"orn Rennecke ++ ++ * cpu/sh64-compact.cpu (movw5): Use Correct operand field for reg. ++ * cpu/sh64-media.cpu (-ldhi-byte, -ldhi-word, -ldhi-long): New macros. ++ (-ldlo-byte, -ldlo-word, -ldlo-long): Likewise. ++ (-sthi-word, -sthi-long -stlo-byte, -stlo-word, -stlo-long): Likewise. ++ (ldhil, ldhiq, ldlol, ldloq, stlol, stloq): Implement. ++ (mshfhib, mshfhil, mshfhiw, mshflob, mshflol, mshflow): Fix indices. ++ (-sthi-byte): If there is a single byte to store, store it at ++ proper address. ++ (sthil, sthiq): Fix big-endian behaviour. ++ (mcnvslw, mcnvswb, mcnvswub, mmacfxwl, mmacnfx.wl): Fix indices. ++ (mmulfxl, mmulfxw, mmulfxrpw, mmulhiwl, mmullowl): Likewise. ++ (saturate): Use Dimode to check if saturation operation is required. ++ (usaturate): Likewise. ++ (mpermw): Fix mask. ++ (-maddsl, -maddsub): Compute to-be-saturated value in wider mode. ++ (-maddsw, mmacfxwl, mmacnfx.wl, -mshaldsl, -mshaldsw): Likewise. ++ (-mshardl, -mshardw, -msubsl, -msubsub, -msubsw): Likewise. ++ (msadubq): Fix subword index in second operand of first subtraction. ++ ++2002-06-20 Hans-Peter Nilsson ++ ++ * sim-cpu.scm (gen-semantic-code): Prepend with setup-semantics ++ code. ++ ++2002-06-18 Dave Brolley ++ ++ * cpu/frv.cpu: New cpu description. ++ * cpu/frv.opc: New cpu support code. ++ ++2002-05-21 Dave Brolley ++ ++ * decode.scm (-opcode-slots): Don't consider bits beyond the ++ length of the insn. ++ ++2002-05-17 Johan Rydberg ++ ++ * cpu/powerpc.cpu: New file. ++ ++2002-05-01 Graydon Hoare ++ ++ * desc-cpu.scm (@arch@_cgen_cpu_close): Fix memory leaks. ++ ++2002-03-20 Hans-Peter Nilsson ++ ++ * doc/pmacros.texi (Symbol concatenation): Mention that .sym ++ results are expanded recursively. ++ ++2002-03-19 Hans-Peter Nilsson ++ ++ * pmacros.scm (-pmacro-expand,scan): If result is a symbol, ++ call scan-symbol on it, to enable recursive macro-expansion. ++ ++2002-01-25 Frank Ch. Eigler ++ ++ * sid-cpu.scm (-gen-hardware-types): Generate single hardware union ++ for multiple-isa configurations. ++ * sid-decode.scm (-gen-decode-fn): Tolerate empty insn list. ++ ++2002-02-04 Ben Elliston ++ ++ * cpu/sh.cpu, cpu/sh.opc: New files. ++ * cpu/sh64-comact.cpu, cpu/sh64-media.cpu: Likewise. ++ ++2002-01-29 Hans-Peter Nilsson ++ ++ * doc/rtl.texi: Fix typo: define-attr, not define-attribute. ++ (Enumerated constants): Mention that an ifield must not specify a ++ multi-ifield. ++ (Instruction operands): Ditto for index. ++ (Expressions) : Remove misplaced mention of local ++ variables. ++ : Mention that mode must be specified and non-VOID when the ++ result is used. ++ ++2002-01-28 Hans-Peter Nilsson ++ ++ * doc/porting.texi: When referring to *.opc, mention they are in ++ the cpu subdir. Call top-level directory toplevel, not devo. ++ Close string in define-normal-insn example. ++ ++ * doc/pmacros.texi: Fix .substr typo to .substring. ++ Mention that .sym expansions are not further expanded. ++ ++2002-01-22 Graydon Hoare ++ ++ * desc-cpu.scm (ifld-number-cache): Add. ++ (ifld-number): Add. ++ (gen-maybe-multi-ifld-of-op): Add. ++ (gen-maybe-multi-ifld): Add. ++ (gen-multi-ifield-nodes): Add. ++ (cgen-desc.c): Add call to gen-multi-ifield-nodes. ++ ++2002-01-10 matthew green ++ ++ * cpu/xstormy16.cpu (gr-Rbj-names): Rename this ... ++ (gr-Rb-names): ... to this. ++ (h-Rb): New hardware piece. ++ (h-Rbj): Use gr-Rb-names. ++ (Rb): Use h-Rb. ++ (holdx): New instruction. ++ ++2002-01-07 Ben Elliston ++ ++ * utils.scm (package-cygnus-simulators): Rename from this .. ++ (package-red-hat-simulators): .. to this. ++ * opcodes.scm (option-set!): Use package-red-hat-simulators. ++ * sid-cpu.scm (cgen-desc.h): Likewise. ++ (cgen-cpu.h): Likewise. ++ (cgen-defs.h): Likewise. ++ (cgen-write.cxx): Likewise. ++ (cgen-semantics.cxx): Likewise. ++ (cgen-sem-switch.cxx): Likewise. ++ * sid-decode.scm (cgen-decode.h): Likewise. ++ (cgen-decode.cxx): Likewise. ++ * sid-model.scm (cgen-model.cxx): Likewise. ++ * sid.scm (option-set!): Likewise. ++ * sim.scm (option-set!): Likewise. ++ ++2002-01-07 Ben Elliston ++ ++ * utils.scm (copyright-fsf): Add 2002. ++ (copyright-cygnus): Rename to copyright-red-hat. ++ (copyright-red-hat): Add 2002. ++ (CURRENT-COPYRIGHT): Update comment. ++ * opcodes.scm (option-set!): Update callers. ++ * sid-model.scm (cgen-model.cxx): Likewise. ++ * sid-cpu.scm: Likewise. ++ * sid-decode.scm: Likewise. ++ * sid.scm (option-set!): Handle "redhat" as an option for ++ "copyright"; use copyright-red-hat. ++ * sim.scm (option-set!): Likewise. ++ ++2002-01-03 Dave Brolley ++ ++ * decode.scm (-distinguishing-bit-population): Compute num-insns, the ++ number of insns in the list. Update the population count function to ++ identify and prioritize 3 catgories of useful bits. ++ (-population-top-few): Don't consider bits with a population count of ++ zero. ++ (-build-decode-table-entry): Don't call ++ filter-harmlessly-ambiguous-insns. Filter out non-specialized and ++ identical insns at the next tree level. ++ * insn.scm (filter-harmlessly-ambiguous-insns): Note in a comment that ++ this function is no longer used. ++ (filter-non-specialized-ambiguous-insns): New function. ++ (filter-identical-ambiguous-insns): New function. ++ (find-identical-insn): New function. ++ (filter-harmlessly-ambiguous-insns): Removed. ++ ++2001-11-26 Geoffrey Keating ++ matthew green ++ Frank Ch. Eigler ++ Nick Clifton ++ ++ * cpu/xstormy16.cpu: New file. ++ * cpu/xstormy16.opc: New file. ++ ++2001-11-26 Frank Ch. Eigler ++ ++ * doc/sim.texi, rtl.texi, porting.texi: Correct texinfo markup typos. ++ ++2001-11-14 Dave Brolley ++ ++ * utils-gen.scm (-gen-extract-word): Correct computation of the length ++ of the field being extracted. ++ ++2001-10-29 Johan Rydberg ++ ++ * doc/rtl.texi (Expressions): Document the (error ..), (sqrt ..), ++ (cos ...) and (sin ..) rtx. ++ ++2001-10-13 Nick Clifton ++ ++ * desc-cpu.scm: Do not include ctype.h in generated desc ++ files. They will inherit safe-ctype.h instead. ++ ++2001-10-08 Nick Clifton ++ ++ * desc-cpu.scm: Add missing function prototypes (for generated ++ C files). Fix compile time warning messages about unused ++ parameters (for generated C files). ++ * opc-asmdis.scm: The same. ++ * opc-ibld.c: The same. ++ * opc-itab.scm: The same. ++ * cpu/fr30.opc: The same. ++ * cpu/m32r.opc: The same. ++ * cpu/openrisc.opc: The same. ++ ++2001-09-17 graydon hoare ++ ++ * insn.scm (syntax-break-out): Correct logic in handling escaped ++ syntax characters. ++ ++2001-07-12 Jeff Johnston ++ ++ * opc-itab.scm (@arch@_cgen_init_opcode_table): Unconditionally ++ call @arch@_cgen_build_insn_regex now that regex support is in ++ libiberty. ++ ++2001-07-12 Frank Ch. Eigler ++ ++ * insn.scm (filter-harmlessly-ambiguous-insns): Fix msg typo. ++ (mask-superset?): Look for strict supersets to allow rejection of ++ duplicate insns. ++ ++2001-07-11 Frank Ch. Eigler ++ ++ * sid-cpu.scm (-gen-mach-params): New proc to emit ...CHUNK_BITSIZE... ++ (cgen-desc.h): Call it. ++ * sid-decode.scm (-gen-decode-fn): Use base-insn-bitsize as ++ decode-size. ++ * utils-sim.scm (-gen-decode-insn-entry): For SID only, prepare ++ entire_insn for extraction, if it's shorter than base-insn-bitsize. ++ ++2001-07-11 Frank Ch. Eigler ++ ++ * desc-cpu.scm (-gen-mach-table-defns): Emit fourth field: the ++ mach->cpu insn-chunk-bitsize. ++ (-gen-cpu-open): In @arch@_cgen_rebuild_tables, process above new ++ field toward CGEN_CPU_TABLE->insn_chunk_bitsize. ++ * mach.scm (): New field insn-chunk-bitsize. ++ (-cpu-parse, -cpu-read): Parse/initialize it. ++ * doc/rtl.texi (define-cpu): Document it. ++ ++2001-07-09 Geoffrey Keating ++ ++ * ifield.scm ( 'field-start): Don't look at word-len. ++ ++2001-07-06 Ben Elliston ++ ++ * opcodes.scm (read-cpu.opc): Read .opc files from subdir/cpu. ++ ++2001-07-05 Ben Elliston ++ ++ * README: Update. ++ ++ * read.scm (include): Include files from srcdir/cpu. ++ (-cgen): Likewise for loading .cpu files. ++ * sid.scm (sim-finish!): Read .sim files from srcdir/cpu. ++ * *.cpu: Move all cpu descriptions into cpu subdirectory. ++ * *.opc: Likewise. ++ * simplify.inc: Likewise. ++ ++2001-07-04 Ben Elliston ++ ++ * read.scm (include): Log "Including file" message at level 1, ++ rather than outputting it with (display). ++ (cpu-load): Log "Loading cpu description" and "Processing cpu ++ description" messages at levels 1 and 2, respectively, rather than ++ using (display). ++ ++2001-06-14 Geoffrey Keating ++ ++ * desc.scm ( 'gen-defn): Add extra zero into ++ CGEN_KEYWORD_ENTRY initializers. ++ ++ * gas-test.scm (gen-gas-test): Create 8 testcases, not just 5. ++ ( 'test-data): Involve both the index and the hardware ++ in testcase generation. ++ ( 'test-data): Generate test data from the underlying ++ object. ++ ( 'test-data): Generate test data by computing bit ++ patterns for the field, then decoding them. ++ ( 'test-data): Allow for new calling convention. ++ ( 'test-data): Likewise. ++ ( 'test-data): Convert index values into keywords. ++ ( 'test-data): Convert index values into integer strings. ++ ++ * gas-test.scm (cgen-build.sh): Escape '.' as well. ++ ++2001-06-01 Frank Ch. Eigler ++ ++ * rtl.scm (hw): Encode hw access mode into name, since this ++ is required for multi-mode hw types (memory). ++ ++2001-05-11 Ben Elliston ++ ++ * gas-test.scm (cgen-build.sh, gentest): Escape $ with a backslash ++ when generating allinsn.d from objdump output. Without it, the ++ testsuite will treat $ as the regular expression for end of line. ++ ++2001-05-09 Ben Elliston ++ ++ * doc/porting.texi (Doing a GAS port): Replace `cgen_opcode_open' ++ with `cgen_cpu_open'; documentation had become out of date. ++ * doc/rtl.texi (Instruction operands): Likewise. ++ ++2001-05-07 Frank Ch. Eigler ++ ++ * iformat.scm (compute-insn-base-mask-length): Rewrite to tolerate ++ various-base-length instruction sets. ++ ++2001-04-02 Ben Elliston ++ ++ * sid-cpu.scm (-last-insn): New function. ++ (-gen-sem-switch-engine): Loop through idesc while less than or ++ equal to the last instruction enum, not less than the MAX enum. ++ (-gen-sfrag-engine-fn): Clean up frag_label_table initialisation. ++ * sid-decode.scm (-gen-decode-insn-globals): Define the idesc ++ table's size to be the last instruction enum plus one, not ++ @PREFIX@_INSN_MAX. ++ * sid.scm (gen-cpu-insn-enum-decl): Do not append a dummy `max' ++ instruction onto the instruction list. ++ ++ * sim-decode.scm (@prefix@_init_idesc_table): Compute tabsize ++ using the size of the table and its elements. ++ (-gen-decode-insn-globals): Define the idesc table's size to be ++ the last instruction enum plus one, not @PREFIX@_INSN_MAX. ++ * sim-model.scm (-gen-mach-defns): Define CPU_MAX_INSNS as the ++ last instruction enum plus one, not @CPU@_INSN_MAX. ++ ++2001-03-28 Ben Elliston ++ ++ * doc/version.texi (UPDATED, EDITION): Update. ++ * doc/stamp-vti: Likewise. ++ ++2001-03-26 Ben Elliston ++ ++ * doc/credits.texi (Credits): Update. ++ ++ * gas-test.scm (,test-data): Prefix keywords by their ++ specified prefix and, if necessary, escape `$' in gas-build.sh to ++ prevent unwanted shell variable expansion. ++ ++2001-03-24 Ben Elliston ++ ++ * gas-test.scm (,test-data): Choose pseudo-random data. ++ (,test-data): Likewise. ++ (,test-data): Likewise. ++ (,test-data): Likewise. ++ (-collate-test-set): New function. ++ (build-test-set): Use it. ++ (gen-gas-test): Generate five test cases per instruction. ++ (cgen-allinsn.exp): Include "-*- Tcl -*-" in DejaGNU test file. ++ ++ * read.scm: Load "slib/random" if random is not defined. ++ * slib/random.scm: New file. ++ ++ * utils.scm: Remove comments about the Hobbit compiler. ++ (copyright-cygnus): Add 2001. ++ (package-cygnus-simulators): Replace "Cygnus" with "Red Hat". ++ (package-gnu-simulators): Tidy. ++ ++2001-03-23 Ben Elliston ++ ++ * cgen-gas.scm: Inline documentation improvements. ++ ++2001-03-21 Ben Elliston ++ ++ * opc-itab.scm (compute-syntax): Emit a parse error if an operand ++ given in a syntax string is undefined. ++ ++ * opc-itab.scm (compute-syntax): Emit a parse error if an operand ++ name is empty or invalid -- eg. "$(rs)" instead of "($rs)". ++ ++2001-03-20 Patrick Macdonald ++ ++ * desc-cpu.scm (@arch@_cgen_cpu_open): Correct machine calculation ++ for arg_type CGEN_CPU_OPEN_BFDMACH. ++ ++2001-03-20 Ben Elliston ++ ++ * opc-itab.scm (-gen-insn-enum): Do not append a dummy `max' ++ instruction onto the instruction list. Define MAX_INSNS to be the ++ value of the last instruction enum plus one. ++ ++2001-03-14 Nick Clifton ++ ++ * utils.scm (copyright-fsf): Add 2001. Remove (C). ++ ++2001-03-05 Dave Brolley ++ ++ * sim-decode.scm (-gen-extract-case): Generate declaration of "insn" ++ if the number of ifields is greater than zero. ++ ++2001-03-01 Frank Ch. Eigler ++ ++ * sid.cpu (-op-gen-set-trace[-parallel], -create-virtual-insns!): ++ Emit LIKELY/UNLIKELY branch probability hints. ++ * sid-decode.cpu (-gen-record-args): Ditto. ++ ++2001-02-02 Patrick Macdonald ++ ++ * desc-cpu.scm (-gen-hash-defines): Rename ++ CGEN_ACTUAL_MAX_SYNTAX_BYTES to CGEN_ACTUAL_MAX_SYNTAX_ELEMENTS. ++ ++2001-01-26 Frank Ch. Eigler ++ ++ * sid-cpu.scm (gen-parallel-exec-type): Use unsigned long long for ++ writeback tracking. ++ (-gen-write-fn, -gen-sem-case, -gen-sfrag-case): Ditto. ++ * sid-decode.scm (-gen-scache-decls): Exclude writeback tracking field ++ if unnecessary. ++ * sid.scm ( gen-write): Use unsigned long long expression ++ for writeback. ++ (-op-gen-set-trace, -op-gen-set-trace-parallel): Ditto. ++ ( gen-profile-code): Ditto. ++ ++2001-01-23 Johan Rydberg ++ ++ * doc/rtl.texi (Expressions): Document the (index-of ...) and ++ (regno ...) rtx. ++ ++2001-01-08 Frank Ch. Eigler ++ ++ * operand.scm ( pretty-sem-name): New field. ++ ( make): Initialize it from hw-name. ++ (op:set-pretty-sem-name!): New function. ++ ( gen-pretty-name): Default to fetching new field. ++ * rtl.scm (hw): Copy hw-name to pretty-sem-name instead. Restore ++ sem-name setting from -rtx-hw-name. ++ ++2001-01-08 Frank Ch. Eigler ++ ++ * rtl.scm (hw): Copy hw-name to new operand's sem-name, to simplify ++ its subsequent gen-pretty-name. ++ ++ * read.scm: Increase thread working stack limit and backtrace ++ depth limits. ++ ++2001-01-08 Frank Ch. Eigler ++ ++ * doc/rtl.texi: Deprecate and depreciate the decode-assist construct. ++ ++2001-01-06 Johan Rydberg ++ ++ * openrisc.cpu (or32): Setup semantics for h-delay-insn to ++ current insn plus 4. ++ (h-delay-insn): New hardware register. ++ (l-jal): Uses h-delay-insn instead of pc when setting link register. ++ (l-jalr): Likewise. ++ (l-bal): Likewise. ++ ++ * openrisc.opc (parse_hi16): Sign extend value. ++ (parse_lo16): Likewise. ++ ++2001-01-06 Ben Elliston ++ ++ * utils-gen.scm (gen-sfmt-enum-decl): Use @prefix@ and @PREFIX@ ++ instead of @cpu@ and @CPU@ to generically prefix symbol names. ++ * sim-cpu.scm (-gen-sem-fn-table-entry): Likewise. ++ (-gen-semantic-fn-table): Likewise. ++ (-gen-scache-semantic-fn): Likewise. ++ (-gen-no-scache-semantic-fn): Likewise. ++ (cgen-read.c): Likewise. ++ (cgen-sem-switch.c): Likewise. ++ * desc-cpu.scm (cgen-desc.c): Use @arch@, not @prefix@, since this ++ is a filename prefix. ++ * sim-decode.scm (IDESC-TABLE-VAR): Use @prefix@, et al. ++ (-gen-decode-insn-globals): Likewise. ++ (-gen-idesc-decls): Likewise. ++ (cgen-decode.h): Likewise. ++ (cgen-decode.c): Likewise. ++ * sim.scm (gen-cpu-insn-enum-decl): Likewise. ++ (gen-cpu-insn-enum): Likewise. ++ (sim-finish!): Likewise. ++ ++2001-01-05 Johan Rydberg ++ ++ * openrisc.cpu: New file. ++ * openrisc.opc: Likewise. ++ ++2000-12-12 Ben Elliston ++ ++ * doc/rtl.texi (Expressions): Document the (delay ..) rtx. ++ ++2000-12-07 Ben Elliston ++ ++ * sim-decode.scm (-gen-extract-case): Do not emit a definition for ++ "insn" when there are zero ifields to extract. ++ ++2000-12-04 Frank Ch. Eigler ++ ++ * utils-sim.scm (gen-define-argbuf-macro): Handle sfmt=#f case, to be ++ used by simple/non-scache simulators. ++ * sim-cpu.scm (-gen-read-case): Call gen-define/undef-field-macro ++ regardless of with-scache?. ++ (-gen-write-case, -gen-no-scache-semantic-fn, -gen-sem-case): Ditto. ++ ++2000-12-03 Ben Elliston ++ ++ * desc-cpu.scm (cgen-desc.h): Clarify generated filenames. ++ (cgen-desc.c): Likewise. ++ ++2000-12-01 Greg McGary ++ ++ * desc.scm (,gen-defn): Prepend prefix to keyword names. ++ ++2000-12-01 Ben Elliston ++ ++ * sim-cpu.scm (cgen-cpu.h): Only emit argbuf, scache and extract ++ definitions if run without with-multipla-isa?. ++ (cgen-defs.h): New function. Emit an ISA-specific defs file. ++ * cgen-sim.scm (sim-arguments): Accept -G option to generate defs. ++ ++2000-11-24 Ben Elliston ++ ++ * sim-cpu.scm (-gen-hardware-struct): New function. ++ (-gen-hardware-types): If with-multiple-isa is specified, emit all ++ hardware elements wich have share one or more ISAs with the ISAs ++ being kept. ++ ++ * sim.scm (-with-multiple-isa?): New symbol. ++ (with-multiple-isa?): New function. ++ (option-init!): Initialise -with-multiple-isa?. ++ (option-set!): Handle with-multiple-isa option. ++ ++2000-11-21 Ben Elliston ++ ++ * utils.scm (copyright-fsf): Add the year 2000. ++ ++2000-11-20 Frank Ch. Eigler ++ ++ * opc-itab.scm (-gen-ifmt-table, -gen-macro-insn-table: Remove ++ unneeded "\n\n" from F() macro definition. ++ ++2000-11-15 Greg McGary ++ ++ * utils-cgen.scm (gen-define-with-symcat): New function. ++ * desc-cpu.scm (gen-ifld-defns): Use it. ++ (gen-hw-table-defns): Use it. ++ (-gen-hash-defines): Use it. ++ (gen-operand-table): Use it. ++ (gen-insn-table): Use it. Remove spurious `#undef MNEM'. ++ * opc-itab.scm (-gen-ifmt-table): Use it. ++ (-gen-insn-opcode-table): Use it. ++ (-gen-macro-insn-table): Use it. ++ * opc-opinst.scm (-gen-operand-instance-tables): Use it. ++ * sim-cpu.scm (cgen-semantics.c): Use it. ++ (cgen-sem-switch.c): Use it. ++ ++2000-11-10 Frank Ch. Eigler ++ ++ * utils-sim.scm (-gen-decode-insn-entry): Add fn? parameter to signal ++ request to emit calls to insn extractors as functions rather than ++ branches to inline blocks. ++ (-gen-decode-expr-set-itype, -gen-decode-expr-entry): Ditto. ++ (-gen-decode-table-entry, -gen-decoder-switch, gen-decoder): Ditto. ++ ++ * sim-decode.c (-gen-decode-fn): Tell (gen-decode) to emit branches ++ to extractor clauses. ++ ++2000-11-10 Frank Ch. Eigler ++ ++ * decode.scm (-distinguishing-bit-population): Significantly ++ improve popularity heuristic. Renamed from ++ (-mask-bit-population): Gone. ++ (-population-above-threshold): Sort new bit numbers in order of ++ popularity. ++ (-population-top-few): Allow up to three more bits to be selected ++ than requested. Correct selection order to prefer better bits. ++ Correct bug in fewer-than-requested case. Keep threshold as ++ floating-point. ++ (decode-best-get-bits): Pass also the insn-values. ++ ++ * utils-sim.scm (-gen-decoder-switch): Add comment suggesting a ++ future optimization. ++ ++ * utils.scm (message): Format nested lists better. ++ ++2000-11-09 Doug Evans ++ ++ * dev.scm: Add srcdir to %load-path. ++ ++ * rtx-funcs.scm (subword): Mode of argument can be different ++ than mode of result, so don't use OP0 to specify argument's mode. ++ ++2000-11-02 Ben Elliston ++ ++ * doc/porting.texi (Building a GAS test suite): Document my change ++ to gas-build.sh. ++ ++2000-11-01 Ben Elliston ++ ++ * sim-test.scm (cgen-build.sh): Include "-*- Asm -*-" in test cases. ++ ++2000-10-31 Ben Elliston ++ ++ * gas-test.scm (cgen-build.sh): Allow the generated script to run ++ with no command line arguments if the gas build directory can be ++ determined. ++ ++2000-10-26 Doug Evans ++ ++ * insn.scm (-parse-insn-format-symbol): Fix spelling error, ++ op-ifld -> op-ifield. ++ ++2000-10-23 Frank Ch. Eigler ++ ++ * thumb.scm (cc-tests): Add (ISA thumb) attribute. ++ ++2000-10-13 matthew green ++ ++ * utils-cgen.scm (get-ifetch): Move from here ... ++ * sim.scm (get-ifetch): ... to here. ++ * sid.scm (get-ifetch): Copy and port to c++. ++ ++2000-10-06 Dave Brolley ++ ++ * utils-gen.scm (-gen-ifld-extract-base): Compute start position as ++ ifld-start + ifld-word-offset. ++ (gen-ifld-extract): Check adata-integral-insn? before checking whether ++ the field is beyond the base number of bits. ++ (gen-define-ifields): Use a base-length of 32 if adata-integral-insn?. ++ (gen-extract-ifields): Ditto. ++ * gas-test.scm (gentest): Generate backslashes before '[' and ']' ++ characters in the regular expression. ++ ++2000-10-02 Frank Ch. Eigler ++ ++ * desc-cpu.scm: (gen-operand-decls): Emit MAX_OPERANDS as a ++ preprocessor constant. ++ ++2000-09-21 Frank Ch. Eigler ++ ++ * slib/logical.scm: New file from slib. Provides robust bitwise ++ logical operations for large integers. ++ * read.scm: maybe-load it. ++ ++2000-09-15 Frank Ch. Eigler ++ ++ * enum.scm (define-full-insn-enum): Filter with keep-isa predicate. ++ * ifield.scm (-ifield-parse, -multi-ifield-parse): No longer assert ++ single-isa predicate, but support keep-isa filtering. ++ ++2000-09-08 Frank Ch. Eigler ++ ++ * rtl-c.scm (s-sequence): Handle nested c-calls in both ++ statement-expression and comma-expression contexts. ++ (s-c-call, s-c-raw-call): Add warning comment about bad assumption. ++ ++2000-09-08 Frank Ch. Eigler ++ ++ * decode.scm (-population-top-few): Signal error gracefully if ++ decoding is about to become ambiguous. ++ ++2000-09-06 Frank Ch. Eigler ++ ++ * doc/rtl.texi (decode-assist): Describe this field as optional. ++ ++2000-09-06 Frank Ch. Eigler ++ ++ * utils-gen.scm (gen-multi-ifld-extract): Handle case of multi-ifield ++ with decode proc. ++ ++2000-09-05 Dave Brolley ++ ++ * sim.scm (sim-finish!): Honour the definition of FAST_P when calling ++ @cpu@_pbb_begin. Use 0 if FAST_P is not defined. ++ ++2000-08-29 Dave Brolley ++ ++ * utils-gen.scm (gen-ifld-extract): Pass total-len if ++ adata-integral-insn is true for this architecture. ++ ++2000-08-24 Frank Ch. Eigler ++ ++ * hardware.scm ( get-index-mode): Define method. ++ * operand.scm ( gen-pretty-name): Tolerate no op:sem-name. ++ * rtl-c.scm (-c-rtl-get): Improve an error message. ++ * sim.scm (-op-gen-set-trace): Support lvalues. ++ ++2000-08-22 Frank Ch. Eigler ++ ++ * Makefile.in (DIST_COMMON): Regenerated. ++ * ifield.scm ( needed-iflds): New method. ++ * iformat.scm (-ifmt-lookup-sfmt!): Use base ifields for ++ sfmts built from s. ++ * operand.scm (-derived-parse-encoding): Give a fixed ++ type symbol 'derived-ifield, not an unparseable string. ++ * utils-sim.scm (op-needed-iflds) Handler 'derived-ifield case. ++ (-sfmt-contents): Add tracing. ++ ++ From Doug Evans : ++ * sim.scm ( cxmake-get): Result is a , not a string of ++ C code. ++ ++2000-08-20 Doug Evans ++ ++ * rtl-c.scm (rtl-c-expr-with-estate): New fn. ++ (rtl-c-expr-parsed,rtl-c-expr): New fns. ++ (-rtl-c-get): Rename from rtl-c-get. ++ (rtl-c-get): New fn for getter logging. ++ ++2000-07-28 Ben Elliston ++ ++ * NEWS: Update. ++ ++2000-07-25 Ben Elliston ++ ++ * doc/credits.texi (Credits): Add Frank Eigler. ++ ++2000-07-24 Dave Brolley ++ ++ * opc-itab.scm (gen-insn-opcode-table): Initialize the first element ++ fully. ++ * desc.scm (gen-attr-table-defn): Initialize all elements fully. ++ (): Initialize all elements fully. ++ * desc-cpu.scm (-gen-isa-table-defns): Initialize the last element ++ fully. ++ (-gen-mach-table-defns): Ditto. ++ (-gen-ifld-defns): Ditto. ++ (-gen-operand-table): Ditto. ++ (-gen-insn-table): Ditto. ++ (-gen-cpu-open): Nothing to do for the mach table. ++ ++2000-07-13 Ben Elliston ++ ++ * doc/version.texi (UPDATED): Update. ++ ++2000-07-05 Ben Elliston ++ ++ * configure.in (AC_PATH_PROG): Remove. ++ * configure: Regenerate. ++ * Makefile.am (GUILE): Locate guile dynamically. ++ * Makefile.in: Regenerate. ++ * doc/Makefile.in: Likewise. ++ ++2000-07-03 Ben Elliston ++ ++ * desc-cpu.scm (cgen-desc.c): Include "libiberty.h". ++ * opc-itab.scm (cgen-opc.c): Likewise. ++ ++2000-06-28 Frank Ch. Eigler ++ ++ * rtl.scm (-rtx-traverse-locals): Correct call to `symbol?' for ++ guile 1.4 compatibility. ++ (rtx-env-dump): Comment out buggy display calls. ++ ++2000-06-15 matthew green ++ ++ * opc-itab.scm (-gen-ifmt-table-1): Add extra braces to pacify GCC. ++ ++2000-06-14 Frank Ch. Eigler ++ ++ * Makefile.in: Regenerated. ++ ++ * desc-cpu.scm (gen-ifld-decls): Exclude derived ifields. ++ (gen-ifld-defns): Ditto. ++ * pgmr-tools.scm (pgmr-pretty-print-insn-format): Ditto. ++ * rtl.c (rtl-finish!): Ditto. ++ * opc-itab.scm (-gen-ifield-decls): Ditto. ++ * opcodes.scm (gen-switch): Exclude derived operands. ++ * operand.scm (op-iflds-used): Expand derived operands. ++ (hw-index-derived): New dummy function to create dummy object. ++ (-derived-operand-parse): Fix mode arg passed to ++ constructor. Set object's hw-name and index fields. ++ (-anyof-merge-subchoices): Set instance object's index also. ++ (-anyof-name): New helper function. ++ (anyof-merge-semantics): Correct replacement of operand names in ++ anyof instance. ++ (op-ifield): Tolerate derived-operands and their funny indices better. ++ * ifield.scm (ifld-known-values): Expand derived ifields. ++ (non-multi-ifields, non-derived-ifields): New utility functions. ++ (ifld-decode-mode): Tolerate objects with unbound decode field. ++ * iformat.scm (compute-insn-length): Expand derived ifields. ++ (compute-insn-base-mask): Ditto. ++ * insn.scm (insn-base-ifields): Remove. ++ (): Add iflds-values entry to cache ifld-base-ifields values. ++ (insn-value): Call ifld-base-ifields and ifld-constant? instead. ++ * mach.scm (arch-analyze-insns!): Exclude multi-insns. ++ * sem-frags.scm (sim-sfrag-analyze-insns!): Ditto. ++ (-frag-test-data): Ditto. ++ * sid-cpu.scm (cgen-write.cxx,-gen-sem-switch): Ditto. ++ (-gen-sem-switch-engine); Ditto. ++ * sid-model.scm (-gen-model-insn-fns, -gen-model-timing-table): Ditto. ++ * sid-decode.scm (cgen-decode.h, cgen-decode.cxx): Ditto. ++ (-gen-record-args): Tolerate unbound op-ifield. ++ * sid.scm ( cxmake-get): New sketch implementation. ++ (-gen-arch-model-decls, scache-engine-insns, pbb-engine-insns): ++ Exclude multi-insns. ++ * sim-decode.scm (cgen-decode.h, cgen-decode.cxx): Ditto. ++ * utils-sim.scm (op-extract?): Handle derived operands. ++ ++ * gas-test.scm (cgen-build.sh): Quote '*' chars printed by objdump. ++ * semantics.scm (-build-operand!): Handle 'DFLT case during parsing. ++ * hardware.scm (hardware-for-mode): New function. ++ ++ * insn.scm (filter-harmlessly-ambiguous-insns): New function for ++ cleaning up decode tables. ++ (mask-superset?): Little helper function for above. ++ * decode.scm (-build-decode-table-entry): Call it. ++ (-opcode-slots): Add some more tracing. ++ * arm.cpu: Disable decode-splits construct due to implementation ++ conflict with `filter-harmlessly-ambiguous-insns' ++ ++ * decode.scm (-population-top-few): New function for better decode ++ bit generation. Includes minor helper functions. ++ (decode-get-best-bits): Call it instead. ++ (OLDdecode-get-best-bits): Renamed previous version of above. ++ ++ ++2000-06-13 Ben Elliston ++ ++ * configure.in: Use AC_EXEEXT with Cygnus mode. Remove AC_ARG_WITH ++ for the Guile library directory. ++ * configure: Regenerate. ++ * Makefile.in, doc/Makefile.in: Regenerate. ++ ++ * Makefile.in, doc/Makefile.in: Regenerate. ++ * configure.in: Remove unnecessary tests. Move to version 1.0. ++ * acconfig.h, config.in: Remove. ++ * configure, aclocal.m4: Regenerate. ++ * doc/stamp-vti, doc/version.texi: Likewise. ++ * AUTHORS: New file. ++ ++2000-06-07 Ben Elliston ++ ++ * fixup.scm (symbol-bound?): Reduce debugging output. ++ ++2000-06-02 matthew green ++ ++ * insn.scm (insn-base-ifields): Returns all the instruction fields for ++ a given instruction, replacing derived fields with their subfields. ++ (insn-value): Use `insn-base-ifields' to find all constant values. ++ (multi-insn-instantiate!): Comment some debug messages. ++ ++2000-06-01 Ben Elliston ++ ++ * doc/rtl.texi (Expressions): Document a hazard with the choice of ++ symbol names used in a (c-call ..) rtx. ++ ++ * sim-test.scm (build-test-set): Return (()) for an instruction ++ with no operands, so it too is included in the generated test set. ++ ++2000-05-31 Ben Elliston ++ ++ * Makefile.am (gas-test): Ensure $(ISA) is not empty. ++ (sim-test): Likewise. ++ * Makefile.in: Regenerate. ++ ++2000-05-30 Frank Ch. Eigler ++ ++ * read.scm (-cgen): In debugging mode (-b), ask guile for untruncated ++ stack traceback, in an order that resembles gdb's `bt'. ++ ++2000-05-24 Frank Ch. Eigler ++ ++ * desc-cpu.scm (-gen-hash-defines): Use ifmt-ifields again. ++ * opc-itab.scm (-gen-ifmt-table-1): Ditto. ++ * gas-test.scm (gas-test-analyze!, cgen-build.sh): Filter out ++ multi insns. ++ * ifield.scm (multi-ifield): Define workable field-mask and field-value ++ virtual functions. ++ (ifld-base-ifields): New routine to replace ifmt-expanded-ifields. ++ * iformat.scm (ifmt-expanded-ifields): Gone. ++ (ifields-base-ifields): New function. Call ifld-base-ifields for real ++ work. ++ (-ifmt-lookup-ifmt!): Use it to expand derived/multi combos in new ++ ifmt entries. ++ ++ * opcodes.scm (multi-ifield gen-extract): Correct spacing in generated ++ code. ++ ++2000-05-23 Frank Ch. Eigler ++ ++ * sid.scm (with-any-profile?): New function clone. ++ ++2000-05-19 Frank Ch. Eigler ++ ++ * utils-gen.scm (gen-multi-ifld-extract): Fix decode hook for sim. ++ ++2000-05-18 Frank Ch. Eigler ++ ++ * ifield.scm (-multi-ifield-parse): Add encode/decode args. ++ (-multi-ifield-read): Parse them. ++ (define-full-multi-ifield): Pass #f/#f as defaults for them. ++ * opcodes.scm (multi-ifield gen-insert): Add encode hook. ++ (multi-ifield gen-extract): Add decode hook. ++ * utils-gen.scm (gen-multi-ifld-extract): Add decode hook for sim. ++ ++ * insn.scm (syntax-break-out): More correctly handle \-escaped ++ syntax characters. ++ (syntax-make-elements): Ditto. ++ * opc-itab.scm (compute-syntax): Ditto. ++ ++2000-05-17 Ben Elliston ++ ++ * gas-test.scm (cgen-build.sh): Log the correct script filename. ++ ++2000-05-15 Frank Ch. Eigler ++ ++ * gas-test.scm (build-test-set): Return (()) for an instruction ++ with no operands, so it too is included in the generated test set. ++ ++2000-05-15 Frank Ch. Eigler ++ ++ * desc-cpu.scm (-gen-hash-defines): Define CGEN_ACTUAL_MAX values for ++ IFMT_OPERANDS and SYNTAX_BYTES. ++ ++2000-05-15 Frank Ch. Eigler ++ ++ * sim.scm (with-any-profile?): New function. ++ * utils-sim.scm (-sfmt-contents): Use above instead of `with-profile?' ++ to decide whether or not to include profiling counters. ++ ++2000-05-10 Frank Ch. Eigler ++ ++ Fuller derived-operand support for opcodes. ++ * insn.scm (non-multi-insns): New filter to oppose `multi-insns'. ++ * desc-cpu.scm (-define-hash-defines): Compute CGEN_MAX_SYNTAX_BYTES. ++ Correctly compute ..._IFMT_OPERANDS. Omit useless ..._INSN_OPERANDS. ++ (gen-operand-table): Omit derived- and anyof- operands from table. ++ (gen-insn-table): Omit multi-insns from table. ++ * iformat.scm (ifmt-expanded-fields): New function to expand ++ subfields of derived-ifields. ++ (ifmt-compute!): Ignore remaining multi-insns. ++ * mach.scm (isa-min-insn-bitsize, isa-max-insn-bitsize): Ignore ++ multi-insns. ++ * opc-itab.scm (-gen-ifmt-table-1): Use ifmt-expanded-ifields. ++ (-gen-insn-enum, -gen-insn-opcode-table): Ignore multi-insns. ++ * opcodes.scm (derived-operand): Define abort()ing gen-insert, ++ gen-extract, gen-fget, gen-fset, gen-parse, gen-print functions. ++ (gen-switch): Omit anyof-operands. ++ * operand.scm (-anyof-syntax): New function. ++ (-anyof-merge-syntax): Call it. ++ * utils.scm (collect): New idiomatic function. ++ ++2000-05-10 Ben Elliston ++ ++ * m68k.cpu: New file (work in progress). ++ ++2000-05-05 Frank Ch. Eigler ++ ++ * Makefile.am (all-local): New target. Create stamp-cgen. ++ * Makefile.in: Regenerated. ++ * doc/Makefile.in: Regenerated. ++ ++2000-04-26 Frank Ch. Eigler ++ ++ * operand.scm (-operand-g/setter-syntax): Correct off-by-one error. ++ (-operand-parse-setter): Ditto. ++ * utils-sim.scm (needed-iflds): Store ifield (index) in argbuf, even ++ for CACHE-ADDR operands. ++ * sid-decode.scm (-gen-record-args): Remove newly duplicated extract ++ trace entries. Widen byte-wide values for printing. ++ * sid.scm (-op-gen-set-trace): Enhance result trace with op indices. ++ Widen byte-wide values for printing. Hexify memory addresses. ++ ++2000-04-23 matthew green ++ ++ * m32r.cpu: Fix a typo. ++ ++Fri Apr 21 22:18:48 2000 Jim Wilson ++ ++ * ia64.cpu (define-model): Change merced to Itanium. ++ (f-qp): Change quilifying to qualifying. ++ (movbr_ph, movbr_pvec): Delete. ++ (I-I21): Delete uses of movbr_ph and movbr_pvec. ++ ++2000-04-07 Ben Elliston ++ ++ * doc/porting.texi (Building a simulator test suite): Clarify ++ where generated test cases are placed. ++ ++2000-04-07 Ben Elliston ++ ++ * Makefile.am (gas-test): Remove dependency on `cgen'. ++ (sim-test): Ditto. ++ * Makefile.in: Regenerate. ++ ++2000-04-04 Frank Ch. Eigler ++ ++ * hardware.scm ( parse): Allow user to set type for pc register. ++ * mode.scm (mode-finish!): Add placeholder code for mach-dependent ++ type reconfiguration. ++ * utils-sim.scm (-sfmt-contents): Add profile-counters only if ++ with-profile?. ++ ++2000-03-30 Ben Elliston ++ ++ * doc/rtl.texi (Enumerated constants): Add concept index entries. ++ ++2000-03-24 Ben Elliston ++ ++ * Makefile.am (stamp-cgen): Reinstate target. ++ * Makefile.in: Regenerate. ++ ++2000-03-22 Ben Elliston ++ ++ * slib/ppfile.scm: Remove; unused. ++ * slib/defmacex.scm: Likewise. ++ ++2000-03-21 Ben Elliston ++ ++ * doc/internals.texi (Source file overview): Document. ++ ++ * Makefile.am (GUILEDIR): Remove. ++ (CGEN): Ditto. Callers use $(GUILE) instead. ++ (GUILEFLAGS): Ditto. ++ (CGENFILES): Ditto. ++ (APPDESCFILES): Ditto. ++ (OPCODESFILES): Ditto. ++ (SIMFILES): Ditto. ++ (pkgdata_SCRIPTS): Ditto. ++ (stamp-cgen): Remove target. ++ * Makefile.in: Regenerate. ++ ++ * configure.in: Remove header and library tests. ++ * configure: Regenerate. ++ * config.in: Likewise. ++ ++2000-03-20 Ben Elliston ++ ++ * read.scm: Cease loading "hob-sup.scm". ++ * utils.scm: Inherit the fastcall family of procedures (for now). ++ * hob-sup.scm: Remove. ++ ++2000-03-20 Ben Elliston ++ ++ * configure.in (AC_OUTPUT): Do not emit .gdbinit. ++ * configure: Regenerate. ++ * gdbinit.in: Remove. ++ ++2000-03-17 Ben Elliston ++ ++ * Makefile.am (CGEN): Use guile, not cgen. ++ (CGENCFLAGS, LIBIBERTY, INCLUDES): Remove. ++ (bin_PROGRAMS, cgen_SOURCES): Likewise. ++ (CGENFILES): Fold CGEN_HOB_INPUT_FILES and CGEN_NOHOB_FILES. ++ (HOBBIT_INPUT_FILES, HOBBIT_OUTPUT_FILE): Remove. ++ (HOB_OBJS): Likewise. ++ (CGEN_HOB_SRC, CGEN_HOB_OBJ): Likewise. ++ (CGENOBJS): Likewise. ++ (cgen_DEPENDENCIES, cgen_LDFLAGS, cgen_LDADD): Likewise. ++ (hobbit, hobbit.o, hobbit.c): Remove targets. ++ (cos.o, cgen.o, cgen-gh.o, hob-sup.o): Likewise. ++ (CLEANFILES): Update. ++ * acconfig.h (WITH_HOBBIT): Remove. ++ * configure.in: Do not test for 3 arg scm_make_vector. Remove ++ option --with-cgen-hobbit. ++ * cos.h, cos.c, hob-main.c, hob-sup.c, hob-sup.h, hob.sh: Remove. ++ * cgen-gh.h, cgen-gh.c, cgen-hob.scm, cgen.c: Likewise. ++ * hobbit.c, hobbit.h, hobbit.scm: Likewise. ++ * hobscmif.h, hobslib.scm, scmhob.h: Likewise. ++ * Makefile.in: Regenerate. ++ * config.in: Likewise. ++ * aclocal.m4: Likewise. ++ * configure: Likewise. ++ * README (Hobbit support): Remove. ++ * doc/internals.texi (Conventions): Do not mention Hobbit. ++ * doc/porting.texi (Supported Guile versions): Likewise. ++ ++2000-03-16 Frank Ch. Eigler ++ ++ * sid-cpu.scm (-gen-sem-switch-engine): Adjust calling & ++ callback convention to new sid sidutil::basic_cpu code. ++ (-gen-sfrag-engine-fn): Ditto. ++ * sid.scm (-create-virtual-insns!): Ditto. ++ (-hw-gen-set-quiet-pc): Mark delay slot execution specially in pbb ++ mode. ++ (cxmake-skip): Implement properly for pbb mode. ++ ++2000-03-03 Ben Elliston ++ ++ * doc/internals.texi: New file. ++ ++2000-02-29 Ben Elliston ++ ++ * doc/rtl.texi (Derived operands): Remove unnecessary footnote. ++ * doc/porting.texi: Formatting tweaks. ++ ++2000-02-25 Nick Clifton ++ ++ * desc-cpu.scm (*_cgen_cpu_open): Initialise signed_overflow_ok_p ++ field. ++ ++Thu Feb 24 14:09:01 2000 Doug Evans ++ ++ * operand.scm (,make!): Initialize mode-name, not ++ mode. ++ ++2000-02-23 Andrew Haley ++ ++ * m32r.cpu (pcmpbz): Make pcmpbz a special (i.e. hidden) ++ instruction. ++ ++2000-02-24 Ben Elliston ++ ++ * doc/rtl.texi (Derived operands): Add some cindex entries. ++ ++2000-02-23 Ben Elliston ++ ++ * ia32.cpu (dndo): Move general purpose macro from here .. ++ * simplify.inc (dndo): .. to here. ++ ++2000-02-18 Frank Ch. Eigler ++ ++ * arm.cpu (h-tbit): Add c-call setter function. ++ (h-mbits): Ditto. ++ ++2000-02-17 Frank Ch. Eigler ++ ++ * sem-frags.scm (-frag-hash-compute!): Add appstuff arg for traversal. ++ (-frag-cost-compute!): Ditto. ++ * utils.scm (copyright-cygnus): Add Y2K. ++ * sid-cpu.scm (@prefix@_pbb_run): Add unsigned& argument. ++ ++2000-01-25 Nick Clifton ++ ++ * desc-cpu.scm (@arch@_cgen_cpu_open): Add code to initialise ++ flags field of the CGEN_CPU_TABLE structure. ++ ++Sun Dec 12 14:20:36 1999 Doug Evans ++ ++ * operand.scm (): Renamed from . ++ All references updated. ++ ++Tue Nov 30 11:06:22 1999 Doug Evans ++ ++ * ia32.cpu: Rewrite addressing mode support. ++ ++ * ifield.scm (): New member `follows'. ++ (ifld-known-values): New proc. ++ (): New method set-word-offset!. ++ (ifld-set-word-offset!): New proc. ++ (ifld-new-word-offset): New proc. ++ (): New method next-word. ++ (): New method next-word. ++ (ifld-next-word): New proc. ++ (ifld-precedes?): New proc. ++ (-ifield-parse): New args word-offset,word-length,follows. ++ All callers updated. Handle CISC-style vs RISC-style ifields. ++ (-ifield-read): Recognize word-offset,word-length,follows specs. ++ (-ifld-parse-follows): New proc. ++ (-multi-ifield-make-default-insert): New proc. ++ (-multi-ifield-make-default-extract): New proc. ++ (-multi-ifield-parse): Provide default values for insert,extract ++ handlers if not specified. ++ (): New class. ++ (derived-ifield?): New predicate. ++ (ifld-derived-operand?): New predicate. ++ (f-anyof): New global. ++ (ifld-anyof?,ifld-anyof-operand?): New predicates. ++ (f-derived,ifld-derived?): Delete. ++ (ifield-builtin!): Delete init of f-derived. Init f-anyof. ++ * insn.scm (-sub-insn-ifields): New proc. ++ (-sub-insn-make!): New proc. ++ (multi-insn-instantiate!): Provide initial implementation. ++ (-insn-parse): If insn contains "anyof" operands, create a ++ object instead of a plain . ++ (-parse-insn-format-symbol): Rewrite derived operand handling. ++ Add anyof operand handling. ++ (-parse-insn-format-ifield-spec): Rewrite. ++ (-parse-insn-format-operand-spec): Delete. ++ (-parse-insn-format-list): Delete support for `(operand value)'. ++ (anyof-operand-format?): Replaces derived-operand-format?. ++ * operand.scm (-operand-parse-getter): Improve error messages. ++ (-operand-parse-setter): Ditto. ++ (): New members args,syntax,base-ifield,encoding, ++ ifield-assertion. ++ (): Change baseclass from to ++ . Delete member values. New members base-ifield,choices. ++ (anyof-operand?): New predicate. ++ (-derived-parse-encoding,-derived-parse-ifield-assertion): New procs. ++ (-derived-operand-parse): Rewrite. ++ (-derived-operand-read): Rewrite. ++ (-anyof-parse-choice): New proc. ++ (-anyof-operand-parse): Rewrite. ++ (-anyof-operand-read,define-anyof-operand): New procs. ++ (): Rewrite. ++ (-anyof-initial-known): New proc. ++ (anyof-satisfies-assertions?): New proc. ++ (-anyof-merge-syntax,-anyof-merge-encoding): New procs. ++ (-anyof-merge-getter,-anyof-merge-setter): New procs. ++ (-anyof-merge-semantics,-anyof-merge-ifield-assertion): New procs. ++ (-anyof-merge-subchoices,-anyof-all-subchoices): New procs. ++ (-anyof-value-from-derived): New proc. ++ (-anyof-all-choices-1,anyof-all-choices): New procs. ++ (operand-init!): Create define-anyof-operand reader command. ++ ++ * insn (syntax-break-out): Take syntax as argument instead of insn. ++ All callers updated. ++ (syntax-make): Move here, from ???. ++ ++ * types.scm (): Rename accessors from bitrange:foo to ++ bitrange-foo. All uses updated. ++ (bitrange-next-word): New proc. ++ ++ * semantics.scm (-solve-expr-fn,rtx-solve): New procs. ++ ++ * rtl.scm (rtx-canonicalize): Provide initial implementation. ++ (rtx-make-const,rtx-make-enum): New procs. ++ (rtx-arg1,rtx-arg2): Renamed from -rtx-arg[12]. All callers updated. ++ (rtx-mem-addr,rtx-mem-sel): New procs. ++ (rtx-change-address): New proc. ++ (rtx-make-ifield,rtx-make-operand,rtx-make-local): New proc. ++ (rtx-make-set,rtx-single-set?): New procs. ++ (rtx-combine): New proc. ++ ++ * rtl.scm (rtx-traverse): New arg `appstuff'. All callers updated. ++ (rtx-traverse-with-locals): Ditto. ++ (-rtx-traverse,-rtx-traverse-*): Ditto. ++ ++ * rtl.scm (define-subr): New proc. ++ (rtl-init!): Create reader command `define-subr'. ++ ++ * cos.c (_object_mi_p): Ensure argument is an object. ++ (indent): New function. ++ (_object_print_elms): Add pretty-printing support. ++ (_object_print): Ditto. ++ ++ * hobbit.scm (*reckless-s->c-fun-table*): Add fastcall7. ++ (*floats-s->c-fun-table*): Ditto. ++ * hobbit.c,hobbit.h: Rebuild. ++ * hob-sup.c (fastcall7): New proc. ++ * hob-sup.h (fastcall7): Declare. ++ * hob-sup.scm (fastcall7): New macro. ++ ++ * mach.scm (): New member subr-list. ++ (current-subr-list,current-subr-add!,current-subr-lookup): New procs. ++ (arch-finish!): Reverse recorded subr list. ++ ++ * read.scm (debug-env): New global. ++ (debug-var-names,debug-var,debug-repl-env): New procs. ++ (debug-repl): Rewrite. New arg `env-list'. All callers updated. ++ (debug-quit): Renamed from `continue'. ++ ++ * simplify.inc (dsmf): New pmacro. ++ ++ * utils.scm (plus-scan): New proc. ++ (split-bits): Rewrite. ++ (split-value): New proc. ++ ++1999-10-13 Doug Evans ++ ++ * doc/Makefile.am (DOCFILES): Add notes.texi. ++ * doc/Makefile.in: Rebuild. ++ ++1999-10-11 Doug Evans ++ ++ * ifield.scm (ifld-derived?): New proc. ++ (f-derived): New global. ++ (ifield-builtin!): Create ifield f-derived. ++ (): New class. ++ (multi-insn?): New predicate. ++ (multi-insn-instantiate!): New proc. ++ (-insn-parse): Create objects for insns with derived ++ ifields. ++ (-parse-insn-format-symbol): Handle derived ifields. ++ (-parse-insn-format-ifield-spec): New proc. ++ (-parse-insn-format-operand-spec): New proc. ++ (-parse-insn-format-list): Simplify. ++ (-parse-insn-format): No longer allow (ifield-object value) spec. ++ (derived-operand-format?): New proc. ++ (insn-alias?): New proc. ++ (non-alias-insns): Rewrite. ++ (insn-real?): Renamed from real-insn?, all callers updated. ++ (virutal-insns): Rewrite. ++ (multi-insns): New proc. ++ * mach.scm (arch-analyze-insns!): Instantiate multi-insns if present. ++ * operand.scm (op-ifield): Renamed from op:ifield, all callers updated. ++ Return #f if operand doesn't have an index or if index is not an ++ ifield. ++ (hw-index-anyof): New proc. ++ (-operand-parse): Allow integer indices. ++ (): New class. ++ (derived-operand?): New predicate. ++ (): New class. ++ (): New class. ++ (-anyof-parse-value,-anyof-operand-parse): New procs. ++ (-derived-operand-parse,-derived-operand-read): New procs. ++ (define-derived-operand,define-full-derived-operand): New procs. ++ (operand-init!): New reader command define-derived-operand. ++ ++ * utils.scm (list-take): Handle negative amount. ++ (element?): Rewrite. ++ ++1999-10-10 Doug Evans ++ ++ * dev.scm: quick-utils.scm renamed to ~/.cgenrc. ++ ++1999-10-04 Richard Henderson ++ ++ * ia64.cpu: Checkpoint. ++ ++1999-09-29 Doug Evans ++ ++ * sim-cpu.scm (-gen-semantic-fn-table): Virtual insns are always valid. ++ ++ * sim.scm (sim-finish!,x-invalid): Always set pc. Set vpc based on ++ default-insn-bitsize. Pass vpc to sim_engine_invalid_insn. ++ ++Wed Sep 29 14:39:39 1999 Dave Brolley ++ ++ * sim.scm (sim-finish!): Don't call sim_io_error for invalid insn. Use ++ PC returned by sim_engine_invalid_insn. ++ ++1999-09-28 Doug Evans ++ ++ * ia32.cpu: New file. ++ ++1999-09-25 Doug Evans ++ ++ * utils.scm (bit-set?): Fix off by one error. ++ ++ * rtl-c.scm (s-sequence): Fix non-void-mode result output. ++ ++ * rtl.scm (hw): Check for valid hardware element before trying to ++ get its mode. ++ ++ * arm.cpu (arm7f cpu): Renamed from arm. All users updated. ++ * arm7.cpu (bx): Fix name of target address operand in assembler spec. ++ (*): arm_compute_operand2_foo renamed to compute_operand2_foo. ++ * thumb.cpu (*): arm_compute_operand2_foo renamed to ++ compute_operand2_foo. ++ ++ * cgen-sid.scm (sim_arguments): Add support for building defs.h. ++ * sid.scm (-hw-gen-set-quiet-pc): Handle #:delay modifier. ++ Call delayed_branch/branch methods instead of assigning to `vpc'. ++ (,cxmake-skip): Call skip method. ++ (-gen-hw-selector): Call rtl-c++ instead of rtl-c. ++ (,cxmake-skip): Ditto. ++ (-create-virtual-insns!): Ditto. ++ (op:read): Call estate-make-for-normal-c++ instead of estate-...-c. ++ (op:write): Ditto. ++ (op:record-profile): Specify #:output-language "c++". ++ * sid-cpu.scm (-gen-insn-attr-decls): Rename @cpu@_insn_attr to ++ @arch@_insn_attr. ++ (cgen-desc.h): Use @arch@ namespace instead of @cpu@. ++ Define enums here. ++ (-gen-reg-access-defns): Use rtl-c++ instead of rtl-c. ++ (gen-semantic-code): Ditto. ++ (-gen-sem-case,-gen-sfrag-code): Ditto. ++ (-gen-hardware-types): Delete class @cpu@_cpu_base. ++ (cgen-cpu.h): File is now #included by main cpu class, rather than ++ subclassing. ++ (cgen-defs.h): New proc. ++ (-gen-scache-semantic-fn): Change result type to sem_status. ++ New local `status'. Call done_cti_insn/done_insn method at end. ++ (cgen-semantics.cxx): Include @cpu@.h instead of @arch@-main.h, ++ cgen-ops.h. ++ (cgen-sem-switch.cxx): Ditto. ++ * sid-decode.scm (-gen-idesc-decls): Update return type of ++ @prefix@_sem_fn. ++ (cgen-decode.h): Add using namespace @arch@. ++ (cgen-decode.cxx): Include @cpu@.h instead of @arch@-main.h. ++ ++ * rtl-c.scm (): New member output-language. ++ (estate-output-language-c?,estate-output-language-c++?): New procs. ++ (,vmake!): Handle #:output-language. ++ (estate-make-for-normal-rtl-c++): New proc. ++ (rtl-c++-parsed,rtl-c++): New proc. ++ (s-c-call): Invoke cpu class method if c++. ++ (join): Use s-c-raw-call. ++ ++ * rtl-c.scm (subword): Don't pass current_cpu to SUBWORD. ++ (nop): Rewrite. ++ ++ * rtl-c.scm (delay): Mark the sequence as #:delay'd. ++ * rtl.scm (): New member `modifiers'. ++ (,vmake!): Handle #:modifiers. ++ (estate-with-modifiers): New proc. ++ ++ * rtl.scm (rtx-side-effects?): New proc. ++ (rtx-canonical-bool): Don't change expr if it has side effects. ++ * semantics.scm (-simplify-expr-fn): Handle exprs with side-effects ++ better. ++ ++1999-09-23 Doug Evans ++ ++ * sim.scm (gen-scache-type): Fix typo in last patch. ++ ++Tue Sep 21 17:12:55 1999 Dave Brolley ++ ++ * sim.scm (gen-scache-type): Add last_insn_p flag for parallel support. ++ ++1999-09-05 Doug Evans ++ ++ * sid.scm (,cxmake-skip): New method. ++ (,cxmake-skip): New method. ++ ++ * decode.scm (decode-build-table): Delete args startbit,index-list. ++ All callers updated. ++ * utils-sim.scm (gen-decoder): Delete args startbit,index-list. ++ All callers updated. ++ * sim-decode.scm (-gen-decode-fn): Always pass 0 for startbit ++ to decode-get-best-bits. ++ * sid-decode.scm (-gen-decode-fn): Ditto. ++ ++ * hardware.scm (hw-bits): New proc. ++ (-hw-parse): New arg layout. All callers updated. ++ (define-full-hardware): New arg layout. All callers updated. ++ (-hw-validate-layout): New proc. ++ (-hw-create-[gs]etter-from-layout): New procs. ++ (,parse!): Handle layout spec. ++ * types.scm (type-bits): New proc. ++ ++ * sem-frags.scm (-frag-cost-compute!): Fix calculation of ++ UNARY, BINARY, TRINARY rtxs. ++ ++ * attr.scm (,parse-value): Allow strings. ++ * enum.scm (parse-enum-vals): Use reverse! instead of reverse. ++ Support '- as "unused spot" indicator. ++ ++1999-09-03 Doug Evans ++ ++ * pgmr-tools.scm (pgmr-pretty-print-insn-format): Fix typo. ++ ++1999-09-02 Doug Evans ++ ++ * rtx-funcs.scm (subword): Fix mode spec of `value'. ++ ++ * rtl.scm (-rtx-traverse-operands): Fix debugging message ++ construction. ++ (tstate-make): New arg `depth'. All callers updated. ++ (tstate-depth,tstate-set-depth!): New procs. ++ (tstate-incr-depth!,tstate-decr-depth!): New procs. ++ (-rtx-traverse-operands): Indent debugging output by traversal depth. ++ (-rtx-traverse): Ditto. Keep track of traversal depth. ++ ++1999-09-01 Doug Evans ++ ++ * sim-decode.scm (-gen-decoder+supporting cast): Move to utils-sim.scm. ++ * sid-decode.scm (-gen-decoder+supporting cast): Ditto. ++ * utils-sim.scm: Decoder generator support moved here. ++ (-decode-equiv-entries?,-decode-sort-entries): New procs. ++ (-gen-decoder-switch): Sort entries for more fall-throughs. ++ ++ * Makefile.am (gas-test,sim-test): Specify ISA when invoking cgen. ++ * Makefile.in: Rebuild. ++ * sim-test.scm (build-sim-testcase): Add logging message. ++ * dev.scm (cload): Recognize SIM-TEST application. ++ (load-stest): Set APPLICATION to SIM-TEST. ++ ++ * desc-cpu.scm (-gen-hash-defines): Add \n to output. ++ ++ * ifield.scm (-ifield-parse): Allow bit numbers up to 127. ++ * mach.scm (-isa-parse): Allow insn bitsizes from 8 to 128. ++ * mode.scm (mode-make-int,mode-make-uint): Allow values up to 64 bits. ++ ++ * insn.scm (syntax-break-out): Handle ${foo}. ++ ++Sun Aug 29 11:11:15 1999 Doug Evans ++ ++ * Makefile.am (noinst_PROGRAMS,noinst_LIBRARIES): Delete. ++ (bin_PROGRAMS): Define. ++ (CGEN_HOB_INPUT_FILES): Remove $(srcdir)/. ++ (cgen-hob.c): Prepend $(srcdir)/ here. ++ (APPDESCFILES,OPCODESFILES,SIMFILES,pkgdata_SCRIPTS): Define. ++ (libcpu_a_SOURCES): Delete. ++ (cgen_DEPENDENCIES,cgen_LDADD): Rewrite. ++ (CGEN_HOB_OBJ,CGENOBJS): New variables. ++ * configure.in (LIBS): Replace -Wl,-rpath with -R. ++ Add AC_CHECK_LIB(guile,main). ++ * Makefile.in: Rebuild. ++ * doc/Makefile.in: Rebuild. ++ * aclocal.m4: Rebuild. ++ * config.in: Rebuild. ++ * configure: Rebuild. ++ ++1999-08-28 Doug Evans ++ ++ Rename rtx functions from name: to name, accept optional leading ++ modifier and mode. ++ VM -> VOID, DM -> DFLT, use DFLT instead of VM for default mode. ++ * attr.scm (-attr-eval): Update. ++ * hardware.scm (hw-mode-ok?): Rename arg mode to new-mode-name. ++ (,mode-ok?): Disallow VOID. ++ (,mode-ok?): Disallow VOID. ++ (,mode-ok?): Disallow VOID. ++ * mode.scm (mode-name?): New proc. ++ (VOID): Renamed from VM. ++ (DFLT): Renamed from DM. ++ (mode-builtin!): Update. ++ * opcodes.scm (,gen-insert): Update. ++ (,gen-extract): Update. ++ (,gen-insert,gen-extract): Update. ++ * operand.scm (op:mode): Update. ++ (,make!): Update. ++ (op:new-mode): Update. ++ (-operand-read): Update. ++ * rtl.scm (-rtx-valid-types): Add OPTIONS, EXPLNUMMODE, ++ NONVOIDMODE, DFLTMODE. Rename VMMODE to VOIDMODE. ++ (def-rtx-dual-mode,define-rtx-dual-mode): Delete. ++ (-rtx-lazy-sem-mode): Renamed from -rtx-mode. All callers updated. ++ (rtx-make): Call -rtx-munge-mode&options. ++ (rtx accessors): Rewrite. ++ (rtx-pretty-name): Update. ++ (-rtx-traverse-*): Update. ++ (-rtx-traverse-explnummode,-rtx-traverse-nonvoidmode): New procs. ++ (-rtx-traverse-voidmode,-rtx-traverse-dfltmode): New procs. ++ (-rtx-make-traverse-table): Update. ++ (-rtx-traverse-operands): Update. ++ (-rtx-option?,-rtx-option-list?): New procs. ++ (-rtx-munge-mode&options): New proc. ++ (-rtx-traverse-expr): Call -rtx-munge-mode&options. ++ (-rtx-traverse): Update. ++ (rtx-traverse,rtx-traverse-with-locals,rtx-compile): Update. ++ (rtx-compile-time-constant?): Update. ++ (rtx-true?,rtx-false?,rtx-true,rtx-false): Update. ++ (rtx-value): Update. ++ (hw,reg,mem): Renamed from foo:. Update. All callers updated. ++ * rtx-funcs.scm (*): Update. ++ * rtl-c.scm (rtl-c-get): Update. ++ (rtl-c-set-quiet,rtl-c-set-trace): Update. ++ (s-c-call,s-c-raw-call): Update. ++ (s-boolifop,s-convop,s-if,s-cond): Update. ++ (s-case-vm,-gen-non-vm-case-test,s-case): Update. ++ (-par-replace-set-dests,-par-replace-set-srcs): Update. ++ (s-parallel,s-sequence): Update. ++ (rtl-c-build-table): Update. ++ * sem-frags.scm (-frag-hash-compute!): Update. ++ (-frag-cost-compute!): Improperly handle unary,binary,trinary ops ++ for temporary bug compatibility with previous version. ++ (-frag-expr-locals,-frag-expr-stmts): Update. ++ (-frag-compute-desired-frags,-frag-pick-best): Update. ++ * semantics.scm (-simplify-expr-fn): Update. ++ (rtx-simplify): Update. ++ (-rtx-ref-type): Update. Account for modifiers. ++ (-build-operand!,-build-reg-operand!,-build-mem-operand!): Update. ++ (-build-ifield-operand!): Update. ++ (-build-known-values): Update. ++ (semantic-compile): Update. ++ (-gen-reg-access-defns): Update. ++ (gen-semantic-code,-gen-sem-case): Update. ++ (-gen-sfrag-code,-gen-sfrag-case): Update. ++ * sim-cpu (gen-semantic-code): Update. ++ * sim.scm (,gen-write,cxmake-skip): Update. ++ (,gen-write,gen-set-macro,cxmake-get-raw): Update. ++ (-hw-cxmake-get): Update. ++ (,cxmake-get,gen-set-quiet,gen-write): Update. ++ (,cxmake-get): Update. ++ (,gen-type,gen-read,cxmake-get): Update. ++ (,gen-set-quiet,gen-set-trace): Update. ++ (,cxmake-get): Update. ++ (sim-finish!): Update. ++ * utils-gen.scm (-gen-ifld-extract-base): Update. ++ (-gen-ifld-extract-beyond): Update. ++ (gen-multi-ifld-extract): Update. ++ * sid-decode.scm (-decode-expr-ifield-values-used): Update. ++ * sid.scm (,gen-write): Update. ++ (-gen-decode-insn-globals): Update. ++ (-hw-cxmake-get): Update. ++ (,cxmake-get-raw): Update. ++ (,cxmake-get,gen-set-quiet,gen-write): Update. ++ (,cxmake-get): Update. ++ (,gen-type,gen-read,cxmake-get): Update. ++ (,gen-set-quiet,gen-set-trace): Update. ++ (,cxmake-get): Update. ++ (-create-virtual-insns!): Update. ++ (-decode-split-build-assertion): Update. ++ * *.cpu: Update. ++ * simplify.inc: Update. ++ ++1999-08-20 Doug Evans ++ ++ * sim.scm (-op-gen-queued-write): Fix memory address calculation. ++ Prefix queue function name with sim_ instead of @cpu@_. ++ ++ * sim.scm (-with-parallel-only?): New global. ++ (option-init!): Initialize it. ++ (option-set!): Set it. ++ (with-parallel-only?): New proc. ++ * sim-decode.scm (-gen-decode-insn-globals): Don't include parallel ++ and writeback markers if with-parallel-only. ++ (-gen-idesc-init-fn): Update. ++ * sim-cpu.scm (cgen-cpu.h): Don't generate struct parexec if ++ with-generic-write. ++ ++Wed Aug 18 15:04:30 1999 Doug Evans ++ ++ * sim-cpu.scm (-gen-semantic-fn-table): Handle unsupported insns ++ with the invalid insn handler. ++ ++ * utils.scm (list-maybe-ref): New proc. ++ ++ * mach.scm (-isa-parse): Signal error if isa wasn't specified in ++ define-arch. ++ (-mach-parse): Signal error if mach wasn't specified in define-arch. ++ ++ * i960.cpu (test*-*): Delete `expr' arg. ++ (test-op,branch-op): Update. ++ ++1999-08-09 Doug Evans ++ ++ * sim.scm (gen-reg-getter-fn,gen-reg-setter-fn): New procs. ++ (gen-reg-access-decl): Replace `name' arg with `hw'. All callers ++ updated. ++ (gen-reg-access-defn): Ditto. ++ (-gen-hw-addr): Rewrite. ++ (-op-gen-queued-write): Rewrite. ++ * sim-cpu.scm (-gen-cpu-reg-access-decls): ++ (-gen-scache-semantic-fn): Handle with-generic-write. ++ (-gen-no-scache-semantic-fn): Ditto. ++ ++1999-08-08 Doug Evans ++ ++ * utils-gen.scm (gen-define-ifmt-ifields): Tweak output. ++ ++ * sim.scm (-with-generic-write?): New global. ++ (option-init!): Initialize it. ++ (option-set!): Set it. ++ (with-generic-write?): New proc. ++ (-gen-hw-addr): New proc. ++ (-op-gen-queued-write): New proc. ++ (-op-gen-set-{quiet,trace}-parallel): Use it if with-generic-write?. ++ ++ * sim-cpu.scm (-gen-hardware-types): Output code with parallel support ++ turned off. ++ (-gen-sem-switch): Preserve existing with-parallel? value. ++ (-gen-sem-parallel-switch): Ditto. ++ (-gen-write-case): Add /indent support. ++ (cgen-write.c): Rewrite. ++ ++ * utils.scm (-current-print-state): New global. ++ (make-print-state): New proc. ++ (pstate-indent,pstate-set-indent!): New procs. ++ (pstate-cmd?,pstate-cmd-do): New procs. ++ (/indent): New global. ++ (/indent-set,/indent-add): New procs. ++ (string-write): Set -current-print-state. ++ (-string-write): New arg pstate, all callers updated. ++ Handle print-state commands. ++ (-string-list-flatten): New proc. ++ (string-list->string): Use it. ++ ++ * sim-cpu.scm (-gen-sem-fn-name): Move here from sim-decode.scm. ++ (-gen-sem-fn-table-entry): New proc. ++ (-gen-semantic-fn-table): New proc. ++ (-gen-scache-semantic-fn): Make fn static. ++ (-gen-no-scache-semantic-fn): Ditto. ++ (cgen-semantics.c): Define macro SEM_FN_NAME. ++ * sim-decode.scm (-gen-decode-insn-globals): Delete FMT,TYPE,IDX, ++ FAST,FULL. Update @cpu@_insn_sem contents. ++ (-gen-semf-fn-name): Delete. ++ (-gen-sem-fn-decls): Delete. ++ (-gen-idesc-decls): Output prototypes of @cpu@_sem_init_idesc_table, ++ @cpu@_semf_init_idesc_table. ++ (-gen-idesc-init-fn): Update. Don't initialize pointers to semantic ++ handlers here. ++ (cgen-decode.h): Print sfmt enum. ++ * sid-decode.scm (-gen-semf-fn-name): Delete. ++ * utils-gen.scm (gen-sfmt-enum-decl): New proc. ++ ++ * iformat.scm (sfmt-build): Rename sformats from fmt-foo to sfmt-foo. ++ (ifmt-compute!): Ditto. ++ * sim-decode.scm (-gen-decoder-switch): Ditto. ++ * sid-decode.scm (-gen-decode-expr-entry): Ditto. ++ (-gen-decoder-switch): Ditto. ++ ++ * insn.scm (insn-virtual?): New proc. ++ ++ * enum.scm (gen-enum-decl): Speed up, build string as list and then ++ convert to string. ++ * mach.scm (): attr-list is now a pair of lists. ++ (current-attr-list): Rewrite. ++ (current-attr-add!,current-attr-lookup): Rewrite. ++ * sim.scm (gen-cpu-insn-enum-decl): Replace append with append!. ++ ++1999-08-06 Richard Henderson ++ ++ * ia64.cpu: Initial checkpoint. ++ ++1999-08-06 Doug Evans ++ ++ * pmacros.scm (-pmacro-apply): Fix definition, takes only 1 arg. ++ (pmacros-init!): Update .apply help string. ++ ++1999-08-03 Doug Evans ++ ++ * sim.scm (-hw-gen-set-quiet-pc): Update call to SEM_BRANCH_VIA_CACHE. ++ (,cxmake-skip): New method. ++ (,cxmake-skip): New method. ++ (-gen-argbuf-fields-union): Add branch_target to `chain' member. ++ (gen-argbuf-type): New member `skip_count'. ++ (sim-finish!): Update calls to @cpu@_pbb_cti_chain. ++ * utils-cgen.scm (atlist-cti?): Don't include SKIP-CTI insns. ++ ++ * utils-sim.scm: New file. ++ * dev.scm (load-sim): Load it. ++ (load-sid): Load it. ++ * cgen-sid.scm: Load it. ++ * cgen-sim.scm: Load it. ++ * iformat.scm (): New member sbuf, not initialized by ++ default make. ++ * rtx-funcs.scm (skip): Rewrite. ++ * rtl-c.scm (skip): Rewrite. ++ * m32r.cpu (sc,snc): Update `skip' usage. ++ * mode.scm (mode-real-mode): New proc. ++ * sem-frags.scm (-frag-split-by-sbuf): Rename from -frag-split-by-sfmt. ++ Distinguish fragments by the they use. ++ * sim.scm (gen-profile-index-type): Delete. ++ (ifield argbuf support): Move to utils-sim.scm and sim-decode.scm. ++ (-gen-ifld-decoded-val): Delete, use gen-extracted-ifld-value instead. ++ (hardware argbuf support): Move to utils-sim.scm and sim-decode.scm. ++ (operand argbuf support): Move to utils-sim.scm and sim-decode.scm. ++ (-gen-argbuf-elm): Rewrite. ++ (-gen-argbuf-hw-elm): Delete. ++ (-gen-argbuf-fields-union): Generate structs for each sbuf instead ++ of each sfmt. ++ (-sim-sformat-argbuf-list,-sim-insns-analyzed?): New globals. ++ (sim-init!): Initialize them. ++ (sim-analyze-insns!): Set them. ++ (current-sbuf-list): New proc. ++ * sim-cpu.scm (-gen-no-scache-semantic-fn): Update calls to ++ gen-sfmt-op-argbuf-defns,gen-sfmt-op-argbuf-assigns. ++ * sim-model.scm (-gen-model-insn-fn): Ditto. ++ * sim-decode.scm (-gen-extract-decls): Delete. ++ (-gen-record-argbuf-ifld,-gen-trace-argbuf-ifld): New procs. ++ (,gen-extract,gen-trace-extract): Move here from ++ sim.scm. ++ (,gen-extract,gen-trace-extract): Move here from ++ sid.scm. ++ ( ++ ++ * sid-cpu.scm (-gen-sem-switch-engine): Move definition of `count' ++ up to avoid g++ 'goto crosses initialization' warning. ++ (-gen-sfrag-engine-fn): Delete vpc arg to NEXT_FRAG. ++ (-gen-sfrag-case): Update use of NEXT_FRAG. ++ ++1999-07-22 Doug Evans ++ ++ * cos.c (cos_init): Protect _make_x_symbol from garbage collection. ++ ++ * read.scm: Load sem-frags.scm. ++ * sem-frags.scm (*): Lots rewritten. ++ * sid.scm (-with-sem-frags?): New global ++ (with-sem-frags?): New proc. ++ (option-init!): Initialize -with-sem-frags?. ++ (option-set!): Recognize with-sem-frags. ++ (sim-init!): Call sim-sfrag-init! if with-sem-frags. ++ * sid-cpu.scm (cgen-sem-switch.cxx): Generate semantic frag version ++ if asked to. ++ (-gen-sfrag-engine-decls): New proc. ++ (-gen-sfrag-code,-gen-sfrag-case,-gen-sfrag-enum-decl): New procs. ++ (-gen-sfrag-engine-frag-table,-gen-sfrag-engine-fn): New procs. ++ (-gen-sfrag-engine): New proc. ++ (-gen-sem-case): Emit setup-semantics if specified. ++ (-gen-sem-switch-engine): Update init/use of computed goto label. ++ * sid-decode.scm (-gen-decode-expr-entry): Fetch ifield values ++ from local vars. ++ (-gen-idesc-decls): Replace sem_address with cgoto. ++ (-gen-scache-decls): Rewrite definition of `execute' member. ++ * arm.cpu (arm isa): Enable decode-splits. ++ * arm7.cpu (multiply insns): Rename result to mul-result. ++ ++ Rename decode-specialize to decode-split. ++ * decode.scm (*): Update. ++ * insn.scm (*): Update. ++ * mach.scm (*): Update. ++ * sid.scm (*): Update. ++ ++1999-07-19 Doug Evans ++ ++ Record objects as a smob. ++ * cos.c (scm_tc16_object): New static global. ++ (cos_init): Initialize it. ++ (OBJECT_P,OBJECT_ELEMENTS,OBJECT_CLASS_DESC): Update macros. ++ (OBJECT_CLASS,OBJECT_ELEMENT_OFFSET): Update. ++ (_object_tag): Delete. ++ (_object_make_smob): New function. ++ (_object_make_x,_object_make_with_values_x): Rewrite. ++ (_object_elements,_object_class_desc): Rewrite. ++ (_object_copy,object_p): Rewrite. ++ (_object_specialize): Rewrite. ++ (_object_print_elms,_object_print): New functions. ++ (object_smob): New static global. ++ (default_make_x): Use OBJECT_ELEMENT_OFFSET instead of magic number. ++ ++ * cos.c (_make_x_symbol): New static global. ++ (object_make): Use it. ++ (cos_init): Initialize it. ++ ++1999-07-15 Doug Evans ++ ++ * rtl-c.scm (ifield): Back out last patch, use estate-ifield-var? ++ instead to determine whether to use FLD macro. ++ (): New member ifield-var?. ++ (,vmake!): Recognize #:ifield-var?. ++ * utils-gen.scm (-gen-ifld-extract-base): Specify #:ifield-var? #f. ++ (-gen-ifld-extract-beyond,gen-multi-ifld-extract): Ditto. ++ ++ * rtl.scm (rtx-sequence-assq-locals): New proc. ++ ++ * cos.scm (-object-error): Don't crash on non-objects. ++ ++ * Makefile.am (CLEANFILES): Add hobbit. ++ * Makefile.in: Rebuild. ++ ++ * rtl-c.scm (s-c-call): Delete unnecessary code. ++ ++1999-07-14 Doug Evans ++ ++ * rtl-c.scm (ifield): Always reference value via `FLD'. ++ ++ * cos.c (elm_bound_p): Return problem SCM boolean values. ++ ++ * utils-cgen.scm (display-argv): New proc. ++ * cgen-opc.scm (cgen): Call it. ++ * cgen-sim.scm (cgen): Ditto. ++ * cgen-gas.scm (cgen): Ditto. ++ * cgen-stest.scm (cgen): Ditto. ++ * cgen-sid.scm (cgen): Ditto. ++ ++1999-07-05 Doug Evans ++ ++ * opc-asmdis.scm (-gen-parse-switch): New local var `junk'. ++ * opc-ibld.scm (-gen-insert-switch): Initialize result to NULL. ++ (-gen-extract-switch): Initialize result to 1. ++ * opcodes.scm (gen-ifield-default-type): New proc. ++ (gen-ifield-value-decl): Renamed from gen-ifield-type. All callers ++ updated. ++ (,gen-insert): Handle non-ifield indices. ++ (,gen-extract): Ditto. ++ (,gen-parse): Ditto. ++ (,gen-print): Ditto. ++ (,gen-parse): Ditto. ++ (,gen-print): Ditto. ++ (,gen-fget): Ditto. ++ (,gen-fset): Ditto. ++ ++ * sim.scm (-gen-hw-index-raw): Handle scalar indices. ++ (-gen-hw-index): Ditto. ++ * sid.scm (-gen-hw-index-raw): Handle scalar indices. ++ (-gen-hw-index): Ditto. ++ ++ * sem-frags.scm: New file. ++ ++ * attr.scm (attr-parse): Add better checking of input. ++ ++ * hardware.scm (-hw-parse-getter): Renamed from -hw-parse-get. ++ All uses updated. ++ (-hw-parse-setter): Renamed from -hw-parse-set. All uses updated. ++ ++ * ifield.scm (ifld-nil?): New proc. ++ ++ * operand.scm (): New members getter,setter. ++ (,make!): New args getter,setter. All uses updated. ++ (op:getter,op:setter): New procs. ++ (,field-start): Return 0 for non-ifield indices. ++ (,field-length): Return 0 for non-ifield indices. ++ (-operand-parse-getter,-operand-parse-setter): New procs. ++ (-operand-parse): New args getter,setter. All callers updated. ++ Always use hw-index-scalar for scalar operands. ++ (-operand-read): Handle getter,setter. ++ (define-full-operand): New args getter,setter. All uses updated. ++ * semantics.scm (-build-ifield-operand!): Update. ++ (-build-index-of-operand!): Update. ++ * sim.scm (,cxmake-get): If operand has getter, use it. ++ * simplify.inc (define-normal-operand): Update. ++ ++ * rtl.scm (abs,sqrt,cos,sin,min,max,umin,umax): New rtx fns. ++ * rtl-c.scm (s-unop): Indirect fp ops through fpu op vector. ++ (s-binop,s-cmpop,s-convop): Ditto. ++ (abs,sqrt,cos,sin,min,max,umin,umax): New rtx fns. ++ * sparc.cpu (insn-fmt2): Add FPOPS1,FPOPS2. ++ (fcc-tests): New insn-enum. ++ (fcc-value): Rename from fcc-type. ++ * sparcfpu.cpu: New file. All fp support moved here. ++ ++ * rtl.scm (): New member class. ++ (rtx-class-*?): New procs. ++ (def-rtx-node): New arg class. All callers updated. ++ (def-rtx-syntax-node,def-rtx-operand-node,def-rtx-dual-node): Ditto. ++ * rtx-funcs.scm (*): Specify class. ++ ++ * utils-cgen.scm (context-make-reader): New proc. ++ ++ * utils.scm (assert-fail-msg): New variable. ++ (assert): Use it. ++ (list-drop,list-tail-drop): New procs. ++ ++1999-06-22 Doug Evans ++ ++ * desc-cpu.scm (-gen-hash-defines): Restore generation of ++ CGEN_MIN_INSN_SIZE deleted on March 22. ++ ++ * ifield.scm (,needed-iflds): New method. ++ (,needed-iflds): New method. ++ (ifld-needed-iflds): New proc. ++ (multi-ifield?): New proc. ++ * iformat.scm (): Delete member ifmt. New members length,iflds. ++ (-sfmt-search-key): Include insn length in key. ++ (-sfmt-order-iflds,-sfmt-used-iflds): New procs. ++ (): Delete members ifmt-key,sfmt-key. New member used-iflds. ++ (-ifmt-lookup-ifmt!): Compute key here. ++ (-ifmt-lookup-sfmt!): Compute key here. Delete arg ifmt. ++ All callers updated. ++ (ifmt-build): Delete arg desc. New args search-key,iflds. ++ All callers updated. ++ (sfmt-build): Delete args desc,ifmt. New args search-key,cti?, ++ in-ops,out-ops,sorted-used-iflds. All callers updated. ++ * minsn.scm (minsn-make-alias): Use insn-set-ifmt!. Update call ++ to ifmt-build. ++ * operand.scm (op-iflds-used): New proc. ++ * utils-gen.scm (gen-ifld-type): Move here from sim.scm ++ and sim-cpu.scm. ++ And from sid.scm,sid-cpu.scm as well. ++ (gen-ifld-extract-decl,-gen-ifld-extract-base): Ditto. ++ (-gen-extract-word,-gen-ifld-extract-beyond): Ditto. ++ (gen-ifld-extract,gen-multi-ifld-extract): Ditto. ++ (gen-extracted-ifld-value): Ditto. ++ (-extract-chunk-specs): Ditto. ++ (gen-define-ifields,gen-define-ifmt-ifields): Ditto. ++ (-extract-chunk,-gen-extract-beyond-var-list): Ditto. ++ (gen-extract-ifields,gen-extract-ifmt-ifields): Ditto. ++ (-extract-insert-subfields): New function. ++ * sim.scm (gen-record-argbuf-ifld): Renamed from gen-ifld-extract. ++ (gen-record-argvar-ifld): Renamed from gen-ifld-extract-argvar. ++ * sim-cpu.scm (-gen-extract-ifmt-macro): Replace calls to ++ gen-define-ifields with gen-define-ifmt-ifields. Ditto for ++ gen-extract-foo. ++ (-gen-no-scache-semantic-fn): Ditto. ++ (-gen-sem-case): Ditto. ++ (-gen-read-case): Update calls to gen-define-ifields, ++ gen-extract-ifields. ++ * sim-decode.scm (-gen-record-args): Update. ++ (-gen-sfmt-argvars-assigns): Update. ++ (-gen-extract-case): Update. ++ * sim-model.scm (-gen-model-insn-fn): Replace calls to ++ gen-define-ifields with gen-define-ifmt-ifields. Ditto for ++ gen-extract-foo. ++ * sid.scm (gen-ifld-argbuf-defn): Use gen-ifld-type. ++ (gen-record-argbuf-ifld): Rename from gen-ifld-extract. ++ (gen-record-argvar-ifld): Rename from gen-ifld-extract-argvar. ++ * sid-decode.scm (-gen-decode-expr-entry): Update calls to ++ gen-define-ifields, gen-extract-ifields. ++ (-gen-record-args): Update. ++ (gen-sfmt-argvars-assigns): Update. ++ (-gen-extract-case): Replace calls to gen-define-ifmt-ifields ++ with gen-define-ifields. Ditto for gen-extract-foo. ++ (-gen-decode-fn): Use gen-ifld-extract-decl/gen-ifld-extract ++ procs rather than method calls. ++ ++1999-06-18 Doug Evans ++ ++ * sid.scm (-create-virtual-insns!): New local `context', pass it ++ to insn-read. ++ ++ * rtl.scm (-rtx-traverse): Output symbol shortcuts in source form, ++ (operand name) not (operand object), (local name) not (local object). ++ (rtx-traverse-with-locals): New proc. ++ (-compile-expr-fn): New proc. ++ (rtx-compile): Rewrite. ++ * rtl-c.scm (rtl-c-get): Handle operand/local names for src arg. ++ (rtl-c-set-quiet): Don't accept operand/local names for dest arg. ++ (rtl-c-set-trace): Ditto. ++ (operand define-fn): Recognize operand name argument. ++ (local define-fn): Recognize sequence temp name argument. ++ * rtx-funcs.scm (operand): Argument is operand name, not object, ++ so call current-op-lookup. ++ (local): Similarily, so call rtx-temp-lookup. ++ ++ * rtl.scm (rtx-field?): Use rtx-name instead of car. ++ (rtx-operand?): Ditto. ++ (rtx-pretty-name): Ditto. ++ (rtx-local-obj): Flag symbol argument as an error. ++ (rtx-local-name): New proc. ++ (rtx-sequence-locals,rtx-sequence-exprs): New procs. ++ ++ * rtl.scm (-rtx-traverse-operands): Fix debugging output of arg-types. ++ ++ * read.scm (debug-repl): Renamed from -debug-repl. All callers ++ updated. ++ ++ * arm7.cpu (do-word/byte-store): Use (trunc: QI rd) rather than ++ (and: QI rd #xff). ++ ++ * hobbit.scm (*reckless-s->c-fun-table*): Add fastcall4, fastcall6. ++ (*floats-s->c-fun-table*): Ditto. ++ * hobbit.c,hobbit.h: Rebuild. ++ * rtl.scm (-rtx-traverse-expr): Use fastcall6. ++ * semantics.scm (rtx-simplify): Use /fastcall-make. ++ ++ * iformat.scm (-sfmt-search-key): Don't include memory modes. ++ ++ * insn.scm (): Delete members condition, compiled-condition. ++ (,make!): Update ++ ( getters,setters): Update. ++ (-insn-parse,insn-read,define-full-insn): Update. ++ * minsn.scm (minsn-make-alias): Update. ++ * iformat.scm (ifmt-analyze): Delete insn-condition reference. ++ (ifmt-compute!): Ditto. ++ * sim.scm (sim-finish!): Update. ++ * simplify.inc: (define-normal-insn): Update. ++ * sid-cpu.scm (gen-semantic-code): Update. ++ ++ * iformat.scm (-ifmt-lookup-ifmt!): Use insn-set-ifmt!. ++ (-ifmt-lookup-sfmt!): Use insn-set-sfmt!. ++ (ifmt-compute!): Ditto. ++ ++1999-06-16 Doug Evans ++ ++ * minsn.scm (minsn-compute-iflds): Print better error message for ++ missing ifields. ++ ++1999-06-12 Doug Evans ++ ++ * rtl.scm (tstate->estate): Don't copy over expr-fn. ++ ++ * Makefile.am (HOBFLAGS): New variable. ++ (cgen-hob.c): Use it. ++ (hobbit.c): Use it. ++ (libcpu_a_SOURCES): Add hob-sup.c. ++ (hob-sup.o): New rule. ++ * Makefile.in: Rebuild. ++ * cgen.c: #include hob-sup.h. ++ (cgen_init_c): Call hobbit_init_support. ++ * hobbit.scm (*fastcall-make*,*c-symbol*): New variables. ++ (*special-scm->c-functions*): Add them. ++ (display-c-expression): Handle *c-symbol*. ++ (*reckless-s->c-fun-table*): Add *fastcall-make*, fastcall5. ++ (*floats-s->c-fun-table*): Ditto. ++ (normalize): Recognize /fastcall-make. ++ (normalize-fastcall-make): New proc. ++ * hobbit.c,hobbit.h: Rebuild. ++ * hob-sup.scm: New file. ++ * hob-sup.c: New file. ++ * hob-sup.h: New file. ++ * read.scm: Load hob-sup.scm. ++ * rtl.scm (-rtx-name-list): New variable. ++ (rtx-name-list): New proc. ++ (rtx-lookup): Try symbol first. ++ (def-rtx-node): Add name to -rtx-name-list. ++ (def-rtx-syntax-node,def-rtx-operand-node,def-rtx-macro-node): Ditto. ++ (-rtx-traverse-anymode): New proc. ++ (-rtx-traverse-{emode,intmode,floatmode,nummode,vmmode}): New procs. ++ (-rtx-traverse-{rtx,setrtx,testrtx,condrtx,casertx}): New procs. ++ (-rtx-traverse-{locals,env,attrs,symbol,string,number}): New procs. ++ (-rtx-traverse-{symornum,object}): New procs. ++ (-rtx-make-traverse-table): Rewrite. ++ (-rtx-traverse-operands): Rewrite arg-types handling. ++ Handle #f result of traverser. ++ (-rtx-traverse): Renamed from -rtx-traverse-normal. ++ Move debug handling here. ++ (-rtx-traverse-debug): Delete. ++ (rtl-finish!): Change -rtx-traverse-table into list of handlers ++ for each rtx. ++ * semantics.scm (semantic-compile:process-expr!): Fix call to ++ -rtx-traverse. ++ * utils.scm (map1-improper): New proc. ++ ++1999-06-08 Doug Evans ++ ++ * arm.sim (h-tbit): Replace FUN-ACCESS with FUN-SET. ++ (h-mbits): Ditto. ++ * sid.scm (-hw-cxmake-get): s/FUN-ACCESS/FUN-GET/. ++ (-hw-gen-set-quiet): s/FUN-ACCESS/FUN-SET/. ++ (,cxmake-get): Tweak. ++ (sim-finish!): Delete FUN-ACCESS attribute. Create FUN-GET,FUN_SET. ++ ++1999-06-07 Doug Evans ++ ++ * thumb.cpu (dnti): Delete timing spec. ++ (all insn): Update. ++ ++ * arm.cpu (arm isa): New fields condition, setup-semantics. ++ (thumb isa): New field setup-semantics. ++ (h-gr): Add attribute CACHE-ADDR. ++ * arm7.cpu (dnai): Delete condition. ++ (eval-cond): Delete. ++ ++ * mach.scm (): New member setup-semantics. ++ (-isa-parse-setup-semantics): New proc. ++ (-isa-parse): New arg setup-semantics. ++ (-isa-read): Recognize setup-semantics. ++ ++ * sid-cpu.scm (gen-extract-fields): Split into two: ++ gen-extract-ifields, gen-extract-ifmt-ifields. ++ (-gen-scache-semantic-fn): Delete `taken_p'. Delete ++ tracing begin/end messages (done by caller now). ++ (-gen-sem-case): Delete `taken_p'. Add npc,br_status. Delete ++ tracing begin/end messages (done by x-before,x-after virtual insns). ++ (-gen-sem-switch-engine): Redo vpc initialization. Save vpc at ++ end so don't have to look it up again next time. ++ * sid-decode.scm (-decode-expr-ifield-values): New proc. ++ (-decode-expr-ifield-tracking-key): New proc. ++ (-decode-expr-ifield-tracking): New proc. ++ (-decode-expr-ifield-values-used): New proc. ++ (-decode-expr-ifield-mark-used!): New proc. ++ (-gen-decode-expr-set-itype): New proc. ++ (-gen-decode-expr-entry): Rewrite. ++ (-gen-decode-table-entry): New proc. ++ (-gen-decoder-switch): Use it. ++ (-gen-virtual-insn-finder): New proc. ++ (-gen-argbuf-elm): Move here from sid.scm. ++ (-gen-argbuf-hw-elm): Ditto. ++ (-gen-argbuf-fields-union): Add entries for chain,before insns. ++ (-gen-scache-decls): Add `cond' member to @prefix@_scache for ++ conditional-execution isas. ++ (-gen-decode-fn): Record conditional-exec ifield. ++ * sid.scm (-current-pbb-engine?): New global. ++ (current-pbb-engine?,set-current-pbb-engine?!): New procs. ++ (,gen-ifld-extract): New arg `indent'. ++ (,gen-ifld-extract): Ditto. ++ (-hw-gen-set-quiet-pc): Add pbb support. Delete `taken_p'. ++ (-op-gen-set-trace): Don't print tracing messages for pbb engine. ++ (-gen-arch-model-decls): Only scan real insns. ++ (scache-engine-insns,pbb-engine-insns): New procs. ++ (-create-virtual-insns!): New proc. ++ (sim-finish!): Call it. ++ (-decode-specialize-insn?): New proc. ++ (-decode-specialize-build-assertion): New proc. ++ (-decode-specialize-insn-1): New proc. ++ (-decode-specialize-insn): New proc. ++ (-fill-sim-insn-list!): New proc. ++ (sim-analyze!): Create copies of insns to be specialized. ++ * utils-cgen.scm (obj-set-name!): New proc. ++ ++ * attr.scm (-attr-eval): Rewrite calls to rtx-simplify/rtx-compile. ++ * iformat.scm (ifmt-analyze): Pass `insn' to semantic-compile, ++ semantic-attrs. ++ (ifmt-compute!): Delete arg `arch'. Result is list of iformats, ++ sformats. ++ * mach.scm (arch-analyze-insns!): Update call to ifmt-compute!. ++ * rtl-c.scm (rtl-c-get): Use DM for default mode instead of VM. ++ Avoid infinite loop when rtx-eval-with-estate leaves expr alone. ++ (attr): Rewrite test for insn owner. ++ (member): New rtx function. ++ * rtl.scm (rtx-* accessors): Define as cxr directly rather than ++ as separate function. ++ (rtx-ifield?,rtx-ifield-name): New procs. ++ (rtx-operand-obj): Rewrite. ++ (rtx-operand-name): New proc. ++ (rtx-cmp-op-mode,rtx-cmp-op-arg): New procs. ++ (rtx-number-list-values,rtx-member-value,rtx-member-set): New procs. ++ (tstate-make): New args owner, known. All callers updated. ++ (tstate-known-lookup): New proc. ++ (rtx-traverse): New arg owner. All callers updated. ++ (rtx-make-bool): New proc. ++ (rtl-find-ifields): Rewrite. ++ (rtx-simplify,rtx-simplify-eq-attr-{insn,mach}): Moved to ... ++ * semantics.scm: ... here. ++ (rtx-const-equal,rtx-const-list-equal): New procs. ++ (-build-known-values): New proc. ++ (semantic-compile): New arg `insn'. Call rtx-simplify. ++ (semantic-attrs): Ditto. ++ * rtx-funcs.scm (member,number-list): New rtx functions. ++ ++ * attr.scm (attr-remove-meta-attrs-alist): Delete leading '-' in name. ++ Rewrite. Delete arg `all-attrs'. All callers updated. ++ (attr-remove-meta-attrs): Delete leading '-' in name. All callers ++ updated. ++ * utils-cgen.scm (gen-bool-attrs): Remove meta attrs. ++ ++ * decode.scm (subdtable-add): Handle `expr' entries. ++ (exprtable-entry-make): Use vector. Record ifields refered to by expr. ++ (exprtable-entry-*): Update. ++ (exprtable-entry-iflds): New proc. ++ (exprentry-cost): New proc. ++ (exprtable-sort,-gen-exprtable-name): New procs. ++ (exprtable-make): New arg `name'. All callers updated. use vector. ++ (exprtable-*): Update. ++ (-build-decode-table-entry): Don't issue collision warning if all are ++ specialized insns. Sort exprtable entries before building table. ++ ++ * read.scm (-reader-process-expanded-1): Move pretty printing of ++ input to logging level 4. ++ ++ * utils.scm (string-list->string): New proc. ++ ++ * insn.scm (): Define setters for ifield-assertion, condition, ++ semantics. ++ (insn-read): Delete leading '-' in name. All callers updated. ++ (real-insn?): New proc. ++ (real-insns): Rewrite. ++ (insn-has-ifield?): New proc. ++ (insn-builtin!): Create insn attribute SPECIALIZED. ++ ++ * mach.scm (): Delete member app-data. ++ (current-raw-insn-list): New proc. ++ (insn-list-car,insn-list-splice!): New procs. ++ (): New class. ++ (-isa-parse-decode-specialize): New proc. ++ (-isa-parse-decode-specializes): New proc. ++ (): New members `condition', `decode-specializes'. ++ (-isa-parse-condition): New proc. ++ (-isa-parse): New args condition, decode-specializes. ++ (-isa-read): Recognize condition, decode-specializes. ++ (-isa-add-decode-specialize!): New proc. ++ (modify-isa): New proc. ++ (isa-conditional-exec?,state-conditional-exec?): New procs. ++ (arch-init!): New reader command `modify-isa'. ++ ++ * mode.scm (mode-class-signed?,mode-class-unsigned?): New procs. ++ (mode-signed,mode-unsigned?): New procs. ++ ++Thu Jun 3 16:00:40 1999 Doug Evans ++ ++ * types.scm (): New method get-shape. ++ * hardware.scm (): Forward get-shape,get-num-elms ++ onto type. ++ (hw-shape,hw-num-elms): New procs. ++ * sim.scm (,gen-profile-index-type): Use "unsigned short" ++ if there's more than 255 registers. ++ * sid.scm (,gen-profile-index-type): Ditto. ++ ++ * hardware.scm (-hw-parse): Flag as error CACHE-ADDR specified ++ with get/set specs. ++ ++1999-05-21 Doug Evans ++ ++ * cgen-sid.scm (sim-arguments): Add -X. ++ * sid-cpu.scm (-gen-hardware-types): Comment out scache vars. ++ (-gen-all-semantic-fns): Don't include PBB support virtual insns. ++ (-gen-sem-case): Use CASE/NEXT macros again. Tweak indenting. ++ Simplify by supporting pbb engine only. ++ (-gen-sem-switch-init): New proc. ++ (-gen-sem-switch-engine): Rename from -gen-sem-switch-fn. ++ (cgen-sem-switch.cxx): New proc. ++ * sid-decode.scm (-gen-decode-insn-globals): Replace with-sem-switch? ++ with with-pbb?. Support dual scache/pbb engines. ++ (-gen-idesc-decls): Replace with-sem-switch? with with-pbb?. ++ Support dual scache/pbb engines. ++ (cgen-decode.h): Generate semantic fn decls if with-scache?. ++ * sid.scm (*) with-pbb? replaces with-sem-switch?. ++ (sim-finish!): Create pbb support virtual insns if with-pbb?. ++ ++1999-05-10 Ben Elliston ++ ++ * arm7.cpu: Remove coprocessor related fields, operands and insn ++ definitions for now. Take the undefined instruction trap instead. ++ (ldmda-wb): New instruction. ++ (ldmib-wb): Likewise. ++ (ldmdb-wb): Likewise. ++ (stmdb-wb): Likewise. ++ (stmib-wb): Likewise. ++ (stmda-wb): Likewise. ++ ++1999-05-08 Doug Evans ++ ++ * sid.scm (,cxmake-get): Call GETMEM method, not function. ++ (,gen-set-quiet): Call SETMEM method, not function. ++ ++ * utils-cgen.scm (keyword-list->arg-list): Fix call to substring, ++ hobbit can't handle optional third arg. ++ ++1999-05-07 Doug Evans ++ ++ * arm.cpu (h-tbit): Delete set spec. ++ (h-mbits): Don't call arm_mbits_set in set spec. ++ * arm.sim: New file. ++ * hardware.scm (modify-hardware): New proc. ++ (hardware-init!): Add modify-hardware command. ++ * sid.scm (-hw-cxmake-get): Use method call if FUN-ACCESS specified. ++ (-hw-gen-set-quiet): Ditto. ++ (sim-finish!): Call invalid_insn method. Define FUN-ACCESS builtin ++ hardware attribute. Load $arch.sim file if present. ++ * utils-cgen.scm (keyword-list?): New proc. ++ (keyword-list->arg-list,arg-list-validate-name): New procs. ++ (arg-list-check-no-args,arg-list-symbol-arg): New procs. ++ ++ * arm7.cpu (eval-cond): Pass pc to @cpu@_eval_cond handler. ++ ++ * sid-cpu.scm (-gen-hardware-types): Rename @cpu@_cpu to ++ @cpu@_cpu_cgen. ++ ++ * attr.scm (obj-prepend-atlist!): New proc. ++ ++ * opc-opinst.scm (cgen-opinst.c): Analyze instructions if necessary. ++ ++ * sid.scm (,profilable?): Use op:type. ++ * sim.scm (,profilable?): Use op:type. ++ ++1999-05-04 Doug Evans ++ ++ * utils.scm (find-index,find): Be more stack friendly. ++ ++ * arm7.cpu (arith-imm-op): Compute pc before setting cpsr. ++ (bic-imm): Ditto. ++ ++1999-05-01 Doug Evans ++ ++ * arm.cpu (h-gr-usr): New hardware element. ++ (h-gr-fiq,h-gr-svc,h-gr-abt,h-gr-irq,h-gr-und): New hardware elements. ++ (arm-mode): New keyword. ++ (h-mbits): Add set spec. ++ (h-spsr): Implement get/set specs. ++ ++ * read.scm: Load slib/pp.scm, slib/genwrite.scm. ++ (-reader-process-expanded-1): Pretty print logging output. ++ ++ * sid-cpu.scm (-gen-reg-access-defns): Make getters `const'. ++ (cgen-cpu.h): Print enums before hardware elements. ++ (cgen-semantics.cxx): @arch@-cgen.h renamed to @arch@-main.h. ++ * sid-decode.scm (cgen-decode.cxx): Ditto. ++ * sid-model.scm (cgen-model.cxx): Ditto. ++ ++ * utils-cgen.scm (context-error): Accept variable number of ++ trailing args. ++ ++ * rtx-funcs.scm (error:): New rtx function. ++ * rtl-c.scm (s-case-vm): New proc. ++ (-gen-non-vm-case-get,s-case-non-vm): New procs. ++ (s-case): Simplify, handle non-VM result. ++ (error:): New rtx function. ++ ++1999-04-30 Doug Evans ++ ++ * arm.cpu (h-pc): Add set spec to zero bottom bits. ++ (test-hi,test-ls): Fix cbit handling. ++ (shift-type,h-operand2-shifttype): Move here ... ++ * arm7.cpu: ... from here. ++ (set-cond,set-cond-maybe,dnix): Delete, unused. ++ (set-zn-flags,set-logical-cc,set-add-flags,set-sub-flags): Move ... ++ * arm.cpu: ... to here. ++ * thumb.cpu (cmp,alu-cmp): Use set-sub-flags. ++ (alu-cmn): Use set-add-flags. ++ (alu-tst): Use set-zn-flags. ++ (alu-cmp): Use set-sub-flags. ++ (lsl,lsr,asr): Set condition codes. ++ (add,addi,sub,subi,mov,addi8,subi8): Ditto. ++ (alu-op): Split into three: alu-logical-op,alu-arith-op, ++ alu-shift-op. ++ (hireg-op): Split sem-fn into lo-dest-sem-fn,hi-dest-sem-fn. ++ All callers updated. ++ (sub-sp): Rename from add-sp-neg. ++ (f-lbwl-offset): Delete. ++ (f-lbwl-hi,f-lbwl-lo): New ifields. ++ (lbwl-hi,lbwl-lo): Update. ++ (bl-hi): Add 4 to pc. ++ (push-reg,pop-reg): Simplify. ++ (push,push-lr): Push registers in correct order. ++ (pop,pop-pc): Pop registers in correct order. ++ (save-reg-inc,load-reg-inc): Simplify. ++ (ldmia): Save registers in correct order. ++ ++1999-04-30 Ben Elliston ++ ++ * arm7.cpu (f-op-hdt): Remove; unused. ++ (f-ror-imm8-value,f-ror-imm-rotate): New fields. ++ (f-ror-imm8): New multi-ifield. ++ (f-operand2-bit7): Remove; use the generic `f-bit7' instead. All ++ callers updated. ++ (f-uimm12): New field. ++ (ror-imm8): New operand. ++ (uimm12): Likewise. ++ (hdt-offset8): Reinstate operand. ++ (offset4-hi,offset4-lo): Remove. ++ (set-cond): Remove macro; unused. ++ (set-cond-maybe): Likewise. ++ (load-word/byte): Use uimm12 operand for a true 12-bit immediate. ++ (store-word/byte): Likewise. ++ (load-halfword): Use hdt-offset8 multifield operand instead of two ++ 4-bit operands that are explicitly combined by semantic code. ++ (do-halfword-store): Bug fix. Set address when not preindexing. ++ (store-halfword): Also use hdt-offset8 operand. ++ (arith-op): Avoid clobbering source registers when one of them is ++ the destination register. ++ (arith-imm-op): Likewise. ++ (tst-imm): Use ror-imm8 operand. Handle special case of rot 0. ++ (teq-imm): Likewise. ++ (ldm-p): Rename to ldmdb. ++ (stm-pw): Rename to stmdb-wb. ++ (multi-action): New macro; test reg-list bits and execute a ++ semantic fn if the bit is set. ++ (ldmda,ldmib,ldmia,ldmia-wb,ldmdb): New multiple load insns. ++ (stmdb,stmib,stmia,stmia-wb,stmda,stmdb-wb): Store insns. ++ (all insns): Use dnai entries for simplicity rather than dni. ++ (*): Use short-form of (const ..). ++ ++1999-04-29 Doug Evans ++ ++ * rtl.scm (): Rename member type to style. Rename ++ member eval to evaluator. ++ (rtx-foo accessors): Rename from rtx:foo. All callers updated. ++ (tstate-make): Delete arg op-fn. All callers updated. ++ (tstate-op-fn,tstate-set-op-fn!): Delete. ++ (rtx-traverse): Delete op-fn arg. All callers updated. ++ * semantics.scm (-simplify-for-compilation-process-expr): New proc, ++ split out of -simplify-for-compilation. ++ ++ * Makefile.am (CGEN_NONHOB_FILES,CGENFILES): New variables. ++ (cgen_DEPENDENCIES): Add stamp-cgen. ++ (stamp-cgen): New rule. ++ * Makefile.in: Rebuild. ++ ++ * rtl-c.scm (enum:): Define emitter for. ++ * rtl.scm (rtx-constant?): Rename from rtx-const? and check for ++ enums as well. ++ (rtx-constant-value,rtx-enum-value): New procs. ++ (-rtx-traverse-normal): Expand enum-value to (enum enum-value). ++ (rtx-compile-time-constant?): Return #t for enums. ++ (rtx-true?,rtx-false?): Handle enums. ++ (rtx-simplify-eq-attr-mach): Use rtx-true,rtx-false instead of ++ building result by hand. ++ (rtx-simplify-eq-attr-insn): Ditto. ++ * rtx-funcs.scm (enum:,enum): New rtx functions. ++ ++ * mach.scm (): New members insns-analyzed?, semantics-analyzed?, ++ aliases-analyzed?. ++ (arch-analyze-insns!): New proc. ++ * opcodes.scm (opcodes-analyze!): Call arch-analyze-insns! instead ++ of calling ifmt-compute! directly. ++ * sid.scm (-sim-insns-analyzed?): Delete. ++ (sim-analyze!): Call arch-analyze-insns! instead of calling ++ ifmt-compute! directly. ++ * sim.scm (-sim-insns-analyzed?): Delete. ++ (sim-analyze!): Call arch-analyze-insns! instead of calling ++ ifmt-compute! directly. ++ ++ * utils.scm (string-take-with-filler): New proc. ++ (string-take): Use it. ++ ++ * pgmr-tools.scm: New file. ++ * read.scm: Load it. ++ * insn.scm (pretty-print-insn-format): Move to pgmr.scm. ++ ++ * insn.scm (insn-base-mask): Renamed from insn:mask. ++ All callers updated. ++ (insn-base-mask-length): Renamed from insn:mask-length. ++ All callers updated. ++ (insn-foo): Renamed from insn:foo. All callers updated. ++ * minsn.scm (minsn-foo): Renamed from minsn:foo. All callers updated. ++ * iformat.scm (compute-insn-base-mask-length): Renamed from ++ compute-insn-mask-length. All callers updated. ++ (compute-insn-base-mask): Renamed from compute-insn-mask. ++ All callers updated. ++ ++ * enum.scm (-enum-parse-prefix): New proc. ++ (,make!): Don't parse enum values here. ++ (-enum-parse): Do it here. Call -enum-parse-prefix. ++ (define-full-insn-enum): Ditto. ++ (enum-vals-upcase): New proc. ++ * hardware.scm (define-keyword): Make enum prefix uppercase. ++ * hobscmif.h (CHAR_LOWERP,CHAR_UPPERP,CHAR_WHITEP): New macros. ++ ++ * ifield.scm (,field-mask): Allow container to be #f. ++ (,field-extract): New method. ++ (,field-extract): New method. ++ (ifld-extract): New proc. ++ * opcodes.scm (ifld-insert-fn-name): Renamed from ifld-insert. ++ (ifld-extract-fn-name): Renamed from ifld-extract. ++ ++ * ifield.scm (ifld-new-value): Renamed from ifield-make. ++ All callers updated. ++ ++ * ifield.scm (ifld-lsb0?): New proc. ++ (sort-ifield-list): New arg up?. All callers updated. ++ * iformat.scm (compute-insn-mask): Get lsb0? flag from argument, ++ rather than global state. ++ ++1999-04-27 Doug Evans ++ ++ * insn.scm (pretty-print-insn-format): New proc. ++ ++ * Makefile.in: Rebuild. ++ * aclocal.m4: Rebuild ++ * configure: Rebuild. ++ ++Mon Apr 26 10:30:18 1999 Doug Evans ++ ++ * configure.in (AM_INIT_AUTOMAKE): Update version to 0.7.2. ++ * configure: Rebuild. ++ * aclocal.m4: Rebuild. ++ * Makefile.in: Rebuild. ++ * doc/Makefile.in: Rebuild. ++ * doc/version.texi: Rebuild. ++ ++1999-04-25 Doug Evans ++ ++ * utils.scm (bits->bools): New proc. ++ ++1999-04-23 Doug Evans ++ ++ * sid.scm (,gen-ifld-extract-decl): Fix call to ++ subfield's gen-ifld-extract-decl method. ++ ++1999-04-23 Ben Elliston ++ ++ * arm7.cpu (ldrsh-pu): Remove. ++ (do-halfword-load): New pmacro. ++ (load-halfword): Likewise. ++ (do-halfword-store): Likewise. ++ (store-halfword): Likewise. ++ (strh-*): New instructions. ++ (ldrsb-*): Likewise. ++ (ldrh-*): Likewise. ++ (ldrsh-*): Likewise. ++ ++1999-04-22 Doug Evans ++ ++ * ifield.scm (ifld-constant?): Delete special handling of RESERVED ++ fields. ++ ++ * arm7.cpu (do-word/byte-store): Fix typo. ++ ++1999-04-22 Ben Elliston ++ ++ * arm7.cpu (do-word/byte-load): Handle cases where the destination ++ register is the program counter (R15). ++ ++ * arm7.cpu (do-word/byte-store,store-word/byte): New pmacros. ++ (str-*): Implement using store-word-byte. Remove older versions. ++ (bic): Use the `inv' rtx for obtaining bitwise complements. ++ (bic-imm): Likewise. ++ (mvn): Likewise. ++ (mvn-imm): Likewise. ++ (store-indev-reg): Remove crufty pmacro. ++ (load-indiv-reg): Likewise. ++ (ldm-p): Reverse the order of register processing for decrement. ++ (stm-p): Likewise. ++ (stbi): Remove; handled by the str-* insns. ++ ++1999-04-21 Doug Evans ++ ++ * thumb.cpu (cmp): Fix carry bit computation. ++ (alu-cmp): Ditto. ++ ++1999-04-20 Doug Evans ++ ++ * arm.cpu (h-tbit): Specify set spec. ++ (h-cpsr): Ditto. ++ * arm7.cpu (bx): Don't call C routine, just set h-tbit. ++ (set-sub-flags): Interpret "carry bit" as a borrow. ++ (all sub/cmp insns): Carry bit is actually a borrow bit. ++ * thumb.cpu (bx-rs,bx-hs): Don't call C routine, just set h-tbit. ++ (add-carry,sub-carry,thumb-neg,thumb-bic,thumb-inv): Delete. Use ++ .pmacro instead. ++ (hireg-add,hireg-cmp,hireg-move): Ditto. ++ ++ * read.scm (-CGEN-VERSION): Change version to 0.7.2. ++ (-CGEN-LANG-VERSION): Ditto. ++ ++1999-04-18 Doug Evans ++ ++ * pmacros.scm (-pmacro-make): New arg `default-values', ++ all callers updated. ++ (-pmacro-default-values): New proc. ++ (-pmacro-process-keyworded-args): New proc. ++ (-pmacro-process-args): New proc. ++ (-pmacro-invoke): Process arguments before expanding macro. ++ (-pmacro-get-arg-spec,-pmacro-get-default-values): New procs. ++ (define-pmacro): Handle default values specified in arg list. ++ * rtl.scm (rtx-alu-op-mode,rtx-alu-op-arg): New procs. ++ (rtx-boolif-op-arg[01]): New procs. ++ (rtx-true,rtx-false,rtx-canonical-bool): New procs. ++ (rtx-simplify): Handle not,orif,andif. ++ * semantics.scm (-simplify-for-compilation): Simplify not,orif,andif. ++ * utils.scm (alist-copy): New proc. ++ * arm7.cpu (do-word/byte-load,load-word/byte): New pmacros. ++ (ldr*): Rewrite. ++ (swi): Explicitly set pc. ++ ++ * thumb.cpu (bx-rs,bx-hs): Reverse test for switch to arm mode. ++ ++1999-04-17 Ben Elliston ++ ++ * arm7.cpu (ldr-pu): Do not add 8 to R15; the step() method ++ correctly adjusts the program counter now. ++ ++ * arm7.cpu (f-halfword?): Rename from `f-hdt-halfword?'. ++ (f-signed?): Rename from `f-hdt-signed?'. ++ (f-offset4-hi): Rename from `h-hdt-off4-ms'. ++ (f-offset4-lo): Rename from `h-hdt-off4-ls'. ++ (f-hdt-offset8): Use new field names. ++ (ldr): Use `imm12' field, not `offset12', since we do our own ++ address arithmetic. ++ (str, str-*): Likewise. ++ (ldu-*): Remove most; better not implemented than broken. ++ (ldrh*): Likewise. ++ (ldrsh-pu): New insn. ++ (stri): Likewise. ++ (stri-p): Likewise. ++ (stbi): Likewise. ++ (ldm-p): Likewise; replace (load-indiv-reg) version. ++ ++1999-04-15 Doug Evans ++ ++ * arm.cpu (h-pc): Delete VIRTUAL attribute, get/set specs. ++ * arm7.cpu (*): Fix mode of result of arm_compute_carry_out_*. ++ (*): Explicitly specify mode in c-call. ++ (logical-op): Recognize sets of h-gr[15] as sets of pc. ++ (arith-op): Ditto. ++ (and-imm,orr-imm,xor-imm,mov-imm,bic-imm,mvn-imm): Ditto. ++ (arith-imm-op): New pmacro. ++ (add-imm,adc-imm,sub-imm,sbc-imm,rsb-imm,rsc-imm): Use it. ++ * thumb.cpu (bx-rs,bx-hs): Rewrite. ++ ++1999-04-14 Doug Evans ++ ++ * rtl.scm (rtx-simplify-eq-attr-insn): Fix call to context-error. ++ ++ * rtl.scm (rtl-find-ifields): Implement. ++ ++ * utils-gen.scm: New file. ++ * read.scm: Load it. ++ * desc.scm: Move generic attribute code to utils-gen.scm. ++ * Makefile.am (CGEN_HOB_INPUT_FILES): Add it. ++ * Makefile.in: Rebuild. ++ ++ * arm7.cpu (R15-OFFSET): New attribute. ++ (dnai): New pmacro. ++ (logical-op): Delete arg `result?'. All callers updated. Use dnai. ++ Delete use of eval-cond (dnai specifies it). Specify R15-OFFSET of 12 ++ for reg-shift version. ++ (arith-op): Ditto. ++ (data processing insns): Reorganize. Use dnai. ++ ++ * attr.scm (attr-kind): New proc. ++ (attr-list-enum-list): Rewrite. ++ (-attr-sort): Split result into two lists, bools and non-bools. ++ (current-attr-list-for): Update. ++ ++ * cgen-sid.scm (sim-arguments): Add -H -> build desc.h file. ++ * sid-cpu.scm (-gen-attr-decls): New proc. ++ (-gen-insn-attr-decls): New proc. ++ (cgen-desc.h): New proc. ++ (cgen-cpu.h): Put everything in @cpu@ namespace. ++ (gen-parallel-exec-type): Change prefix of parexec struct from ++ @cpu@ to @prefix@. ++ (-gen-trace-record-type): Ditto for trace_record struct. ++ (-gen-write-case): Update. ++ (-gen-scache-semantic-fn): Change function prefix from @cpu@ to ++ @prefix@. Update scache struct references. ++ (-gen-sem-case): Update scache struct references. ++ (-gen-sem-switch-fn): Update idesc struct reference. ++ Update insn_type enum reference. ++ (cgen-write.cxx): Update scache,argbuf references. ++ (cgen-semantics.cxx): Simplify namespace choice (always @cpu@). ++ * sid-decode.scm (IDESC-TABLE-VAR): Change prefix of insn_data ++ from @cpu@ to @prefix@. ++ (-gen-decode-insn-entry): Use gen-cpu-insn-enum. ++ (-gen-decode-expr-entry): Ditto. Change prefix of INSN_X_INVALID ++ from @CPU@ to @PREFIX@. ++ (-gen-decoder-switch): Change prefix of INSN_X_INVALID ++ from @CPU@ to @PREFIX@. ++ (-gen-decode-insn-globals): Generate insn attributes. ++ (-gen-sem-fn-name): Change function prefix from @cpu@ to @prefix@. ++ (-gen-sem-fn-decls): Use -gen-sem-fn-name. Add `using' for ++ semantic fn typedef. ++ (-gen-idesc-decls): Simplify cpu class name (always @cpu@_cpu). ++ Change prefix of scache struct from @cpu@ to @prefix@. ++ Change prefix of semantic fn typedef from @cpu@ to @prefix@. ++ Change prefix of idesc struct from @cpu@ to @prefix@. ++ Change prefix of insn_type enum from @cpu@ to @prefix@. ++ (-gen-argbuf-fields-union): Change prefix of sem_fields union ++ from @cpu@ to @prefix@. ++ (-gen-scache-decls): Change prefix of scache struct from ++ @cpu@ to @prefix@. Update idesc struct name. ++ Update decode,execute methods. ++ (-gen-extract-case): Update to type name changes. ++ (-gen-decode-fn): Ditto. ++ (cgen-decode.h): Put everything in @cpu@ namespace (except ++ semantic fn decls). Change prefix of insn_word from @cpu@ to @prefix@. ++ (cgen-decode.cxx): Add using namespace @cpu@. ++ * sid-model.scm (-gen-hw-profile-decls): Change prefix of ++ model_mark_get/set from @cpu@ to @prefix@. ++ (gen-model-unit-fn-name): Change function prefix from @cpu@ to ++ @prefix@. ++ (gen-model-fn-decls): Update idesc struct name. Change prefix ++ of model_insn_before/after from @cpu@ to @prefix@. ++ (-gen-model-insn-fn): Update scache/idesc/argbuf struct names. ++ Update insn_word type name. ++ (-gen-model-timing-table): Update INSN_TIMING struct name. ++ (-gen-model-init-fn): Update MODEL_DATA struct name. ++ (-gen-mach-defns): Update name of init_idesc_table fn. ++ (cgen-model.cxx): Add using namespace @cpu@. ++ * sid.scm (gen-cpu-class): Delete. ++ (gen-attr-type): New proc. ++ (gen-obj-attr-sid-defn): New proc. ++ (,gen-profile-code): Update name of model_mark_get/set fn. ++ (gen-cpu-insn-enum-decl): Change prefix of insn_type enum from ++ @CPU@ to @PREFIX@. ++ (gen-cpu-insn-enum): Update name of insn enum. ++ * thumb.cpu (bx-rs): Rename @cpu@_do_bx to @prefix@_do_bx. ++ (bx-hs): Ditto. ++ (swi): Rename @cpu@_swi to @prefix@_swi. ++ ++ * decode.scm (-build-decode-table-entry): Remove heuristic for ++ distinguishing insns, and use insn ifield-assertion specs. ++ ++ * desc-cpu.scm (gen-A-attr-mask): Simplify. ++ (gen-ifld-defns): Boolean attributes begin at number 0 now. ++ (gen-hw-table-defns,gen-operand-table,gen-insn-table): Ditto. ++ * opc-itab.scm (-gen-macro-insn-table): Ditto. ++ * utils-cgen.scm (gen-attr-enum-decl): Change type arg to prefix, ++ all callers updated. ++ (gen-attr-name): New proc ++ (gen-attr-mask): Use it. Boolean attributes start at 0 now. ++ (gen-obj-attr-defn): Delete num_nonbools count. ++ ++ * iformat.scm (ifmt-analyze): Handle insn-condition. ++ (ifmt-compute!): Ditto. ++ * insn.scm (): Specify default value for condition, ++ post-cond-trap,compiled-condition,compiled-semantics. ++ (,make!): New arg condition. ++ (): Add getters for condition,compiled-condition. ++ (-insn-parse): New arg condition, all callers updated. ++ (-insn-read): Recognize condition spec. ++ (define-full-insn): New arg condition. ++ * minsn.scm (minsn-make-alias): Update call to (make ...). ++ * semantics.scm (semantic-compile): Change arg sem-code to ++ sem-code-list. ++ (semantic-attrs): Ditto. ++ * sim.scm (sim-finish!): Update calls to define-full-insn. ++ * simplify.inc (define-normal-insn): Update call to define-full-insn. ++ * sid-cpu.scm (gen-semantic-code): Handle insn-condition. ++ * sid.scm (sim-finish!): Update call to define-full-insn. ++ ++Tue Apr 13 17:04:34 1999 Doug Evans ++ ++ * Makefile.am (sim-cpu): Allow specification of ISA. ++ * Makefile.in: Rebuild. ++ ++Sun Apr 11 00:37:56 1999 Jim Wilson ++ ++ * i960.cpu (sll-expr, srl-expr, sra-expr): Handle large shift counts. ++ ++1999-04-10 Doug Evans ++ ++ * sparccom.cpu (check-fp-enable): Wrap TRAP32_FP_DIS in c-code. ++ ++ * arm.cpu (gr-names): Put pc first so it gets prefered in disassembly. ++ ++ * attr.scm (atlist?): New proc. ++ (-attr-eval): Rewrite. ++ (attr-parse): New proc. ++ (atlist-parse): Use it. ++ ++ * decode.scm (exprtable-entry-make): New proc. ++ (exprtable-entry-insn,exprtable-entry-expr): New procs. ++ (exprtable-make,exprtable-insns): New procs. ++ ++ * hardware.scm (hw-mode-ok?): Delete argument `set?'. ++ All uses updated. ++ (hardware-builtin!): Make h-memory a vector. ++ ++ * iformat.scm (ifmt-ifields): Renamed from ifmt-fields. ++ All callers updated. ++ (ifmt-analyze): Use csem-* accessors on result of semantic-compile. ++ ++ * insn.scm (). Rename ifld-assertions to ifield-assertion. ++ All uses updated. ++ (-insn-parse): Set semantics to #f if not specified. ++ (define-insn,define-full-insn): Take out code that ignores ALIAS's ++ if simulator. ++ (-parse-insn-format): Recognize `=' iformat spec. ++ ++ * mach.scm (isa-min-insn-bitsize): Ignore ALIAS's. ++ (isa-max-insn-bitsize): Ditto. ++ ++ * opcodes.scm (,gen-insert): Call rtl-c instead of ++ rtl-c-with-alist. ++ (,gen-extract): Ditto. ++ (,gen-insert,gen-extract): Ditto. ++ * sid-cpu.scm (-gen-reg-access-defns): Ditto. ++ (gen-define-ifmt-ifields): New proc. ++ (gen-semantic-code): Rewrite. ++ * sid-decode.scm (-gen-decode-expr-entry): New proc. ++ (-gen-decoder-switch): Handle expression tables. ++ (-gen-extract-case): Call gen-define-ifmt-ifields instead of ++ gen-define-fields. ++ * sid-model.scm (-gen-model-insn-fn): Call gen-define-ifmt-ifields ++ instead of gen-define-fields. ++ * sid.scm (,gen-ifld-extract-decl): New arg `indent', all ++ callers updated. ++ (,gen-ifld-extract): Ditto. ++ (<*>,cxmake-get,gen-set-quiet,gen-set-trace,gen-write): Update to new ++ rtl evaluation code. ++ (op:read): Build an to pass to gen-read. ++ (op:write): Build an to pass to gen-write. ++ (op:record-profile): Build an to pass to ++ gen-record-profile. ++ * sim-cpu.scm (gen-semantic-code): Rewrite. ++ * sim.scm (-gen-ifld-extract-base): Call rtl-c instead of ++ rtl-c-with-alist. ++ (-gen-ifld-extract-beyond): Ditto. ++ (,gen-ifld-extract): Ditto. ++ (,gen-get-macro,gen-set-macro): Ditto. ++ (<*>,cxmake-get,gen-set-quiet,gen-set-trace,gen-write): Update to new ++ rtl evaluation code. ++ (op:read): Build an to pass to gen-read. ++ (op:write): Build an to pass to gen-write. ++ (op:record-profile): Build an to pass to ++ gen-record-profile. ++ ++ * operand.scm (): Give `selector' default value of #f. ++ Give `num' default value of -1. Give `cond?' default value of #f. ++ (op:new-mode): Delete arg `set?', all uses updated. ++ ++ * read.scm (reader-error): Handle #f return from port-filename. ++ (-init-parse-cpu!): Call rtl-c-init!. ++ (reader-install-builtin!): Call rtl-builtin!. ++ ++ * rtl-c.scm: New file. ++ * semantics.scm: New file. ++ * read.scm: Load them. ++ * rtl.scm: C generation moved to rtl-c.scm. Semantic analysis moved ++ to semantics.scm. ++ (): Delete members syntax?,macro,c,expr. New members ++ type,eval,num. ++ (rtx-lookup): Renamed from -rtx-func-lookup. All callers updated. ++ (-rtx-num-text,-rtx-max-num): New globals. ++ (def-rtx-operand-node,define-rtx-operand-node): New procs. ++ (-rtx-macro-lookup): New proc. ++ (rtx-lvalue-mode-name): Renamed from rtx-expr-mode-name. ++ (rtx-env-stack-empty?,rtx-env-stack-head): New procs. ++ (rtx-env-var-list,rtx-env-empty-stack,rtx-env-init-stack1): New procs. ++ (rtx-env-make,rtx-env-empty?,rtx-env-make-locals): New procs. ++ (rtx-env-push,rtx-temp-lookup,-rtx-closure-make): New procs. ++ (rtx-make,rtx-kind?,rtx-const?,rtx-const-value,rtx-symbol-name, ++ rtx-operand?,rtx-operand-obj,rtx-local?,rtx-local-obj, rtx-xop-obj, ++ rtx-index-of-value,rtx-if-mode,rtx-if-test,rtx-if-then,rtx-if-else, ++ rtx-eq-attr-owner,rtx-eq-attr-attr,rtx-eq-attr-value): New procs. ++ (rtx-pretty-name): New proc. ++ (-rtx-traverser-table,-rtx-make-traverse-table): New procs. ++ (rtx-traverse-*): Rewrite rtx traversing. ++ (rtx-eval-*): Rewrite rtx evaluation. ++ (rtx-compile): New proc. ++ (rtx-simplify): New proc. ++ (rtx-simply-eq-attr-mach,rtx-simplify-eq-attr-insn): New procs. ++ * rtx-funcs.scm: C generation moved to rtl-c.scm. ++ (ifield,index-of): Rewrite. ++ (name): Renamed from `operand:'. ++ (operand,xop,local): New rtx's. ++ (current-insn): Rewrite. ++ * Makefile.am (CGEN_HOB_INPUT_FILES): Add rtl-c.scm, semantics.scm. ++ (cgen-hob.h): Remove rule for. ++ (cgen-hob.o): Depend on cgen-hob.c only. ++ * Makefile.in: Rebuild. ++ ++ * utils-cgen.scm (vmake): New proc. ++ (): New class. ++ (context-make-prefix,context-error): New procs. ++ ++Fri Apr 9 19:26:28 1999 Jim Wilson ++ ++ * i960.cpu: Add some ??? comments. ++ (xnor, ornot): New instructions. ++ (*): Delete obsolete COND-CTI and UNCOND-CTI attributes. ++ ++1999-04-08 Doug Evans ++ ++ * cos.scm (-object-error): Print better error message. ++ ++ * pmacros.scm (-pmacro-env-make): Renamed from -env-make. ++ (-pmacro-env-ref): Renamed from -env-ref. ++ ++1999-03-31 Doug Evans ++ ++ * hardware.scm (,parse!): Allow get/set specs. ++ (h-pc): Delete. ++ (hardware-builtin!): Delete h-pc builtin. ++ * arm.cpu (h-pc): Define. ++ (h-gr): Delete get,set specs. Make array of 16 regs again. ++ * arm7.cpu (set-logical-cc-maybe): Delete. ++ (set-zn-flags,set-add-flags,set-sub-flags): New macros. ++ (data processing insns): Rewrite. ++ * m32r.cpu (h-pc): Define. ++ * fr30.cpu (h-pc): Define. ++ * i960.cpu (h-pc): Define. ++ * sparc.cpu (h-pc): Define. ++ ++ * rtl.scm (-rtx-traverse-operands): Add some error checking to LOCALS. ++ (s-parallel): Replace do {...} while (0) with {...}. ++ (s-sequence): Ditto. ++ ++ * sid-cpu.scm (gen-parallel-exec-type): Make type of `written' ++ consistent. ++ (-gen-write-case,-gen-sem-case): Ditto. ++ (-gen-sem-case): Only specify `written' if profiling or ++ parallel-write-back. ++ (-gen-scache-semantic-fn,-gen-all-semantic-fns): Put procs back in. ++ (-gen-sem-switch-fn): New proc. ++ (cgen-semantics.cxx): Emit either semantic fns or semantic switch ++ based on with-sem-switch option. ++ * sid-decode.scm (-gen-decode-insn-globals): Only define ++ idesc_table_initialized_p if with-sem-switch. Record semantic fn ++ addresses in idesc_table if !with-sem-switch. ++ (-gen-sem-fn-decls): Rewrite. ++ (-gen-idesc-decls): Define @cpu@_sem_fn type. Define `execute' ++ member based on with-sem-switch. Only define ++ `idesc_table_initialized_p' member if with-sem-switch. ++ (cgen-decode.h): If !with-sem-switch, declare semantic fns. ++ * sid.scm (-with-sem-switch?): New variable. ++ (option-init!): Initialize it. ++ (option-set!): Set it. ++ (with-sem-switch?): New proc. ++ (-op-gen-set-trace): Only emit `written' reference if profiling. ++ (sim-finish!): Use h_pc_set to set pc. ++ ++1999-03-30 Doug Evans ++ ++ * sparccom.cpu (arith-cc-binop): New args s32-set-flags,s64-set-flags. ++ All callers updated. ++ (arith-carry-cc-binop): New arg set-flags. All callers updated. ++ ++ * sid.scm (gen-argbuf-type): Delete. ++ (-gen-argbuf-fields-union): Move to ... ++ * sid-decode.scm: ... here. ++ ++ * read.scm (-reader-process-expanded-1): New proc. ++ (-reader-process-expanded): Call it to catch nested begin's. ++ (reader-process): Move `begin' handling to -reader-process-expanded. ++ ++ * insn.scm (-insn-read): Fix name of `format' spec. ++ ++ * pmacros.scm (.pmacro): New builtin. ++ (scan-symbol): If procedure macro, return macro rather than its symbol. ++ (check-macro): Don't do lookup, instead check if (car expr) is ++ macro object. ++ (scan-list): Handle .pmacro. ++ (scan): No longer re-examine text for another macro invocation. ++ (-pmacro-build-lambda): New proc. ++ (define-pmacro): Rewrite. If defining one pmacro to be an alias of ++ another, fetch the other's value (rather than doing it during ++ expansion). ++ ++1999-03-27 Doug Evans ++ ++ * Makefile.am (CGEN_HOB_INPUT_FILES): Add decode.scm. ++ * Makefile.in: Rebuild. ++ ++ * decode.scm (decode-get-best-bits): Use memq instead of element?. ++ (-fill-slot!): Simplify. ++ (-build-slots): Simplify. ++ ++ * dev.scm (load-sid): Don't load sid-arch.scm. ++ ++ * sid-decode.scm: Replace computed goto decoder/extractor with plain ++ switch's. ++ * sim-decode.scm: Replace computed goto decoder/extractor with plain ++ switch's. ++ ++1999-03-26 Doug Evans ++ ++ * sim-decode.scm: Clean up pass. Move decoder computation into ... ++ * decode.scm: ... here. New file. ++ * sid-decode.scm: Use decoder computation code in decode.scm. ++ * read.scm: Load decode.scm. ++ ++ * arm.cpu (arm710 model): Add u-exec function unit. ++ (h-gr): Delete CACHE-ADDR for now. Make array of 15, not 16 regs. ++ Add get/set specs to redirect reg 15 to h-pc. ++ (h-*): Indicate for both ARM and THUMB isas. ++ (cbit,nbit,vbit,zbit): Ditto. ++ (h-ibit,h-fbit,h-tbit,h-mbits): New hardware elements. ++ (h-cpsr): Make virtual. Add get/set specs. ++ (h-spsr-fiq,h-spsr-svc,h-spsr-abt,h-spsr-irq,h-spsr-und): New hw. ++ (h-spsr): New virtual reg. ++ * arm7.cpu (shift-type): New explicitly defined keyword. ++ (h-operand2-shifttype): Use it. ++ (set-logical-cc-maybe): Delete carry-out arg. New args arg1,arg2. ++ All callers updated. Don't set cbit. ++ (logical-op): Add rm to ifield list. Change case to case:. Use ++ shift-type enum as case choices. Set cbit. ++ (and,orr,eor,add-imm): Uncomment out. ++ (undefined): Temporarily comment out. ++ * thumb.scm (mov,cmp,addi8,subi8,str-sprel,ldr-sprel): s/rd/bit10-rd/. ++ (lda-pc,lda-sp): Ditto. ++ (ldr-pc): Rename from ldr. ++ (cbranch): Mark insns as being thumb insns. ++ ++ * attr.scm (,parse-value): Recognize strings. ++ ++ * cgen-sid.scm: Don't load sid-arch.scm. ++ (sim-arguments): Delete unused entries. ++ * sid-arch.scm: Delete. ++ ++ * insn.scm (,iflds): Renamed from flds. All uses updated. ++ (,ifld-assertions): New member. ++ (,make!): New arg ifld-assertions, all callers updated. ++ ( accessors): Change insn:foo to insn-foo. All callers updated. ++ (insn:fields): Delete. ++ (-insn-parse): New arg ifld-assertions. All callers updated. ++ (-insn-read,define-insn): New procs. ++ (define-full-insn): New arg ifld-assertions. All callers updated. ++ (insn-init!): New comment define-insn. ++ ++ * model.scm (-model-parse): Ensure at least one unit specified. ++ ++ * rtl.scm (-rtx-traverse-operands): Recognize environments. ++ (,get-name): New method. ++ (-rtx-make-current-closure,s-closure): New proc. ++ (hw:): Wrap rtx indices in a closure. ++ (-gen-case-prefix): New proc. ++ (s-case): Simplify. ++ * rtx-funcs.scm (case:): Fix call to s-case. ++ (closure): New rtx func. ++ ++ * hardware.scm (): New member isas-cache. ++ (,get-isas): New method. ++ (hardware-builtin): Indicate for all isas. ++ * ifield.scm (-ifield-parse): Only keep if isa+mach are kept. ++ * mach.scm (current-arch-mach-name-list): Return list of names. ++ (current-isa-mach-name-list): Ditto. ++ (define-arch): Install builtin objects here. ++ * read.scm (keep-atlist?): Only keep if both mach and isa are ++ being kept. ++ (keep-mach-atlist?): New proc. ++ (keep-isa-multiple?,current-keep-isa-name-list): New proc. ++ (reader-install-builtin!): Renamed from -install-builtin!. ++ * sid-cpu.scm (-gen-reg-access-defns): Renamed from ++ -gen-cpu-reg-access-defns. Rewrite. ++ (gen-reg-access-defn): Delete. ++ (-gen-hardware-struct): New proc. ++ (-gen-hardware-types): Simplify. Add multiple-isa support. ++ (gen-semantic-fn,-gen-all-semantics): Delete. ++ (-gen-read-args,-gen-read-case,-gen-read-switch): Delete. ++ (cgen-cpu.c,cgen-read.c,cgen-sem-switch.c,cgen-mainloop.in): Delete. ++ (cgen-write.cxx,cgen-semantics.cxx,cgen-decode.cxx): Renamed from *.c. ++ Call sem-analyze-insns!. ++ (cgen-semantics.cxx): Add multiple-isa support. ++ * sid-decode.c (-gen-idesc-decls): Add multiple-isa support. ++ (-gen-scache-decls,-gen-decode-fn): Ditto. ++ (cgen-decode.h): Call sem-analyze-insns!. ++ * sid-model.scm (cgen-model.cxx): Renamed from cgen-model.c. ++ * sid.scm (-with-multiple-isa?): New variable. ++ (option-init!): Initialize it. ++ (option-set!): Set it. ++ (with-multiple-isa?): New proc. ++ (gen-cpu-ref): New arg isas. All callers updated. ++ (gen-cpu-class): New proc. ++ (*-get-macro,*-set-macro): Delete. ++ (gen-reg-get-fun-name,gen-reg-set-fun-name): New procs. ++ (-hw-gen-fun-get): Call gen-reg-get-fun-name. ++ (-hw-gen-fun-set): Call gen-reg-set-fun-name. ++ (-gen-hw-index): Call rtx-c instead of rtx-c-with-temps for rtxs. ++ (-sim-insns-analyzed): New global variable. ++ (sim-init!): Reset it. ++ (sim-analyze-insns!): New proc. ++ (sim-analyze!): Don't do instruction analysis here. ++ (sim-finish!): Specify isa of x-invalid insn. ++ * sim.scm (sim-finish!): Specify isa of added x-* virtual insns. ++ ++1999-03-22 Doug Evans ++ ++ * thumb.cpu (cpu,mach,model): Delete. ++ (dntf): New pmacro. Use it for all field definitions. ++ (dntop): New pmacro. Use it for all operand definitions. ++ (asr): Correct field list. ++ (add,addi,sub,subi,add-sp,add-sp-neg): Ditto. ++ ++ * utils-cgen.scm (define-getters): New macro to simplify ++ writing class accessors. ++ (define-setters): Ditto. ++ (sanitize): Recognize isa elements. ++ ++ * sid-cpu.scm (*): Replace cpu:parallel-exec? call with ++ state-parallel-exec?. ++ * sid-model.scm (*): Ditto. ++ * sid-decode.scm (*): Ditto. Replace cpu:decode-assist with ++ state-decode-assist. ++ ++ * sid-decode.scm (decode-bits): Replace list-reverse! with reverse!. ++ (-gen-decode-switch): Rewrite to not generate deeply nested lists. ++ * sim-decode.scm (-gen-decode-switch): Ditto. ++ ++ * sim-arch.scm (-regs-for-access-fns): Delete. ++ (-biggest-reg-mode,-gen-arch-reg-access-decls): Delete. ++ (-gen-arch-reg-access-defns): Delete. ++ ++ * sim-cpu.scm (*): Replace cpu:liw-insns with state-liw-insns, ++ cpu:parallel-insns with state-parallel-insns, cpu:parallel-exec? ++ with state-parallel=exec?. ++ (cgen-*): Call sim-analyze-insns! here. ++ * sim-decode.scm (cgen-*): Ditto. ++ * sim-model.scm (cgen-*): Ditto. ++ * sim.scm (-sim-insns-analyzed): New global variable. ++ (sim-init!): Reset it. ++ (sim-analyze-insns!): Renamed from sim-analyze!. Keep track if we've ++ already done the analysis. ++ ++ * sim-model.scm (-gen-mach-defns): Add mach attribute number to ++ MACH struct. ++ ++ * arm.cpu: Only include arm7.cpu,thumb.cpu if necessary. ++ (arm arch): Update isa spec. ++ (arm,thumb isas): Define. ++ (arm7 cpu): default-insn-bitsize,base-insn-bitsize moved to isas. ++ (arm7tdmi mach): Add isa spec. ++ * arm7.cpu (*): Replace subreg: with subword:. Remove unnecessary ++ `const' on word number. ++ * fr30.cpu (fr30 arch): Update isa spec. ++ (fr30 isa): Define. ++ (fr30bf cpu): default-insn-bitsize,base-insn-bitsize,decode-assist, ++ moved to isa spec. ++ * i960.cpu (i960 arch): Update isa spec. ++ (i960 isa): Define. ++ (i960base cpu): default-insn-bitsize,base-insn-bitsize,decode-assist, ++ liw-insns,parallel-insns moved to isas spec. ++ * m32r.cpu (m32r arch): Update isas spec. ++ (m32r isa): Define. ++ (m32rbf cpu): default-insn-bitsize,base-insn-bitsize,decode-assist, ++ liw-insns,parallel-insns moved to isa spec. ++ * sparc.cpu (sparc arch): Update isas spec. ++ (sparc isa): Define. ++ * sparc32.cpu (sparc32 cpu): default-insn-bitsize,base-insn-bitsize, ++ decode-assist moved to isa spec. ++ * sparc64.cpu (sparc64 cpu): Ditto. ++ * sparccom.cpu (trap insns): Correct mode of result of c-call:. ++ * desc-cpu.scm (-gen-isa-table-defns): New proc. ++ (-gen-mach-table-defns): Output mach table. ++ (-gen-hash-defines): Delete insn size macros, except for ++ CGEN_MAX_INSN_SIZE. ++ (-cgen-cpu-open): Rewrite cpu_open handling. Take stdarg list of args. ++ (cgen-desc.h): Define MAX_ISAS. ++ (cgen-desc.c): Include stdarg.h. Call -gen-isa-table-defns. ++ * mach.scm (): Rename arch-data to data. New member isa-list. ++ (arch-* accessors): Renamed from arch:*. All callers updated. ++ (current-arch-isa-name-list): New proc. ++ (-arch-parse-isas): Renamed from -arch-parse-isa. ++ (def-isa-attr!): Rewrite. ++ (